如何阻止 patsy 创建分类变量的冗余交互
How to stop patsy from creating redundant interactions of categorical variables
我正在使用 patsy 使用公式 api.
来拟合统计模型的回归
我的问题是我的设计矩阵是单一的,因为 patsy 创建(本地?)分类的冗余交互。
import patsy
import pandas as pd
data = [('y',[2,5,6]),
('c1',['a','a','b']),
('c2',['g','f','g'])]
df = pd.DataFrame.from_items(data)#([y,c1,c2],columns=['y','c1','c2'])
formula = "y ~C(c1):C(c2)-1"
y,X = patsy.dmatrices(formula,df,return_type='dataframe')
print (X)
C(c1)[a]:C(c2)[f] C(c1)[b]:C(c2)[f] C(c1)[a]:C(c2)[g] C(c1)[b]:C(c2)[g]
0 0.0 0.0 1.0 0.0
1 1.0 0.0 0.0 0.0
2 0.0 0.0 0.0 1.0
我想排除第二列,因为 c1
没有值 b
而 c2
具有值 f
Patsy 将 C(c1):C(c2)
解释为 "I want to estimate the effect of every combination of c1
and c2
values"。如果其中一些组合没有出现在你的数据中,那么它们就无法估计,所以给你一个奇异矩阵至少指出了问题......
如果您只想估计现有组合的效果,一种简单的方法是创建一个新变量,该变量对 c1
和 c2
的每种组合采用不同的值。这样做的原因是 patsy 然后会推断出可能值的集合正是实际出现的值——它无法知道 b.f
可能已经发生:
In [1]: df["c1_and_c2"] = df["c1"] + "." + df["c2"]
In [2]: patsy.dmatrix("c1_and_c2 - 1", df)
Out[2]:
DesignMatrix with shape (3, 3)
c1_and_c2[a.f] c1_and_c2[a.g] c1_and_c2[b.g]
0 1 0
1 0 0
0 0 1
Terms:
'c1_and_c2' (columns 0:3)
我正在使用 patsy 使用公式 api.
来拟合统计模型的回归我的问题是我的设计矩阵是单一的,因为 patsy 创建(本地?)分类的冗余交互。
import patsy
import pandas as pd
data = [('y',[2,5,6]),
('c1',['a','a','b']),
('c2',['g','f','g'])]
df = pd.DataFrame.from_items(data)#([y,c1,c2],columns=['y','c1','c2'])
formula = "y ~C(c1):C(c2)-1"
y,X = patsy.dmatrices(formula,df,return_type='dataframe')
print (X)
C(c1)[a]:C(c2)[f] C(c1)[b]:C(c2)[f] C(c1)[a]:C(c2)[g] C(c1)[b]:C(c2)[g]
0 0.0 0.0 1.0 0.0
1 1.0 0.0 0.0 0.0
2 0.0 0.0 0.0 1.0
我想排除第二列,因为 c1
没有值 b
而 c2
具有值 f
Patsy 将 C(c1):C(c2)
解释为 "I want to estimate the effect of every combination of c1
and c2
values"。如果其中一些组合没有出现在你的数据中,那么它们就无法估计,所以给你一个奇异矩阵至少指出了问题......
如果您只想估计现有组合的效果,一种简单的方法是创建一个新变量,该变量对 c1
和 c2
的每种组合采用不同的值。这样做的原因是 patsy 然后会推断出可能值的集合正是实际出现的值——它无法知道 b.f
可能已经发生:
In [1]: df["c1_and_c2"] = df["c1"] + "." + df["c2"]
In [2]: patsy.dmatrix("c1_and_c2 - 1", df)
Out[2]:
DesignMatrix with shape (3, 3)
c1_and_c2[a.f] c1_and_c2[a.g] c1_and_c2[b.g]
0 1 0
1 0 0
0 0 1
Terms:
'c1_and_c2' (columns 0:3)