1. ホーム
  2. python

[解決済み】dmatricesにカラムが表示されない

2022-02-08 18:28:50

質問

dfのRegion列にはW,E,N,S,Cの5つの変数がありますが、結果のデータフレームにはW,E,N,Sとintercept列だけがあります。

import statsmodels.api as sm
from patsy import dmatrices
df = sm.datasets.get_rdataset('Guerry','HistData').data
vars = ['Department','Lottery','Literacy','Wealth','Region']
df = df[vars]
df = df.dropna()
#      Department  Lottery  Literacy  Wealth Region
# 0           Ain       41        37      73      E
# 1         Aisne       38        51      22      N
# 2        Allier       66        13      61      C
# 3  Basses-Alpes       80        46      76      E
# 4  Hautes-Alpes       79        69      83      E

y, X = dmatrices('Lottery ~ Literacy + Wealth + Region', data=df, return_type='dataframe')
print(X.columns.tolist())
# ['Intercept', 'Region[T.E]', 'Region[T.N]', 'Region[T.S]', 'Region[T.W]', 'Literacy', 'Wealth']

最後の行を以下のように変更すると、正常に動作し、5つのリージョン値が表示されます。 のデータフレームが表示されます。

y, X = dmatrices('Literacy + Wealth + Region ~ Lottery', data=df, return_type='dataframe')
print(y.columns.tolist())
# ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth']

また、Region Cではなく、最初のコードに作成されたInterceptカラムは何ですか?

解決方法は?

パッツィー 自動的に定数「Intercept」項が追加される の右辺に の式で使用されます。 これにより、切片の列がすべて1である設計マトリックスとなる。 例えば

import pandas as pd
import patsy

data = patsy.demo_data("a", "b", "y")
#     a   b         y
# 0  a1  b1  1.764052
# 1  a1  b2  0.400157
# 2  a2  b1  0.978738
# 3  a2  b2  2.240893
# 4  a1  b1  1.867558
# 5  a1  b2 -0.977278
# 6  a2  b1  0.950088
# 7  a2  b2 -0.151357

mat = patsy.dmatrices("y ~ a + b ", data, return_type='dataframe')[1]
print(mat)

収量

   Intercept  a[T.a2]  b[T.b2]
0        1.0      0.0      0.0
1        1.0      0.0      1.0
2        1.0      1.0      0.0
3        1.0      1.0      1.0
4        1.0      0.0      0.0
5        1.0      0.0      1.0
6        1.0      1.0      0.0
7        1.0      1.0      1.0

パッツィは式の両端の式を解析し を追加するだけです。 項が必要な場合 に必要な柔軟性を持たせるために モデルです。 デザインマトリックスで言えば、新しい列は追加されないということです。 が追加されない限り、その列によってスパンされるベクトル空間は拡張されません。 新しい列は 言い換えれば、新しい列はすでに他の列のスパンに入っている。 他の列は冗長になるため、追加されない。

W、E、N、S、Cのいずれかと等しくなければならないカテゴリー変数があるとき、変数の値がW、E、N、Sでないことを知っていることは、その変数がCと等しいことを知っていることと同じである。

先ほどの例の出力を見てみましょう。このとき a 変数 は a2 は、それがイコールであることを知っていることと同じです。 a1. デザイン面では を含めても列のスペースは増えません。 a1 の列があります。 {コード {コード は Intercept - a2. (以下は a1

a1

a[T.a1]


a2

   Intercept  a[T.a2]  b[T.b2]  a[T.a1]
0        1.0      0.0      0.0      1.0
1        1.0      0.0      1.0      1.0
2        1.0      1.0      0.0      0.0
3        1.0      1.0      1.0      0.0
4        1.0      0.0      0.0      1.0
5        1.0      0.0      1.0      1.0
6        1.0      1.0      0.0      0.0
7        1.0      1.0      1.0      0.0

import statsmodels.api as sm from patsy import dmatrices df = sm.datasets.get_rdataset('Guerry','HistData').data vars_ = ['Department','Lottery','Literacy','Wealth','Region'] df = df[vars_] df = df.dropna() formula1 = 'Lottery ~ Literacy + Wealth + Region' print(formula1) y1, X1 = dmatrices(formula1, data=df, return_type='dataframe') print('LHS: {}'.format(y1.columns.tolist())) # ['Lottery'], print('RHS: {}'.format(X1.columns.tolist())) # ['Intercept', 'Region[T.E]', 'Region[T.N]', 'Region[T.S]', 'Region[T.W]', 'Literacy', 'Wealth'] formula2 = 'Literacy + Wealth + Region ~ Lottery' print(formula2) y2, X2 = dmatrices(formula2, data=df, return_type='dataframe') print('LHS: {}'.format(y2.columns.tolist())) # ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth'] print('RHS: {}'.format(X2.columns.tolist())) # ['Intercept', 'Lottery']


Intercept

+ 0

- 1

formula3 = 'Lottery ~ Literacy + Wealth + Region + 0'
print(formula3)
y1, X1 = dmatrices(formula3, data=df, return_type='dataframe')
print('LHS: {}'.format(y1.columns.tolist()))
print('RHS: {}'.format(X1.columns.tolist()))