0
votes

R stocker les coefficients de régression dans la colonne de trame de données par groupe

J'ai une trame de données avec des résultats d'une enquête. Les résultats sont stockés dans un format verticalisé. La trame de données ressemble à ceci - xxx pré>

Description de DataFrame forte> P>

resp_id = ID de répondant. Chaque correspondants d'identification à un seul répondant. Dans cet exemple de cadre de données, nous avons 10 répondants. P>

Client = correspondants au nom du client dont les répondants ont été interrogés. Dans cet exemple de cadre de données, nous avons deux clients (A & B). P>

qst = correspond au numéro de la question dans l'enquête. P>

valeur = correspond à l'option de réponse pour le question. Toutes les questions ont 4 options de réponse (1 à 4). P>

objectif fort> p>

pour chaque client et chaque combinaison de questions, je voudrais créer une colonne séparée Cela stocke le coefficient de régression pour cette question régressée au Q2 dans la colonne code> qst code>. p>

donc dans le modèle de régression, q2 code> est la variable dépendante et toutes les autres questions sont les variables indépendantes. p>

ma tentative forte> p>

Ma tentative ne me donne pas le résultat que je veux. p>

slopesdf = df %>%
  spread(QST, VALUE, fill = 0) %>%
  group_by(CLIENT) %>%
  mutate(COEFFICIENT=lm(Q2 ~ .))


10 commentaires

Vous utilisez q2 qui n'est pas une colonne


Merci. Y a-t-il une approche que vous recommanderiez d'obtenir la sortie souhaitée?


Je ne suis pas clair sur ce que vous demandez. Q2 n'est ni une colonne ni une valeur numérique (la variable de réponse pour un modèle linéaire doit être numérique). qst est une colonne, mais elle est catégorique, elle ne peut donc pas être la variable (réponse) dépendante dans une régression: je pouvais imaginer que vous voulez valeur ~ qst pour chaque client (qui serait effectivement une anova, car qst est catégorique), mais valeur ~ q2 ne serait pas un sens parce qu'il n'y ait qu'un seul Valeur pour le prédicteur ... Pouvez-vous nous montrer la sortie de une des régressions spécifiques que vous voulez, faites à la main?


Pouvez-vous exécuter ce modèle et vérifier que c'est ce que vous voulez vraiment faire? Est-ce le bon modèle pour ces données?


Essayez DF%>% Spread (QST, Valeur, Fill = 0)%>% GROUP_BY (Client)%>% NEST%>% Mutate (Data = .x%>%>%. liste (LM (Q2 ~., Data = .x)%>% Tidy)))))%>% innest%>% inness


Cet ensemble de données est en format vertical et devrait être transformé en format horizontal avant d'exécuter une régression. Idéalement, j'aimerais que les valeurs de la colonne qst soient les en-têtes de colonne. Et les valeurs dans la colonne la valeur pour être les valeurs sous chaque colonne de questions. Étalement de la trame de données serait la première étape. Après cette étape, nous aurions notre colonne «Q2» qui serait numérique et ce serait notre variable de réponse dans notre modèle de régression.


@Varun pouvez-vous essayer le code que j'ai commenté


@akrun j'ai essayé votre solution. Mais cela ne renvoie pas les coefficients de toutes les questions.


J'ai édité la question de la rendre plus claire


Pour moi, ça va de retour


3 Réponses :


1
votes

Je ne suis pas sûr de 100% que cette sortie est ce que vous êtes après, mais est-ce sur la bonne voie?

> df %>%
+   spread(QST, VALUE, fill = 0) %>%
+   split(.$CLIENT) %>%
+   lapply(., function(x) { lm(Q2 ~ ., x[, -c(1,2)])$coefficients }) %>%
+   do.call(rbind, .) %>%
+   data.frame(.) %>%
+   mutate(CLIENT = rownames(.)) %>%
+   gather(QST, COEFFICIENT, -CLIENT) %>%
+   arrange(CLIENT)
   CLIENT          QST COEFFICIENT
1       A X.Intercept.  6.50000000
2       A           Q1 -4.14285714
3       A           Q3  2.50000000
4       A           Q4  0.85714286
5       A           Q5  1.00000000
6       A           Q6 -0.64285714
7       A           Q7 -1.21428571
8       A           Q8 -1.85714286
9       A           Q9  2.50000000
10      A          Q10 -0.07142857
11      B X.Intercept. -4.69924812
12      B           Q1 -0.86466165
13      B           Q3  1.56390977
14      B           Q4  1.10150376
15      B           Q5 -0.86842105
16      B           Q6  0.87593985
17      B           Q7  0.57142857
18      B           Q8  0.25187970
19      B           Q9  0.79699248
20      B          Q10 -0.12781955


2 commentaires

Cela semble très proche de ce que j'ai à l'esprit. Savez-vous pourquoi les NAS sont là?


@Varun - Quelque chose à voir avec les données que je suppose- si vous exécutez la fonction lm directement sur les fichiers de données divisés, ce sont les valeurs de sortie pour chaque q- Je vais ajouter à ma réponse pour démontrer



1
votes

Une solution qui suit la logique de mon cerveau (nous devons avoir q2 code> disponible en tant que variable distincte ... une fois que nous réorganisons les données de cette façon, nous pouvons exécuter. (Le NA code> Les valeurs sont définitivement dues à des carences dans ce minuscule ensemble de données - des cas où il n'y a pas de variation dans le prédicteur, la réponse ne peut donc pas être estimée ...)

(df
    %>% group_by(RESP_ID,CLIENT)
    ## add a new variable for Q2
    %>% mutate(Q2=VALUE[QST=="Q2"])
    ## drop the old one
    %>% filter(QST!="Q2")
    %>% group_by(CLIENT,QST)
    ## run the regression by group; return a data frame
    %>% do(as.data.frame(rbind(coef(lm(Q2~VALUE,data=.)))))
    ## convert wide coefficients to long
    %>% tidyr::gather(coef,value,-c(CLIENT,QST))
    %>% arrange(CLIENT)
)


0 commentaires

1
votes

Pour les tâches telles que ceci, j'aime les "nombreux modèles" de l'approche de r pour la science des données em> . Il convient au style tirett, à l'aide de cadres de données imbriqués et Purrr :: mappez code> pour créer une colonne de liste de modèles. Alors balai :: Tidy code> fournit des utilitaires pour extraire des informations dont vous avez besoin sur les modèles.

J'ai laissé tomber la colonne ID pour la sortir de la répartition des données et regroupées et déposées par Client CODE>: P>

df %>%
  spread(key = QST, value = VALUE, fill = 0) %>%
  select(-RESP_ID) %>%
  group_by(CLIENT) %>%
  nest() %>%
  mutate(lm_mod = map(data, function(d) lm(Q2 ~ ., data = d))) %>%
  mutate(mod_tidy = map(lm_mod, broom::tidy, quick = T)) %>%
  unnest(mod_tidy) %>%
  head()
#> # A tibble: 6 x 3
#>   CLIENT term        estimate
#>   <fct>  <chr>          <dbl>
#> 1 A      (Intercept)    2.67 
#> 2 A      Q1             0.333
#> 3 A      Q10           NA    
#> 4 A      Q3            -0.333
#> 5 A      Q4            -1.   
#> 6 A      Q5             1.


0 commentaires