Почему predict.glm() не создает прогнозируемые значения ожидаемым образом?

#r #glm

#r #glm

Вопрос:

Я пытаюсь разобраться в том, что функция predict.glm () делает для проекта на работе, который ее использует.

Чтобы сделать это, я сначала посмотрел на пример кода, найденный в документации для ?predict.glm(). Это дало мне ощущение, что он может использовать glm и предсказывать значения ответа для данного входного вектора. Однако мне было очень сложно настроить этот пример «budworm». Итак, я создал исключительно простую собственную модель, чтобы попробовать и посмотреть, как это работает. Спойлер — я все еще не могу заставить его работать.

 a<-c(1,2,3,4,5)
b<-c(2,3,4,5,6)
result<-glm(b~a,family=gaussian)
summary(result)
plot(c(0,10), c(0,10), type = "n", xlab = "dose",
     ylab = "response")
xvals<-seq(0,10,0.1)
data.frame(xinputs=xvals)
predict.glm(object=result,newdata= data.frame(xinputs=xvals),type='terms')
#lines(xvals, predict.glm(object=result,newdata = xvals, type="response" ))
  

При запуске predict.glm(object=result,newdata= data.frame(xinputs=xvals),type='terms') я получаю сообщение об ошибке:

 Warning message:
'newdata' had 101 rows but variables found have 5 rows
  

Насколько я понимаю, не должно иметь значения, что входной GLM использовал только 5 строк… он должен использовать статистику этого GLM для прогнозирования значений ответа для каждой из 101 записи новых данных?

Ответ №1:

Имена столбцов во newdata фрейме данных должны совпадать с именами столбцов из данных, которые вы использовали для соответствия модели. Таким образом,

 predict.glm(object=result,newdata= data.frame(a=xvals),type='terms')
  

решит вашу проблему.

 a <- c(1, 2, 3, 4, 5)
b <- c(2, 3, 4, 5, 6)
result <- glm(b ~ a, family = gaussian)
summary(result)
#> 
#> Call:
#> glm(formula = b ~ a, family = gaussian)
#> 
#> Deviance Residuals: 
#>          1           2           3           4           5  
#> -1.776e-15  -8.882e-16  -8.882e-16   0.000e 00   0.000e 00  
#> 
#> Coefficients:
#>              Estimate Std. Error   t value Pr(>|t|)    
#> (Intercept) 1.000e 00  1.317e-15 7.591e 14   <2e-16 ***
#> a           1.000e 00  3.972e-16 2.518e 15   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for gaussian family taken to be 1.577722e-30)
#> 
#>     Null deviance: 1.0000e 01  on 4  degrees of freedom
#> Residual deviance: 4.7332e-30  on 3  degrees of freedom
#> AIC: -325.47
#> 
#> Number of Fisher Scoring iterations: 1
plot(c(0, 10),
     c(0, 10),
     type = "n",
     xlab = "dose",
     ylab = "response")
  

 xvals <- seq(0, 10, 0.1)
head(data.frame(xinputs = xvals))
#>   xinputs
#> 1     0.0
#> 2     0.1
#> 3     0.2
#> 4     0.3
#> 5     0.4
#> 6     0.5
head(predict.glm(object = result,
            newdata = data.frame(a = xvals),
            type = 'terms'))
#>      a
#> 1 -3.0
#> 2 -2.9
#> 3 -2.8
#> 4 -2.7
#> 5 -2.6
#> 6 -2.5
  

Создано 2020-09-15 пакетом reprex (версия 0.3.0)