2012-07-02 11 views
5

Chciałbym narysować wyniki wieloczynnikowej analizy regresji logistycznej (GLM) dla określonych zmienionych niezależnych zmiennych (tj. Niezależnie od czynników zakłócających zawartych w modelu) relacji z wynik (binarny).Przedstaw wyniki wielowymiarowego modelu regresji logistycznej w R

Widziałem posty, które polecają następującą metodę, używając polecenia predict, a następnie curve, oto przykład;

x  <- data.frame(binary.outcome, cont.exposure) 
model <- glm(binary.outcome ~ cont.exposure, family=binomial, data=x) 
plot(cont.exposure, binary.outcome, xlab="Temperature",ylab="Probability of Response") 
curve(predict(model, data.frame(cont.exposure=x), type="resp"), add=TRUE, col="red") 

Jednak wydaje się, że nie działa to w przypadku wielowymiarowych modeli regresji. Pojawi się następujący błąd, gdy dodaję "wiek" (arbitralny - może być dowolną zmienną o tej samej długości) jako zmienną zakłócającą;

> x  <- data.frame(binary.outcome, cont.exposure, age) 
> model <- glm(binary.outcome ~ cont.exposure + age, family=binomial, data=x) 
> plot(cont.exposure, binary.outcome, xlab="Temperature",ylab="Probability of Response") 
> curve(predict(model, data.frame(cont.exposure=x), type="resp"), add=TRUE, col="red") 
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
    variable lengths differ (found for 'age') 
In addition: Warning message: 
    'newdata' had 101 rows but variable(s) found have 698 rows 

Powyższy model jest uproszczoną wersją modeli Chciałbym biegać, ale zasada jest taka sama; Chciałbym wykreślić związek między zmienną wyniku binarnego a ciągłą ekspozycją, niezależnie od czynników zakłócających..

Byłoby wspaniale, aby uzyskać obejście tego problemu, lub alternatywny sposób obejrzenia relacji, która mnie interesuje. Wielkie dzięki.

+0

Można przyjrzeć się funkcji '' crPlots' w pakiecie car'. – BenBarnes

+0

@BenBarnes dzięki za to. Miałem wygląd i szybką grę z danymi, a funkcja nie rozpoznaje, że robię regresje logistyczne. Jednak jeśli użyję regresji liniowej (tj. .my exposure jest teraz moim wynikiem, moja zmienna binarna jest zmienną niezależną), to otrzymam dokładnie to, co chcę. Czy zamieścisz to jako odpowiedź, którą powinienem zaakceptować, czy też powinienem? – Luke

+0

Zamierzam ułagodzić odpowiedź Thierry'ego! – BenBarnes

Odpowiedz

7
set.seed(12345) 
dataset <- expand.grid(Temp = rnorm(30), Age = runif(10)) 
dataset$Truth <- with(dataset, plogis(2 * Temp - 3 * Age)) 
dataset$Sample <- rbinom(nrow(dataset), size = 1, prob = dataset$Truth) 
model <- glm(Sample ~ Temp + Age, data = dataset, family = binomial) 
newdata <- expand.grid(
    Temp = pretty(dataset$Temp, 20), 
    Age = pretty(dataset$Age, 5)) 
newdata$Sample <- predict(model, newdata = newdata, type = "response") 
library(ggplot2) 
ggplot(newdata, aes(x = Temp, y = Sample)) + geom_line() + facet_wrap(~Age) 

enter image description here

ggplot(newdata, aes(x = Temp, y = Sample, colour = Age, group = Age)) + 
    geom_line() 

enter image description here

+1

Dzięki za odpowiedź - powinienem był podać w moim pytaniu, ale w moim przykładzie dostarczyłem uproszczony model. W rzeczywistości istnieją liczne zmienne zakłócające (niektóre z nich są ciągłe, inne czynniki) i chciałbym wizualizować związek między moim wynikiem (binarnym) a ekspozycją (ciągłą), niezależnie od innych zmiennych, które włączam do modelu. Czy wiesz, czy ggplot może to zrobić? Jeszcze raz dziękuję – Luke

+0

@BenBarnes zapewnia dobrą metodę robienia tego z ciągłymi wynikami; poprzez regresję liniową z moją zmienną binarną jako ekspozycję mogę uzyskać ładną fabułę, ale nie jest to oryginalna struktura logistyczna, z której korzystałem, więc alternatywa byłaby również świetna. – Luke

+0

@LukeTheDuke: w takim przypadku ustaw zakres wartości dla współzmiennych i napraw wszystkie pozostałe zmienne na odpowiednim poziomie. – Thierry

Powiązane problemy