我尝试使用Statsmodels模块将以下代码从R转换为Python:
model <- glm(goals ~ att + def + home - (1), data=df, family=poisson, weights=weight)
我使用pandas得到了一个类似的数据框(名为df),目前在Python中有以下行(版本3.4,如果它有所不同):
model = sm.Poisson.from_formula("goals ~ att + def + home - 1", df).fit()
或者,使用GLM:
smf.glm("goals ~ att + def + home - 1", df, family=sm.families.Poisson()).fit()
但是,我无法让加权条款起作用。数据框中的每条记录都有一个日期,我希望更新近的记录对于拟合模型比对旧记录更有价值。我没有看到它被使用的例子,但是如果它可以在R中完成,它可以在Statsmodels上完成......对吗?
答案 0 :(得分:0)
我遇到了同样的问题。 有一个解决方法应该导致相同的结果。以对数刻度(np.log(权重))添加权重,作为beta等于1(偏移选项)的解释变量之一。 我可以看到曝光的选项与我上面解释的相同。
答案 1 :(得分:0)
2018-05-01T00:00:00.000Z
,但遗憾的是freq_weights
要使用它,请在创建GLM时传递freq_weights:
sm.Poisson
答案 2 :(得分:0)
为泊松回归设置权重有两种解决方案。第一种是在 MarkWPiper 提到的 GLM 函数中使用 freq_weigths
。第二种是使用泊松回归并将权重传递给 exposure
。如所记录的 here:“Log(exposure) 被添加到系数等于 1 的线性预测中。”这与 Yaron 提到的数学技巧相同,尽管该参数具有不同的原始含义。示例代码如下:
import statsmodels.api as sm
# or: from statsmodels.discrete.discrete_model import Poisson
fitted = sm.Poisson.from_formula("goals ~ att + def + home - 1", data=df, exposure=df['weight']).fit()