Quiero hacer una regresión lineal en R usando la lm()
función. Mis datos son una serie de tiempo anual con un campo por año (22 años) y otro por estado (50 estados). Quiero ajustar una regresión para cada estado de modo que al final tenga un vector de respuestas lm. Puedo imaginarme haciendo el ciclo for para cada estado, luego haciendo la regresión dentro del ciclo y agregando los resultados de cada regresión a un vector. Sin embargo, eso no parece muy parecido a R. En SAS haría una declaración 'por' y en SQL haría un 'grupo por'. ¿Cuál es la forma R de hacer esto?
r
regression
linear-regression
lm
JD Long
fuente
fuente
aggregate
no es correcto ; tampoco lo estapply
.Respuestas:
Aquí hay una forma de usar el
lme4
paquete.fuente
Aquí hay un enfoque usando el paquete plyr :
fuente
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
y luegol_ply(models, plot)
obtiene cada uno de los gráficos de residuos también. ¿Es posible etiquetar cada una de las parcelas con el grupo (por ejemplo, "estado" en este caso)?Desde 2009,
dplyr
se ha lanzado, lo que en realidad proporciona una forma muy agradable de hacer este tipo de agrupación, muy similar a lo que hace SAS.Para recuperar los coeficientes y Rsquared / p.value, se puede usar el
broom
paquete. Este paquete proporciona:fuente
rowwise(fitted_models) %>% tidy(model)
para que el paquete de escobas funcionara, pero por lo demás, una gran respuesta.d %>% group_by(state) %>% do(model = lm(response ~ year, data = .)) %>% rowwise() %>% tidy(model)
d %>% group_by(state) %>% do(model=lm(response ~year, data = .)) %>% rowwise() %>% tidy(model) Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) : Calling var(x) on a factor x is defunct. Use something like 'all(duplicated(x)[-1L])' to test for a constant vector. In addition: Warning messages: 1: Data frame tidiers are deprecated and will be removed in an upcoming release of broom. ...
En mi opinión, un modelo lineal mixto es un mejor enfoque para este tipo de datos. El código a continuación da en el efecto fijo la tendencia general. Los efectos aleatorios indican cómo la tendencia de cada estado individual difiere de la tendencia global. La estructura de correlación tiene en cuenta la autocorrelación temporal. Eche un vistazo a Pinheiro & Bates (modelos de efectos mixtos en S y S-Plus).
fuente
Se
data.table
publicó una buena solución aquí en CrossValidated por @Zach. Solo agregaría que es posible obtener iterativamente también el coeficiente de regresión r ^ 2:así como todos los demás resultados de
summary(lm)
:fuente
Creo que vale la pena agregar el
purrr::map
enfoque a este problema.Consulte la respuesta de @Paul Hiemstra para obtener más ideas sobre cómo usar el
broom
paquete con estos resultados.fuente
fuente
Ahora mi respuesta llega un poco tarde, pero estaba buscando una funcionalidad similar. Parecería que la función incorporada 'por' en R también puede hacer la agrupación fácilmente:
? by contiene el siguiente ejemplo, que se ajusta por grupo y extrae los coeficientes con sapply:
fuente
La
lm()
función anterior es un ejemplo simple. Por cierto, imagino que su base de datos tiene las columnas de la siguiente forma:año estado var1 var2 y ...
En mi punto de vista, puede utilizar el siguiente código:
fuente
La pregunta parece ser sobre cómo llamar a funciones de regresión con fórmulas que se modifican dentro de un ciclo.
Así es como puede hacerlo (usando el conjunto de datos de diamantes):
fuente