Python R与Statsmodels中的混淆列-Statsmodels在所有别名中拆分值
当我有一个带有混淆列的欠约束系统时,R中的Python R与Statsmodels中的混淆列-Statsmodels在所有别名中拆分值,python,r,statsmodels,experimental-design,pydoe,Python,R,Statsmodels,Experimental Design,Pydoe,当我有一个带有混淆列的欠约束系统时,R中的lm忽略了许多第二和第三因素的交互作用(在我看来这是正确的行为),但是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')可以得到以下系数: a、
lm
忽略了许多第二和第三因素的交互作用(在我看来这是正确的行为),但是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')
可以得到以下系数:
- a、 十一,
- b、 六,
- c、 -6
- 拦截,11
'y~a+b+c'
来实现这一点,但产品版本将系数分解为2+因子相互作用。(a带b:c,b带a:c,c带a:b,截取带a:b:c)
与乘法相反,加法不适用于更复杂的乘法,其中R发现了一些重要的双因素相互作用,但没有给出任何其他结果
在这种情况下,如何使statsmodels像R一样工作?或者我如何设置它以获得一个合适的结果
A 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
STATSOLS模型默认使用广义逆,而不是自动删除列。例如,见谢谢。我在评论中要求澄清。statsmodels OLS默认使用广义逆,而不是自动删除列。例如,见谢谢。我在评论中要求澄清。