Вывод прогноза логистической регрессии

14

Я создал логистическую регрессию, используя следующий код:

full.model.f = lm(Ft_45 ~ ., LOG_D)
base.model.f = lm(Ft_45 ~ IP_util_E2pl_m02_flg)
step(base.model.f, scope=list(upper=full.model.f, lower=~1),
     direction="forward", trace=FALSE)

Затем я использовал выходные данные для создания окончательной модели:

final.model.f = lm(Ft_45 ~ IP_util_E2pl_m02_flg + IP_util_E2_m02_flg + 
                           AE_NumVisit1_flg + OP_NumVisit1_m01_flg + IP_TotLoS_m02 + 
                           Ft1_45 + IP_util_E1_m05_flg + IP_TotPrNonElecLoS_m02 + 
                           IP_util_E2pl_m03_flg + LTC_coding + OP_NumVisit0105_m03_flg +
                           OP_NumVisit11pl_m03_flg + AE_ArrAmb_m02_flg)

Затем я предсказал результаты для другого набора данных с помощью функции предикторов:

log.pred.f.v <- predict(final.model.f, newdata=LOG_V)

Я смог установить приятную кривую ROC и создал таблицу для определения чувствительности и специфичности, которая дает мне ответы, которые я ожидаю.

Однако то, что я пытаюсь сделать, это установить для каждой строки данных, какова вероятность того, что Ft_45 равен 1. Если я посмотрю на вывод log.pred.fv, я получу, например,:

1 -0.171739593    
2 -0.049905948    
3 0.141146419    
4 0.11615669    
5 0.07342591    
6 0.093054334    
7 0.957164383    
8 0.098415639    
.
.
.
104 0.196368229    
105 1.045208447    
106 1.05499112

Поскольку у меня есть только предварительное представление о том, что я делаю, я изо всех сил пытаюсь понять, как интерпретировать отрицательные и более высокие значения, чем 1, так как я ожидаю, что вероятность будет между 0 и 1.

Поэтому мой вопрос: я просто пропустил шаг, на котором мне нужно преобразовать вывод, или я ошибся. Заранее благодарю за любую помощь, которую вы можете предложить.

SeBee
источник

Ответы:

23

Во-первых, похоже, что вы построили модель регулярной линейной регрессии, а не модель логистической регрессии. Чтобы построить модель логистической регрессии, вам нужно использовать glm()с family="binomial" , а не lm().

Икс1,Икс2Икс3Y

logit <- glm(y~x1+x2+x3,family="binomial")

β0,β1,β2β3

Если вы это сделаете predict(logit), R рассчитает и вернет b0 + b1*x1 + b2*x2 + b3*x3.

Yзнак равноLограмм(п1-п)знак равноβ0+β1Икс1+β2Икс2+β3Икс3

п

В R вы можете сделать что-то вроде этого:

pred <- predict(logit,newdata=data) #gives you b0 + b1x1 + b2x2 + b3x3
probs <- exp(pred)/(1+exp(pred)) #gives you probability that y=1 for each observation
Бен Ф
источник
Большое спасибо, во-первых, за исправление моего кода и, во-вторых, за объяснение того, как получить вероятности в R. Я попробовал, и он отлично работает. Я хотел бы спросить несколько недель назад!
SeBee
1
Можно сделать короче с помощью probs <- exp(predict(logit, type = "response" , newdata=data)или, по крайней мере, `пробников <- 1 / (1 + exp (-pred))
snoram
11

Глядя на документацию predict.glm, кажется, что это так же просто, как использование дополнительного параметра в predictвызове:

 type = "response"

Смотрите документацию:

тип - тип требуемого прогноза. По умолчанию используется шкала линейных предикторов; альтернативный «ответ» находится в масштабе переменной ответа. Таким образом, для биномиальной модели по умолчанию предсказания по умолчанию имеют лог-шансы (вероятности в логит-масштабе), а type = "response" дает предсказанные вероятности. Опция «термины» возвращает матрицу, в которой указаны значения каждого члена в формуле модели в линейной шкале предикторов. Значение этого аргумента может быть сокращено

Булат
источник