La Régression linéaire et de groupe par dans la R
Je veux faire une régression linéaire dans R à l'aide de la lm()
fonction. Mes données est un temps annuel de la série avec un champ pour l'année (22 ans) et un autre pour l'état (50 membres). Je veux ajustement d'une droite de régression pour chaque état, de sorte qu'à la fin j'ai un vecteur de réponses lm. Je peux imaginer faire de boucle pour chaque état ensuite de faire de la régression à l'intérieur de la boucle, et en additionnant les résultats de chaque régression à un vecteur. Cela ne semble pas très R-comme, cependant. Dans le SAS, je ferais une 'par' énoncé, et en SQL, je voudrais faire un 'group by'. Quel est le R moyen de faire cela?
- Juste envie de dire aux gens que bien que il ya beaucoup de groupe-par les fonctions de R, ils ne sont pas tous de droite pour le groupe par la régression. Par exemple,
aggregate
n'est pas une bonne; il n'est nitapply
.
Vous devez vous connecter pour publier un commentaire.
Voici un moyen à l'aide de la
lme4
paquet.Ici est une approche à l'aide de la plyr package:
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
et puisl_ply(models, plot)
vous obtenez chacun des résidus de parcelles trop. Est-il possible de l'étiquette de chacune des parcelles avec le groupe (par exemple, un "état" dans ce cas)?Depuis 2009,
dplyr
a été publié, qui fournit en fait une façon très agréable de faire ce genre de regroupement, qui ressemblent beaucoup à ce que SAS n'.Extraire les coefficients et Rsquared/p.valeur, on peut utiliser la
broom
paquet. Ce paquet fournit:rowwise(fitted_models) %>% tidy(model)
pour obtenir le balai paquet de travailler, mais sinon, super réponse.d %>% group_by(state) %>% do(model = lm(response ~ year, data = .)) %>% rowwise() %>% tidy(model)
À mon avis, est un modèle linéaire mixte une meilleure approche pour ce type de données. Le code ci-dessous dans le fixe, l'effet de la tendance générale. Les effets aléatoires indiquer comment la tendance pour chaque individu de l'état diffèrent de la tendance mondiale. La structure de corrélation prend l'auto-corrélation temporelle en compte. Jetez un oeil à Pinheiro & Bates (à Effets Mixtes Modèles S et S-Plus).
Une belle solution à l'aide de
data.table
a été posté ici dans CrossValidated par @Zach.Je voudrais juste ajouter qu'il est possible d'obtenir de manière itérative également le coefficient de régression r^2:
ainsi que toutes les autres sorties de
summary(lm)
:J'ai maintenant ma réponse vient un peu tard, mais je cherchais une fonctionnalité similaire. Il semble que la fonction intégrée " par " dans R peut aussi faire le regroupement facilement:
?par contient l'exemple suivant, qui correspond par groupe et extraits de coefficients avec sapply:
Je pense qu'il est intéressant d'ajouter la
purrr::map
approche à ce problème.Voir @Paul Hiemstra de réponse pour d'autres idées sur l'utilisation de la
broom
paquet avec ces résultats.La
lm()
la fonction ci-dessus est un exemple simple. En passant, j'imagine que votre base de données comporte les colonnes comme dans la forme suivante:année de l'état var1 var2 y...
À mon point de vue, vous pouvez utiliser le code suivant:
La question semble être sur la façon d'appeler les fonctions de régression avec des formules qui sont modifiés à l'intérieur d'une boucle.
Voici comment vous pouvez le faire à l'aide de diamants dataset):