Python 如何阻止patsy创建分类变量的冗余交互

Python 如何阻止patsy创建分类变量的冗余交互,python,patsy,Python,Patsy,我正在使用patsy使用公式api来拟合statsmodels的回归 我的问题是,我的设计矩阵是单数的,因为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',

我正在使用patsy使用公式api来拟合statsmodels的回归

我的问题是,我的设计矩阵是单数的,因为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)
解释为“我想估计
c1
c2
值的每个组合的效果”。如果其中一些组合没有出现在您的数据中,那么它们就无法估计,所以给您一个奇异矩阵至少可以指出问题所在

如果您只想估计现有组合的影响,一种简单的方法是为
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将
C(c1):C(c2)
解释为“我想估计
c1
c2
值的每种组合的效果”。如果其中一些组合没有出现在您的数据中,那么它们就无法估计,所以给您一个奇异矩阵至少可以指出问题所在

如果您只想估计现有组合的影响,一种简单的方法是为
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)