如何在Python statsmodels中设置area和gender为固定系数偏移项?
把area和gender设为固定系数变量的两种实现方法
之前你用offset没成功,大概率是没搞对它的用法——offset不是直接传原始变量,而是要传已经乘以固定系数的变量组合。下面给你两种靠谱的实现方式:
方法1:用offset参数(适合已知固定系数的场景)
如果已经确定了area和gender的固定系数,比如area系数是0.3,gender系数是-0.1,先把这俩变量乘上对应系数再加起来,得到偏移项,再传入模型:
# 先计算固定系数的线性组合 offset_term = 0.3 * df['area'] + (-0.1) * df['gender'] # 拟合模型时,公式里去掉area和gender,加上offset参数 poly_2 = glm( formula='observed ~ agecat + veh_value + I(veh_value ** 2.0) + veh_age', data=df, family=sm.families.Tweedie(), offset=offset_term ).fit()
这样模型的线性预测式就变成:log(μ) = 截距 + agecat系数*agecat + veh_value系数*veh_value + 二次项系数*veh_value² + veh_age系数*veh_age + 0.3*area -0.1*gender
这里0.3和-0.1是你固定死的系数,模型不会再去估计它们。
方法2:用约束拟合(适合想把变量留在公式里的场景)
如果你希望把area和gender留在公式里,但强制它们的系数等于固定值,可以用fit_constrained方法,步骤如下:
# 先定义好完整的模型结构(不用先拟合) model = glm( formula='observed ~ agecat + veh_value + I(veh_value ** 2.0) + veh_age + area + gender', data=df, family=sm.families.Tweedie() ) # 写约束条件:比如指定area系数=0.3,gender系数=-0.1 constraints = ['area = 0.3', 'gender = -0.1'] # 拟合带约束的模型 poly_2_constrained = model.fit_constrained(constraints)
这种方法会在拟合时强制area和gender的系数等于你设定的值,其他参数正常估计,而且结果里能直接看到这些固定系数的变量。
额外提醒
如果area和gender是分类变量(比如字符串类型的类别),statsmodels会自动把它们转成虚拟变量,这时候约束条件里的参数名要对应虚拟变量的名字,比如area[T.urban] = 0.2,你可以先拟合一次无约束模型,看参数列表里的名字再写约束。
内容的提问来源于stack exchange,提问作者bzzz
相关产品推荐
相关产品推荐

