Wyjście prognozy regresji logistycznej

14

Utworzyłem regresję logistyczną przy użyciu następującego kodu:

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)

Następnie wykorzystałem dane wyjściowe do stworzenia ostatecznego modelu:

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)

Następnie przewidziałem wyniki dla innego zestawu danych za pomocą funkcji przewidywania:

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

Byłem w stanie użyć ustalenia przyjemnej krzywej ROC i stworzyłem tabelę, aby ustalić czułość i swoistość, która daje mi odpowiedzi, których oczekiwałbym.

Jednak staram się ustalić dla każdego wiersza danych, jakie jest prawdopodobieństwo, że Ft_45 wynosi 1. Jeśli spojrzę na dane wyjściowe log.pred.fv, otrzymuję na przykład:

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

Ponieważ tylko niepewnie rozumiem, co robię, staram się zrozumieć, jak interpretować wartości ujemne i wyższe niż 1, ponieważ spodziewałbym się, że prawdopodobieństwo będzie wynosić od 0 do 1.

Więc moje pytanie brzmi: po prostu brakuje mi kroku, w którym muszę przekształcić dane wyjściowe, czy też całkowicie się pomyliłem. Z góry dziękuję za wszelką pomoc, którą możesz zaoferować.

SeBee
źródło

Odpowiedzi:

23

Po pierwsze, wygląda na to, że zbudowałeś regularny model regresji liniowej, a nie model regresji logistycznej. Aby zbudować model regresji logistycznej, trzeba korzystać glm()ze family="binomial" nie lm().

x1,x2x3y

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

β0,β1,β2β3

Jeśli to zrobisz predict(logit), R obliczy i wróci b0 + b1*x1 + b2*x2 + b3*x3.

y=log(p1p)=β0+β1x1+β2x2+β3x3

p

W R możesz zrobić coś takiego:

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
Ben F.
źródło
Dziękuję bardzo, po pierwsze za poprawienie mojego kodu, a po drugie za wyjaśnienie, w jaki sposób uzyskać prawdopodobieństwa w R. Dałem mu szansę i działa idealnie. Chciałbym zapytać tygodnie temu !!
SeBee
2
Może być skrócony za pomocą probs <- exp(predict(logit, type = "response" , newdata=data)co najmniej `probs <- 1 / (1 + exp (-pred))
snoram
11

Patrząc na dokumentację predict.glm, wydaje się to tak proste, jak użycie dodatkowego parametru w predictwywołaniu:

 type = "response"

Zobacz dokumentację:

typ - wymagany typ prognozy. Domyślnie jest to skala predyktorów liniowych; alternatywna „odpowiedź” jest w skali zmiennej odpowiedzi. Zatem dla domyślnego modelu dwumianowego domyślnymi przewidywaniami są iloraz szans (prawdopodobieństwa w skali logit), a typ = „odpowiedź” daje przewidywane prawdopodobieństwa. Opcja „warunki” zwraca macierz podającą dopasowane wartości każdego terminu we wzorze modelu na liniowej skali predykcyjnej. Wartość tego argumentu można skrócić

Bulat
źródło