手动更改GLM系数后如何在R中使用预测函数

时间:2018-10-08 20:19:04

标签: r modeling glm coefficients

我正在创建带有多个变量的GLM模型。获得输出后,我将使用GLM预测新值。

我已经注意到,在手动更改分类变量级别之一的GLM系数后,即使我知道某些数据具有此级别,我仍然获得相同的预测值。一些代码可能有助于解释我的过程:

##data frame
df <-data.frame(Account =c("A","B","C","D","E","F","G","H"), 
       Exposure = c(1,50,67,85,250,25,22,89),
       JudicialOrientation=c("Neutral","Neutral","Plaintiff","Defense","Plaintiff","Neutral","Plaintiff","Defense"),
       Freq= c(.008,.5,.05,.34,.7,0,.04,.12),
       Losses = c(100000,100,2500,100000,25000,0,7500,5200),
       LossPerUnit = c(100000,100,2500,100000,25000,0,7500,5200)/c(1,50,67,85,250,25,22,89))


##Variables for modeling
ModelingVars <- as.formula(df$LossPerUnit~df$JudicialOrientation+df$Freq)

##Tweedie GLM
Model <- glm(ModelingVars, family=tweedie(var.power=1.5, link.power = 0),
             weight = Exposure, data = df)
summary(Model)

##Predict Losses with Model coefficients
df$PredictedLossPerUnit <- predict(Model,df, type="response")


##Manually edit a coefficient for one of my categorical variable's levels
Model$coefficients["df$JudicialOrientationNeutral"] <-log(50)

##Predict Losses again to compare
df$PredictedLossPerUnit2 <- predict(Model, df, type ="response")


sum(df$PredictedLossPerUnit)
sum(df$PredictedLossPerUnit2)
View(head(df))
summary(Model)

此代码可以正常工作,并且两个PredictedLossPerUnits具有不同的数字(如果该行的观察值为“ JudicialOrientationNeutral”)。当我在主数据集上执行类似的操作时,它具有更多的变量但以相似的方式(一些连续的,一些离散的具有多个面元),即使在操纵系数后,我仍会为我的预测函数获得相同的预测值。

即使在我手动更改GLM中的系数之后,有什么奇怪的事情会导致我的预测函数继续提供与原始函数相同的结果吗?

编辑:我找到了答案。在其他数据集中,我正在做:      df $ PredictedLossPerUnit <-预测(Model,data = df,type =“ response”)

data实际上不是预测函数的参数,它应该是“ newdata”。一个愚蠢的错误,但一个很好的教训。感谢所有的帮助。

2 个答案:

答案 0 :(得分:2)

您使用公式的方式与df对象分离了含义,或者混淆了predict.lm something 的逻辑。如果改用公式创建的方式(不使用数据对象名称的引用(因此仅使用列名称))运行公式,则会获得所需的效果:

 ModelingVars <- as.formula(LossPerUnit~JudicialOrientation+Freq)

#----------

> df$PredictedLossPerUnit <- predict(Model,df, type="response")
> 
> 
> ##Manually edit a coefficient for one of my categorical variable's levels
> Model$coefficients["JudicialOrientationNeutral"] <-log(50)
> 
> ##Predict Losses again to compare
> df$PredictedLossPerUnit2 <- predict(Model, df, type ="response")
> 
> df
  Account Exposure JudicialOrientation  Freq Losses  LossPerUnit PredictedLossPerUnit PredictedLossPerUnit2
1       A        1             Neutral 0.008 100000 100000.00000           1549.56677           40213.38196
2       B       50             Neutral 0.500    100      2.00000            919.41825           23860.16405
3       C       67           Plaintiff 0.050   2500     37.31343            169.99221             169.99221
4       D       85             Defense 0.340 100000   1176.47059            565.49150             565.49150
5       E      250           Plaintiff 0.700  25000    100.00000             85.29641              85.29641
6       F       25             Neutral 0.000      0      0.00000           1562.77490           40556.15105
7       G       22           Plaintiff 0.040   7500    340.90909            171.80535             171.80535
8       H       89             Defense 0.120   5200     58.42697            714.15870             714.15870

我通常尝试在屏幕上显示基本资料,但是在这里您需要滚动查看两列中的“中性”项是否不同。

编辑:我将公式的创建留在了外面,因为它的变化最少,但是更好的策略是只使用您的公式,而无需使用“ as.formula”包装,这是不必要的,而且是将具有不同的环境以供以后评估。首次运行:模型<-glm(LossPerUnit〜JudicialOrientation + Freq,家庭= tweedie(变量功率= 1.5,链接功率= 0),权重=暴露,数据= df),然后进行系数暴力。

答案 1 :(得分:1)

我找到了答案。在我的其他数据集中,我正在做:

df$PredictedLossPerUnit <- predict(Model,data=df, type="response")

“数据”实际上不是预测函数的函数参数,应该是“ newdata”。一个愚蠢的错误,但一个很好的教训。感谢所有的帮助。