【问题标题】:Problem with grouped psych::alpha within the do::dplyr/tidyverse and broom::tidydo::dplyr/tidyverse 和 broom::tidy 中分组 psych::alpha 的问题
【发布时间】:2020-05-21 10:07:00
【问题描述】:

我有使用不同语言的同一份问卷执行的调查数据。我想为每种语言编写一个优雅的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

代码有什么问题? 提前致谢。

【问题讨论】:

    标签: r dplyr reliability broom psych


    【解决方案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 可能能够做到这一点,但我运行了示例代码并且似乎不起作用。所以你可以自己试试。

    【讨论】:

    • 非常感谢。你提出的代码在res = tibble(df) %&gt;% select(group_var, Q_1:Q_6) %&gt;% nest(data=Q_1:Q_6) %&gt;% 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运行后返回错误
    • 对不起,我意识到存在包冲突。您可以像我编辑的答案一样重新启动会话并仅使用 tidyr、purrr 和 dplyr 吗?不要加载完整的 tidyverse
    • 我对您的代码进行了一些修改,以避免环境中的数据帧相乘。现在看起来像这样:(df%&gt;% select(id.study.group, Q_1:Q_6) %&gt;% nest(data=Q_1:Q_6) %&gt;% mutate(cronbach=map(data, ~alpha(.x, keys = (c("Q_1", "Q_2", "Q_3", "Q_4", "Q_4", "Q_5", "Q_6"))))))$cronbach
    • ~alpha 之间添加summary 可以一次性显示所有组的汇总统计信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2018-10-31
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2019-09-25
    • 2021-04-08
    相关资源
    最近更新 更多