2013-07-12 12 views
6

Przeprowadziłem regresję wielokrotną z kilkoma ciągłymi predyktorami, z których kilka wyszło znaczącym, i chciałbym utworzyć wykres rozproszenia lub rozproszenia mojego DV przeciwko jeden predyktorów, w tym "linia regresji". Jak mogę to zrobić?Wykreśl "linię regresji" z wielokrotnej regresji w R

Moja działka wygląda to

D = my.data; plot(D$probCategorySame, D$posttestScore) 

Jeśli to były proste regresji, mogę dodać linię regresji takiego:

lmSimple <- lm(posttestScore ~ probCategorySame, data=D) 
abline(lmSimple) 

Ale mój rzeczywisty model jest tak:

lmMultiple <- lm(posttestScore ~ pretestScore + probCategorySame + probDataRelated + practiceAccuracy + practiceNumTrials, data=D) 

Chciałbym dodać linię regresji, która odzwierciedla współczynnik i przechwycić od rzeczywistego model zamiast uproszczonego. Myślę, że byłbym szczęśliwy, przyjmując średnie wartości dla wszystkich innych predyktorów, aby to zrobić, chociaż jestem gotów usłyszeć rady, że jest inaczej.

To może nie mieć znaczenia, ale wspomnę na wszelki wypadek, sytuacja jest nieco skomplikowana przez fakt, że prawdopodobnie nie będę chciał wykreślić oryginalnych danych. Zamiast tego chciałbym wykreślić średnie wartości DV dla binned wartości predyktora, tak:

D[,'probCSBinned'] = cut(my.data$probCategorySame, as.numeric(seq(0,1,0.04)), include.lowest=TRUE, right=FALSE, labels=FALSE) 
D = aggregate(posttestScore~probCSBinned, data=D, FUN=mean) 
plot(D$probCSBinned, D$posttestScore) 

Tylko dlatego, że dzieje się wyglądać znacznie czystsze do moich danych, gdy robię to w ten sposób.

+1

Nie można drukować na jednym predyktorze bez określenia (statycznych) wartości wszystkich pozostałych predyktorów dla tego wykresu. Czy możesz wyjaśnić, co chcesz wyświetlić? –

+0

Dodano wyjaśnienie, dzięki. Sądzę, że miałbym skłonność do założenia, że ​​wszystkie inne predyktory przyjmują swoje średnie wartości. – baixiwei

Odpowiedz

4

Musisz utworzyć wektor wartości x w domenie działki i przewidzieć odpowiednie wartości y z modelu. Aby to zrobić, należy wstrzyknąć ten wektor do ramki danych zawierającej zmienne pasujące do tych w modelu. Oświadczyłeś, że jesteś w porządku z utrzymywaniem innych zmiennych na swoich średnich wartościach, więc użyłem tego podejścia w moim rozwiązaniu. To, czy wartości x, które przewidujesz, są w rzeczywistości legalne, biorąc pod uwagę inne wartości na wykresie, prawdopodobnie powinny być czymś, co rozważasz przy ustawianiu tego.

Bez przykładowych danych nie mogę być pewien, że to zadziała dokładnie dla ciebie, więc przepraszam, jeśli są jakieś błędy poniżej, ale to powinno przynajmniej zilustrować podejście.

# Setup 
xmin = 0; xmax=10 # domain of your plot 
D = my.data 
plot(D$probCategorySame, D$posttestScore, xlim=c(xmin,xmax)) 
lmMultiple <- lm(posttestScore ~ pretestScore + probCategorySame + probDataRelated + practiceAccuracy + practiceNumTrials, data=D) 

# create a dummy dataframe where all variables = their mean value for each record 
# except the variable we want to plot, which will vary incrementally over the 
# domain of the plot. We need this object to get the predicted values we 
# want to plot. 
N=1e4 
means = colMeans(D) 
dummyDF = t(as.data.frame(means)) 
for(i in 2:N){dummyDF=rbind(dummyDF,means)} # There's probably a more elegant way to do this. 
xv=seq(xmin,xmax, length.out=N) 
dummyDF$probCSBinned = xv 
# if this gives you a warning about "Coercing LHS to list," use bracket syntax: 
#dummyDF[,k] = xv # where k is the column index of the variable `posttestScore` 

# Getting and plotting predictions over our dummy data. 
yv=predict(lmMultiple, newdata=subset(dummyDF, select=c(-posttestScore))) 
lines(xv, yv) 
+0

Dzięki! Podejście zadziałało, ale musiałem użyć "newdata" zamiast "danych" w "predict". – baixiwei

+0

A czasami mówi: Ostrzeżenie w termplot (mymodel): "model" wydaje się dotyczyć interakcji: zobacz stronę pomocy i to tylko kreśli jedną z linii Hello: – skan

2

Spójrz na funkcji w pakiecie TeachingDemos dla jednej opcji Predict.Plot wykreślić jedną predyktorem porównaniu z odpowiedzią na danej wartości pozostałych predyktorów.

6

Aby wykreślić poszczególne terminy w liniowym lub uogólnionym modelu liniowym (tj. Pasuje do lm lub glm), należy użyć termplot. Nie ma potrzeby binowania ani innej manipulacji.

# plot everything on one page 
par(mfrow=c(2,3)) 
termplot(lmMultiple) 

# plot individual term 
par(mfrow=c(1,1)) 
termplot(lmMultiple, terms="preTestScore") 
+2

. Próbowałem już termplot i rysuje każdy w innym wątku.Jak w sumie mogę się znaleźć w tej samej grafice? – skan