1

当我有一个带有混淆列的欠约束系统时,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
4

0 回答 0