1
votes

Effectuer une analyse de régression pour toutes les variables X et la réponse G, pour toutes les bases de données trouvées sous une seule base de données dans R

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"


0 commentaires

3 Réponses :


0
votes

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))


2 commentaires

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.



0
votes

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.


0 commentaires

1
votes

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))

R au carré

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)))

Remarque h2>
# 1
library(nlme)
lmList(Response ~ Amount | group.no, DF)


2 commentaires

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.