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 - 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> 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, Ma tentative ne me donne pas le résultat que je veux. p> q2 code> est la variable dépendante et toutes les autres questions sont les variables indépendantes. p>
slopesdf = df %>%
spread(QST, VALUE, fill = 0) %>%
group_by(CLIENT) %>%
mutate(COEFFICIENT=lm(Q2 ~ .))
3 Réponses :
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
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 code> 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
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)
)
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 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 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.
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.
Vous utilisez
q2 code> 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 CODE> 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 code> 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 code> pour chaque
client code> (qui serait effectivement une anova, car
qst code> est catégorique), mais
valeur ~ q2 code> 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 i> 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 code>
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 code> soient les en-têtes de colonne. Et les valeurs dans la colonne
la valeur code> 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