Как использовать функцию Predict в R после ручного изменения коэффициентов GLM - PullRequest
0 голосов
/ 08 октября 2018

Я создаю модель 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 <- Foregnate (модель, данные = DF, тип = «ответ»)».Глупая ошибка, но хороший урок.Спасибо всем, что помогло. </p>

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Я нашел ответ.В моем другом наборе данных, который я делал:

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

«данные» на самом деле не являются аргументом функции для функции предсказания, это должны были быть «новые данные».Глупая ошибка, но хороший урок.Спасибо за все, что помогло.

0 голосов
/ 08 октября 2018

Вы используете формулу таким образом, чтобы отделить смысл от объекта df или запутать логику predict.lm или что-то .Если вместо этого вы запустите создание формулы так, как это было задумано (без ссылки на имя объекта данных (поэтому используются только имена столбцов), вы получите желаемый эффект:

 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», которая не нужна, и в ней будет другая среда для последующей оценки. Первый запуск: Model <- glm (LossPerUnit~ JudicialOrientation + Freq, семья = твиди (var.power = 1.5, link.power = 0), вес = экспозиция, данные = df), а затем выполните свой коэффициент насилия. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...