Проблема с группировкой psych::alpha внутри do::dplyr/tidyverse и broom::tidy

У меня есть данные опроса, проведенного с использованием одной и той же анкеты на разных языках. Я хотел бы написать элегантный код dplyr/tidyverse для надежности для каждого языка, используя psych::alpha внутри. Представим, что фрейм данных (df) выглядит так: симулированная таблица

Я хочу рассчитать надежность элемента и шкалы для Q_1:Q_6 для каждой группы, указанной переменной group_var, и код, который я написал, выглядит следующим образом.

require(tidyverse)
require(psych)
require(broom)

    df %>% 
      select(group_var, Q_1:Q_6) %>%
      as.data.frame() %>% 
      group_by(group_var) %>% 
      do(tidy(psych::alpha(c(Q_1:Q_6))))

но когда я запускаю код, я получаю сообщение об ошибке:

Error in psych::alpha(c(Q_1:Q_6)) : 
  object 'Q_1' not found

Что не так с кодом? Заранее спасибо.


person Jakhongir Alidjanov    schedule 21.05.2020    source источник


Ответы (1)


Я не думаю, что tidy работает с psych::alpha(), используя пример:

r4 <- sim.congeneric()
tidy(alpha(r4))
Error: No tidy method for objects of class psych

О такой аккуратности не может быть и речи, если только нет лучшего, что вы можете сделать, это обернуть их в список внутри таблицы:

library(dplyr)
library(tidyr)
library(purrr)
library(psych)
library(broom)

df = data.frame(group_var=sample(LETTERS[1:6],100,replace=TRUE),
matrix(sample(0:3,900,replace=TRUE),nrow=100))
colnames(df)[-1] = c(paste0("Q_",1:6), paste0("V_", 23:25))

res = df %>% 
select(group_var, Q_1:Q_6) %>%
nest(data=Q_1:Q_6) %>%
mutate(alpha = map(data,
~alpha(.x,keys=c("Q_1","Q_2","Q_3","Q_4","Q_5","Q_6"))
))

res$alpha[[1]]

Reliability analysis   
Call: alpha(x = .x, keys = c("Q_1", "Q_2", "Q_3", "Q_4", "Q_5", "Q_6"))

  raw_alpha std.alpha G6(smc) average_r   S/N ase mean   sd median_r
     -0.37      -0.3    0.13     -0.04 -0.23 0.6  1.6 0.36    0.039

 lower alpha upper     95% confidence boundaries
-1.54 -0.37 0.81 

 Reliability if an item is dropped:
     raw_alpha std.alpha G6(smc) average_r      S/N alpha se var.r  med.r
Q_1-     -0.38  -0.38221  -0.143  -0.05854 -0.27652     0.61 0.028 -0.080
Q_2-     -0.21  -0.19042   0.173  -0.03305 -0.15996     0.54 0.048  0.066
Q_3-     -0.38  -0.26988   0.096  -0.04439 -0.21252     0.61 0.053  0.046
Q_4-     -0.54  -0.41760  -0.064  -0.06261 -0.29458     0.68 0.045 -0.016
Q_5-     -0.35  -0.26006   0.154  -0.04305 -0.20639     0.60 0.058  0.059
Q_6-      0.03  -0.00088   0.107  -0.00018 -0.00088     0.42 0.024 -0.016

 Item statistics 
      n raw.r std.r  r.cor r.drop mean   sd
Q_1- 13  0.42  0.45  0.552 -0.062 0.77 1.01
Q_2- 13  0.38  0.33 -0.073 -0.162 1.85 1.14
Q_3- 13  0.39  0.38  0.083 -0.058 1.92 0.95
Q_4- 13  0.45  0.47  0.416  0.050 1.62 0.87
Q_5- 13  0.33  0.38 -0.039 -0.073 2.08 0.86
Q_6- 13  0.21  0.18 -0.137 -0.309 1.38 1.12

Non missing response frequency for each item
       0    1    2    3 miss
Q_1 0.08 0.15 0.23 0.54    0
Q_2 0.38 0.23 0.23 0.15    0
Q_3 0.31 0.38 0.23 0.08    0
Q_4 0.15 0.38 0.38 0.08    0
Q_5 0.38 0.31 0.31 0.00    0
Q_6 0.15 0.38 0.15 0.31    0

Быстрая проверка кажется tidystats. сделать это, но я запустил пример кода и, похоже, не работает. Так что можете попробовать сами.

person StupidWolf    schedule 21.05.2020
comment
Большое тебе спасибо. Предложенный вами код возвращает ошибку после запуска res = tibble(df) %>% select(group_var, Q_1:Q_6) %>% nest(data=Q_1:Q_6) %>% mutate(alpha = map(data, ~alpha(.x,keys=c("Q_1","Q_2","Q_3","Q_4","Q_5","Q_6")) )) Error in .f(.x[[i]], ...) : object 'group_var' not found - person Jakhongir Alidjanov; 21.05.2020
comment
извините, я понимаю, что есть конфликт пакетов. можете ли вы перезапустить сеанс и использовать только tyr, purrr и dplyr, как мой отредактированный ответ? не загружайте полную версию - person StupidWolf; 21.05.2020
comment
Я немного изменил ваш код, чтобы избежать умножения кадров данных в среде. Теперь это выглядит так: (df%>% select(id.study.group, Q_1:Q_6) %>% nest(data=Q_1:Q_6) %>% mutate(cronbach=map(data, ~alpha(.x, keys = (c("Q_1", "Q_2", "Q_3", "Q_4", "Q_4", "Q_5", "Q_6"))))))$cronbach - person Jakhongir Alidjanov; 21.05.2020
comment
добавление summary между ~ и alpha отображает сводную статистику для всех групп одновременно. - person Jakhongir Alidjanov; 21.05.2020