2013-07-12 6 views
6

Ho eseguito una regressione multipla con diversi predittori continui, alcuni dei quali risultano significativi, e mi piacerebbe creare un grafico a dispersione o dispersione del mio DV rispetto a uno dei predittori, inclusa una "linea di regressione". Come posso fare questo?Tracciare la "linea di regressione" dalla regressione multipla in R

mio trama assomiglia a questo

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

Se fosse semplice regressione, potrei aggiungere una linea di regressione in questo modo:

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

Ma il mio modello reale è come questo:

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

Vorrei aggiungere una linea di regressione che rifletta il coefficiente e l'intercetta dall'attuale modello invece di quello semplificato. Penso che sarei felice di assumere valori medi per tutti gli altri predittori al fine di farlo, anche se sono pronto ad ascoltare i consigli del contrario.

Questo potrebbe non fare alcuna differenza, ma accennerò nel caso, la situazione è complicata leggermente dal fatto che probabilmente non voglio tracciare i dati originali. Invece, mi piacerebbe per tracciare valori medi del DV per i valori con categorizzazione del predittore, in questo modo:

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) 

Solo perché capita di guardare molto più pulito per il mio dati quando lo faccio in questo modo.

+1

Non è possibile tracciare un grafico con un predittore singolo senza specificare i valori (statici) di tutti gli altri predittori per quel grafico. Puoi chiarire cosa vuoi visualizzare? –

+0

Chiarimento aggiunto, grazie. Immagino che tenderei ad andare assumendo che tutti gli altri predittori assumano i loro valori medi. – baixiwei

risposta

4

È necessario creare un vettore di valori x nel dominio della trama e prevedere i valori y corrispondenti dal modello. Per fare ciò, è necessario iniettare questo vettore in un dataframe composto da variabili che corrispondono a quelle del modello. Hai affermato che stai bene mantenendo le altre variabili fissate ai loro valori medi, quindi ho usato questo approccio nella mia soluzione. Indipendentemente dal fatto che i valori x che stai pronosticando siano effettivamente legali dato gli altri valori nella tua trama dovrebbe probabilmente essere qualcosa che consideri quando lo imposti.

Senza dati di esempio Non posso essere sicuro che questo funzionerà esattamente per te, quindi mi scuso se ci sono dei bug qui sotto, ma questo dovrebbe almeno illustrare l'approccio.

# 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

Grazie! L'approccio ha funzionato, tranne che ho dovuto usare "newdata" invece di "data" all'interno di "prevedere". – baixiwei

+0

E a volte dice: Avviso in termplot (mymodel): 'modello' sembra implicare interazioni: vedere la pagina di aiuto e traccia solo una delle linee – skan

2

sguardo alla funzione Predict.Plot nel pacchetto TeachingDemos per un'opzione per tracciare un predittore contro la risposta ad un dato valore degli altri predittori.

6

Per tracciare i singoli termini in un modello lineare o generalizzata lineare (cioè, in forma con lm o glm), utilizzare termplot. Non è necessario il binning o altre manipolazioni.

# 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

Ciao. Ho provato termplot e ne traccia ciascuno in una trama diversa.Come posso ottenere tutto nello stesso grafico? – skan