J'ai un cadre de données (df) qui ressemble à ceci:
out <- split( df , f = df$group.no )
et j'ai divisé le data.frame en plusieurs data.frames en fonction de leur numéro de groupe avec
group.no Amount Response 1 5 10 1 10 25 1 2 20 2 12 20 2 4 8 2 3 5
Maintenant, ce que je veux, c'est faire une analyse de régression avec lm entre le montant ~ réponse pour toutes les nouvelles data.frames dans le "out" Veuillez considérer ceci est un exemple et j'ai 500 data.frames fractionnés dans "out"
3 Réponses :
En fonction de ce que vous voulez faire avec la régression, vous pouvez utiliser magrittr
ou dplyr
pour commencer par fractionner puis créer une liste de régressions linéaires:
lapply(split(df, df$group.no), function(x) lm(Amount ~ Response, data = x))
Si vous souhaitez éviter la syntaxe dplyr
, un seul appel lapply
peut être utilisé comme
library(magrittr) #alternative library(dplyr) df %>% split(.$group.no) %>% lapply(function(x) lm(Amount ~ Response, data = x))
Merci le second a fonctionné à merveille, j'ai également trouvé que je pouvais faire ceci: lmList (Amount ~ Response, | group.no, df)
sans les diviser en différents data.frames. Savez-vous comment puis-je imprimer uniquement le R2 de ces modèles de régression?
Heureux d'avoir pu aider. Il est certainement possible d'utiliser lmList
du package lme4
ou nlme
également. Espérons que l'un ou l'autre suffira à votre problème. N'oubliez pas de upvote des réponses utiles et de marquer une réponse comme réponse à la question pour inciter à de futures réponses.
out
est une liste de dataframes afin que vous puissiez utiliser lapply ()
pour estimer votre régression pour chaque dataframe.
mods <- lapply(out, lm, formula=y~x)
Et puis mods
sera une liste des modèles.
Supposons que les données soient reproduites de manière reproductible dans la note à la fin. Spécifiez pool = FALSE
comme argument lmList
si vous ne souhaitez pas regrouper les erreurs standard.
Lines <- "group.no Amount Response 1 5 10 1 10 25 1 2 20 2 12 20 2 4 8 2 3 5" DF <- read.table(text = Lines, header = TRUE)
Une alternative est:
summary(lmList(Response ~ Amount | group.no, DF))$r.squared c(by(DF, DF$group.no, function(x) summary(lm(Response ~ Amount, x))$r.squared)) reg.list <- by(DF, DF$group.no, lm, formula = Response ~ Amount) sapply(reg.list, function(x) summary(x)$r.squared) c(by(DF, DF$group.no, with, cor(Response, Amount)^2)) library(dplyr) DF %>% group_by(group.no) %>% do(summarize(., r.squared = summary(lm(Response ~ Amount, .))$r.squared)) %>% ungroup
ou ceci qui effectue des régressions complètement séparées:
# 3a by(DF, DF$group.no, lm, formula = Response ~ Amount)
Cette dernière ligne peut aussi s'écrire:
# 3 by(DF, DF$group.no, function(DF) lm(Response ~ Amount, DF))
Nous pouvons calculer R au carré par groupe en utilisant l'un de ces éléments:
# 2 lm(Response ~ grp / (Amount + 1) - 1, transform(DF, grp = factor(group.no)))
# 1 library(nlme) lmList(Response ~ Amount | group.no, DF)
Merci, cela fonctionne parfaitement. wit `` `` DF <- by (df, df $ group.no, lm, formula = Response ~ Amount.) `` Savez-vous comment puis-je lister uniquement le R2?
Ont déplacé des commentaires pour répondre.