0
votes

Appliquer une formule de modèle linéaire aux données groupées

Je veux regrouper mon Dataframe par participant code> et appliquer itérativement une formule de modèle linéaire simple, lm (résultat ~ a, données = myData) code>, de sorte que je finis à Avec un nouveau Dataframe séparé et séparé avec un coefficient pour chaque participant code>.

Voici un échantillon de myData ​​code>: p>

myCoefficients<- as.data.frame(mydata %>%
                            group_by(Participant) %>%
                              coef(lm(Outcome ~ A)))


4 commentaires

Vous pouvez utiliser par (...) (lire la documentation) ou split () plus lapply ()


Dans le dplyr world, group_map est ce que vous voulez.


Juste pour être clair, votre sortie souhaitée affiche une colonne de coefficient unique, mais le modèle résultat ~ a conviendrait à la fois une interception et une pente. Voulez-vous les deux coefficients (ou tous les coefficients, si vous courez un modèle plus complexe)? Ou voulez-vous seulement, disons, le coefficient A ?


Je ne suis intéressé que par le coefficient dès maintenant. Mais, comme la réponse acceptée ci-dessous prévoit, les deux pourraient potentiellement être utiles à l'avenir.


3 Réponses :


2
votes

Voici une solution utilisant sapply code>.

#find the slope and intercept
intercept<-sapply(unique(mydata$Participant), function(x){
  lm(Outcome ~ A, data=mydata[mydata$Participant==x,])$coefficients[1]})
A_coefficient<-sapply(unique(mydata$Participant), function(x){
  lm(Outcome ~ A, data=mydata[mydata$Participant==x,])$coefficients[2]})

#combine results into a dataframe
answer<-data.frame(Participant=unique(mydata$Participant), intercept, A_coefficient)

 #slightly more compact coding:
fit<-sapply(unique(mydata$Participant), function(x){
  lm(Outcome ~ A, data=mydata[mydata$Participant==x,])$coefficients})

answer<-cbind(Participant=unique(mydata$Participant), as.data.frame(t(fit)))


0 commentaires

6
votes

Essayez lmlist code>. Notez que le package NLME est déjà livré avec R.

   (Intercept)            A
1     8.122188 -0.079910741
2     2.111455  0.001547988
3     1.722062  0.304546146
4    -2.127148  0.164948454
5    -1.883623  0.076522166
6     2.463768  0.103024575
7     7.133361 -0.043622767
8     0.000000  0.000000000
9     1.370920  0.006923838
10    8.286374  0.081986143
11   -5.359477  0.283224401
12   -4.486884  0.143756558
13   -1.333333  0.034188034
14    0.000000           NA


0 commentaires

2
votes

Pour un Tidyverse code> Solution, il existe un cas d'utilisation similaire dans ? faire code>. Refaming Ceci pour l'exemple actuel:

library(tidyverse)

data %>% 
  group_by(Participant) %>% 
  do(mod = lm(Participant ~ A, data = .)) %>% 
  summarise(Participant = Participant, 
            coef = list(mod$coefficients)) %>% 
  unnest_wider(coef)


0 commentaires