私はstatsmodels.formula.api.wls
statsmodels formulas API (patsy から) を使用して WLS ( ) モデルを構築しており、因子間の相互作用を使用しています。これらの中には予測可能なものもあれば、そうでないものもあります。手動で設計マトリックスを作成することなく、相互作用のサブセットのみをモデルに含める方法はありますか?
あるいは、モデル変数のサブセットの推定係数がゼロになるように制約する方法はありますか?
私はstatsmodels.formula.api.wls
statsmodels formulas API (patsy から) を使用して WLS ( ) モデルを構築しており、因子間の相互作用を使用しています。これらの中には予測可能なものもあれば、そうでないものもあります。手動で設計マトリックスを作成することなく、相互作用のサブセットのみをモデルに含める方法はありますか?
あるいは、モデル変数のサブセットの推定係数がゼロになるように制約する方法はありますか?
「相互作用のサブセット」とはどういう意味かわかりません。あなたが意味するかもしれない1つのことは次のような式です
y ~ pred1 + pred2 + pred3 + pred1:pred3 + pred1:pred2
または同等のもの
y ~ pred1*pred2*pred3 - pred2:pred3
後者は、可能な相互作用の一部を含めていることを明らかにしますが、すべてではありません(省略しましたpred2:pred3
)。
しかし、これは簡単にできるので、実際の意味は、単一の相互作用に関連する係数のサブセットを含めたいと思いますか?もしそうなら、いいえ、それは現在実装されているものではありません。統計的な観点からもかなり疑わしいです。ランダムな列を省略し始めると、他のすべての列の解釈を非常に解釈しにくい方法で変更します。また、必要な部分的な相互作用を記述するための適切な実装可能な構文を実際に考えることはできません...その後、patsyで機能要求を自由に提出できる場合。
また、statsmodelsにそのような制限されたモデルを適合させる方法が含まれているとは思いません。それは良い機能リクエストになるでしょう。
必要なものを正確に理解しているかどうかはわかりませんが、本当に優れたペースト状のドキュメントから始めることをお勧めします (patsy は statsmodels の数式を処理します)。カテゴリ データに関する優れたセクションがあります: http://patsy.readthedocs.org/en/latest/index.html
私の推測では、1 回の数式呼び出しで目的を達成するのは難しいでしょう。おそらく patsy を使用して、必要以上の項を含む計画行列を作成し、列を削除するだけです。例えば:
In [28]: import statsmodels.formula.api as sm
In [29]: import pandas as pd
In [30]: import numpy as np
In [31]: import patsy
In [32]: url = "http://vincentarelbundock.github.com/Rdatasets/csv/HistData/Guerry.csv"
In [33]: df = pd.read_csv(url)
In [34]: w = np.ones(df.shape[0])
In [35]: f = 'Lottery ~ Wealth : C(Region)'
In [36]: y,X = patsy.dmatrices(f, df, return_type='dataframe')
In [37]: X.head()
Out[37]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 4
Data columns:
Intercept 5 non-null values
Wealth:C(Region)[nan] 5 non-null values
Wealth:C(Region)[C] 5 non-null values
Wealth:C(Region)[E] 5 non-null values
Wealth:C(Region)[N] 5 non-null values
Wealth:C(Region)[S] 5 non-null values
Wealth:C(Region)[W] 5 non-null values
dtypes: float64(7)
In [38]: X = X.ix[:,[2,3,4]]
In [39]: X.head()
Out[39]:
Wealth:C(Region)[C] Wealth:C(Region)[E] Wealth:C(Region)[N]
0 0 73 0
1 0 0 22
2 61 0 0
3 0 76 0
4 0 83 0
In [40]: mod = sm.WLS(y, X, 1./w).fit()
In [41]: mod.params
Out[41]:
Wealth:C(Region)[C] 1.084430
Wealth:C(Region)[E] 0.650396
Wealth:C(Region)[N] 1.021582