2012-07-01 11 views
5

Sono nuovo a R e sto solo imparando le funzioni apply e come funzionano. Voglio semplicemente estrarre i coefficienti da un valore lm adattandoli a una variabile x per colore e marchio del prodotto per diversi anni.Applicazione per funzione a lm()

So che posso creare un ciclo for e impostare i dati per anno modello e adattarlo, ma penso che il suo tempo inizi a utilizzare più funzioni incorporate, quindi voglio essere in grado di farlo con la funzione o una delle funzioni di applicazione. Ecco cosa stavo pensando.

#some made up data 

x<-rnorm(50,13400,1200) 
color<-sample(factor(c("Red","Black","Blue","Green","White")),50,replace=T) 
year<-sample(factor(2006:2012),50,replace=T) 
brand<-sample(factor(c("A","B","C","D")),50,replace=T) 

d<-data.frame(x,color,year,brand) 

#now I want to fit the model lm(x~color+brand) for each year level 
#this is what I was thinking... 

tmp<-with(d,by(x,year,function(y) lm(x~color,data=y))) 
sapply(tmp,coef) 

Error in eval (predvars, dati, env): numerico 'amb' arg non di lunghezza

sto basando questa via l'exapmle R ha dato quando sono entrato help(by)

+0

si stia mescolando per diversi paradigmi per la creazione di ambienti:. Il 'with'-paradigma e le' data = Inoltre, la variabile d $ x aveva 50 valori distinti, quindi avresti passato i dati a riga singola a lm(). Sembra che mplourde sia stato in grado di discernere il tuo intento, quindi eliminerò questo commento un po 'dopo di te accetta la sua risposta –

+0

ti suggerisco ma per "marchio" solo ... e tienilo semplice ... forse poi capirò come funziona – moldovean

risposta

5

Prova a modificare:

tmp <- by(d, year, function(d.subset) lm(x~color, data=d.subset)) 
+1

Penso che potresti essere in grado di accorciarlo a 'by (d, year, lm, formula = x ~ color) 'dato che se' formula' è fornita 'lm' corrisponderà all'argomento che viene dato posizionalmente a il prossimo argomento non specificato, ad esempio 'data' ... –

5

Oltre a fare questo con base R funz gli ioni (che è una buona idea per imparare come funzionano) vale la pena guardare a chi potrebbe aver lavorato su questo prima. Adattare i modelli lineari a ciascun sottoinsieme di un set di dati è qualcosa che viene fuori un mucchio e risulta che le persone hanno creato alcuni strumenti utili appositamente per questo.

Prova a guardare il pacchetto lme4 e la funzione lmList. Dall'esempio in ?lmList,

(fm1 <- lmList(Reaction ~ Days | Subject, sleepstudy)) 

che si adatta al modello lineare Reaction ~ Days separatamente per ciascun Subject. Questo è conveient perché i metodi di aspirazione lavorano direttamente sul fm1:

> coef(fm1) 
    (Intercept)  Days 
308 244.1927 21.764702 
309 205.0549 2.261785 
310 203.4842 6.114899 
330 289.6851 3.008073 
331 285.7390 5.266019 
332 264.2516 9.566768 
333 275.0191 9.142045 
334 240.1629 12.253141 
335 263.0347 -2.881034 
337 290.1041 19.025974 
349 215.1118 13.493933 
350 225.8346 19.504017 
351 261.1470 6.433498 
352 276.3721 13.566549 
369 254.9681 11.348109 
370 210.4491 18.056151 
371 253.6360 9.188445 
372 267.0448 11.298073 

(i numeri di riga sono i valori id per la Subjects) Vedi il file di aiuto in ?lmList per vedere quali altri metodi sono disponibili per le cose come gli intervalli di confidenza, tracciando , ecc.

+1

In aggiunta ai commenti di joran: a) si potrebbe anche usare lmList nel pacchetto nlme, che ha una documentazione molto migliore; b) usare lmList o molti lm su sottoinsiemi in generale non è una buona idea.Usa il potere di lme/lmer e tratta l'anno come un effetto casuale o fisso (usa nls in quel caso). –

+0

Correzione di quanto sopra: l'ultima frase dovrebbe essere "usa gls in quel caso" –

1

Questo è molto più semplice in pacchetti più moderni, ad es. data.table:

library(data.table) 
setDT(d) 
d[ , .(reg = list(lm(x ~ color))), by = year] 
# year reg 
# 1: 2012 <lm> 
# 2: 2006 <lm> 
# 3: 2011 <lm> 
# 4: 2008 <lm> 
# 5: 2007 <lm> 
# 6: 2010 <lm> 
# 7: 2009 <lm> 

La colonna reg ha lm oggetti; nota abbiamo bisogno di avvolgere lm in list(.) modo che data.table non confonde la lista pianura (si noti che è is.list(lm(x ~ color, data = d))TRUE

Problemi correlati