我正在创建带有多个变量的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”。一个愚蠢的错误,但一个很好的教训。感谢所有的帮助。
答案 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”。一个愚蠢的错误,但一个很好的教训。感谢所有的帮助。