Saya menggunakan patsy untuk menyesuaikan regresi dengan statsmodels menggunakan rumus api.

Masalah saya adalah matriks desain saya tunggal karena patsy menciptakan interaksi kategorikal yang berlebihan (secara lokal?).

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

Saya ingin mengecualikan kolom kedua karena c1 tidak memiliki nilai b ketika c2 memiliki nilai f

0
Artturi Björk 23 November 2017, 00:57

1 menjawab

Jawaban Terbaik

Patsy menafsirkan C(c1):C(c2) sebagai makna "Saya ingin memperkirakan efek dari setiap kombinasi nilai c1 dan c2". Jika beberapa dari kombinasi tersebut tidak muncul dalam data Anda, maka kombinasi tersebut tidak dapat diperkirakan, jadi memberi Anda matriks tunggal setidaknya menunjukkan masalahnya...

Jika Anda ingin memperkirakan efek hanya untuk kombinasi yang ada, salah satu cara mudah adalah membuat variabel baru yang mengambil nilai berbeda untuk setiap kombinasi c1 dan c2. Alasan mengapa ini berhasil adalah karena patsy kemudian akan menyimpulkan bahwa kumpulan nilai yang mungkin persis sama dengan yang benar-benar muncul -- tidak ada cara untuk mengetahui bahwa b.f dapat terjadi:

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)
2
Nathaniel J. Smith 28 November 2017, 21:26