2012-07-01 18 views
5

Soy nuevo en R y estoy aprendiendo sobre las funciones apply y cómo funcionan. Simplemente quiero extraer los coeficientes de un ajuste de lm en una variable x por color de producto y marca a lo largo de varios años.Aplicar por función a lm()

Sé que puedo crear un bucle forzado y subconjunto de los datos por año modelo y ajustarlos, pero creo que es hora de que empiece a usar más funciones integradas, por lo que quiero poder hacerlo con la función por o una de las funciones de aplicar. Esto es lo que estaba 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 en eval (predvars, datos, env): numérico 'AMBIENTALIZ' arg no de una longitud de

estoy basando esto de la exapmle R dio cuando entré help(by)

+0

Usted está mezclando a diferentes paradigmas para la creación de ambientes:. El 'with'-paradigma y los datos' = 'paradigma.Además, la variable d $ x tenía 50 valores distintos, por lo que habría estado pasando marcos de datos de una sola línea a lm(). Parece que mplourde fue capaz de discernir su intención, por lo que voy a eliminar este comentario en un momento después acepta su respuesta –

+0

te lo sugiero pero solo por "marca" ... y mantenlo simple ... quizás entienda cómo funciona – moldovean

Respuesta

5

Tal vez puedas probar:

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

Creo que puedes acortar esto a 'por (d, año, lm, fórmula = x ~ color) 'ya que si se suministra' formula' 'lm' coincidirá con el argumento que se le da posicionalmente a el siguiente argumento no especificado, es decir, 'datos' ... –

5

Además de hacer esto con base de R func iones (que es una buena idea para aprender cómo funcionan) también vale la pena ver quién trabajó en esto antes. Ajustar los modelos lineales a cada subconjunto de un conjunto de datos es algo que viene a ser un montón, y resulta que las personas han creado algunas herramientas convenientes específicamente para esto.

Intente mirar el paquete lme4 y la función lmList. A partir del ejemplo en ?lmList,

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

que encaja el modelo lineal Reaction ~ Days por separado para cada Subject. Esta es conveient porque los métodos de extracción trabajan directamente en 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 

(los números de fila son los valores de ID para el Subjects) Consulte el archivo de ayuda en ?lmList para ver qué otros métodos están disponibles para cosas como los intervalos de confianza, el trazado , etc.

+1

Además de los comentarios de joran: a) también podría usar lmList en el paquete nlme, que tiene una documentación mucho mejor; b) usar lmList o muchos lm en subconjuntos en general no es una buena idea.Use el poder de lme/lmer y trate el año como un efecto aleatorio o fijo (use nls en ese caso). –

+0

Corrección de lo anterior: la última oración debe decir "use gls en ese caso" –

1

Esto es mucho más fácil en paquetes más modernos, por ejemplo 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 columna reg tiene lm objetos; en cuenta que necesitamos para envolver lm en list(.) de manera que no se confunde data.table la lista normal (tenga en cuenta que is.list(lm(x ~ color, data = d)) es TRUE

Cuestiones relacionadas