Je veux faire une régression linéaire dans R en utilisant la lm()
fonction. Mes données sont une série chronologique annuelle avec un champ pour l'année (22 ans) et un autre pour l'état (50 états). Je veux ajuster une régression pour chaque état afin qu'à la fin j'aie un vecteur de réponses lm. Je peux imaginer faire une boucle for pour chaque état puis faire la régression à l'intérieur de la boucle et ajouter les résultats de chaque régression à un vecteur. Cela ne semble pas très semblable à R, cependant. En SAS, je ferais une instruction «par» et en SQL, je ferais un «groupe par». Quelle est la manière R de faire cela?
r
regression
linear-regression
lm
JD Long
la source
la source
aggregate
n'est pas une bonne solution ; ni l'un ni l'autretapply
.Réponses:
Voici une façon d'utiliser le
lme4
package.la source
Voici une approche utilisant le package plyr :
la source
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
et quel_ply(models, plot)
vous obtenez également chacun des tracés des résidus. Est-il possible d'étiqueter chacune des parcelles avec le groupe (par exemple, «état» dans ce cas)?Depuis 2009,
dplyr
a été publié, ce qui offre en fait une très belle façon de faire ce type de regroupement, ressemblant étroitement à ce que fait SAS.Pour récupérer les coefficients et Rsquared / p.value, on peut utiliser le
broom
package. Ce package fournit:la source
rowwise(fitted_models) %>% tidy(model)
pour que le paquet de balai fonctionne, mais sinon, excellente réponse.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. ...
À mon avis, un modèle linéaire mixte est une meilleure approche pour ce type de données. Le code ci-dessous donne à effet fixe la tendance générale. Les effets aléatoires indiquent comment la tendance pour chaque état individuel diffère de la tendance mondiale. La structure de corrélation prend en compte l'autocorrélation temporelle. Jetez un œil à Pinheiro & Bates (modèles d'effets mixtes en S et S-Plus).
la source
Une belle solution utilisant a
data.table
été publiée ici dans CrossValidated by @Zach. J'ajouterais simplement qu'il est possible d'obtenir itérativement aussi le coefficient de régression r ^ 2:ainsi que toutes les autres sorties de
summary(lm)
:la source
Je pense qu'il vaut la peine d'ajouter l'
purrr::map
approche à ce problème.Voir la réponse de @Paul Hiemstra pour plus d'idées sur l'utilisation du
broom
package avec ces résultats.la source
la source
Maintenant, ma réponse arrive un peu tard, mais je cherchais une fonctionnalité similaire. Il semblerait que la fonction intégrée `` by '' dans R puisse également effectuer le regroupement facilement:
? by contient l'exemple suivant, qui tient par groupe et extrait les coefficients avec sapply:
la source
La
lm()
fonction ci-dessus est un exemple simple. Au fait, j'imagine que votre base de données a les colonnes sous la forme suivante:année état var1 var2 y ...
De mon point de vue, vous pouvez utiliser le code suivant:
la source
La question semble être de savoir comment appeler des fonctions de régression avec des formules modifiées à l'intérieur d'une boucle.
Voici comment vous pouvez le faire (en utilisant un jeu de données de diamants):
la source