Как остановить patsy от создания избыточных взаимодействий категориальных переменных

Я использую 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


person Artturi Björk    schedule 22.11.2017    source источник


Ответы (1)


Пэтси интерпретирует 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)
person Nathaniel J. Smith    schedule 23.11.2017