GLM中R风格公式**语法实现三次幂失效,是否为Bug?
问题解答
这并不是Bug,而是statsmodels公式语法的规则导致的差异:
在statsmodels的公式语法中,
**运算符有特殊含义,并非直接表示数学上的幂运算:- 用于变量之间时,
a**b表示包含a、b以及它们的交互项a:b; - 用于单个变量后接数字(如
workhours**3),它会被解析为生成该变量的所有低阶到指定阶数的多项式项,而非单独的三次项。由于你已经显式写了workhours,重复项会被自动剔除,最终并没有加入预期的单独三次项。
- 用于变量之间时,
np.power(workhours, 3)是直接调用numpy的幂运算函数,statsmodels会将其作为数值计算处理,生成单独的workhours三次项,因此model2能成功纳入。
如果要在公式中用**实现单独三次项,需要用I()包裹来强制进行数学运算,写法如下:
model1 = glm(formula="wage ~ workhours + I(workhours**3) + C(gender)", data=df, family=sm.families.Gaussian())
内容的提问来源于stack exchange,提问作者Xtiaan
相关产品推荐
相关产品推荐

