当我有一个带有混淆列的欠约束系统时,lm
在 R 中会忽略许多第二和第三因素交互(对我来说这似乎是正确的行为),但 statsmodels(在 Python 中)会在所有混淆列之间拆分值。
想象一下,我有以下数据:
a b c y
--------------------
-1 -1 1 4
1 -1 -1 30
-1 1 -1 6
1 1 1 4
在 R 中使用lm('y ~ a * b * c')
给了我以下系数:
- 一、11
- 乙,6
- c, -6
- 拦截,11
我可以'y ~ a + b + c'
在 statsmodels 中得到它,但是产品版本通过 2+ 因子交互来拆分系数。(a 与 b:c,b 与 a:c,c 与 a:b,并与 a:b:c 截取。)
加法而不是乘法不适用于更复杂的情况,其中 R 发现了一些重要的两因素相互作用,但没有给出其他任何东西。
在这种情况下,如何使 statsmodels 像 R 一样工作?或者我该如何设置它以获得体面的结果?
一个 MWE:
import pandas as pd
import pyDOE
import statsmodels.formula.api as smf
water_frac = pd.DataFrame(pyDOE.fracfact("a b ab"), columns=["A", "B", "C"])
water_frac["y"] = [4, 30, 6, 4]
当你这样做时:
smf.ols(formula="y ~ A+B+C", data=water_frac).fit().params
你得到:
Intercept 11.0
A 6.0
B -6.0
C -7.0
dtype: float64
虽然这样:
smf.ols(formula="y ~ A*B*C", data=water_frac).fit().params
给出:
Intercept 5.5
A 3.0
B -3.0
A:B -3.5
C -3.5
A:C -3.0
B:C 3.0
A:B:C 5.5
dtype: float64