使用dplyr/tidyverse按分组变量计算题项内部一致性
问题根因
你之前的代码报错、计算结果完全错误的核心问题是多余执行了pivot_longer()长宽转换:
psych::alpha()和MBESS::ci.reliability()两个函数都要求输入为宽格式数值数据集:每一列对应一个测量题项,所有列存储题项得分- 转成长格式后嵌套得到的子数据集仅包含
name(题项名称)、value(题项得分)两列,完全不符合函数输入要求,因此会触发类型错误,输出完全不符合预期的计算值。
正确实现代码
不需要做任何长宽转换,直接按分组变量嵌套原始宽格式数据即可,完整可运行代码如下:
library(tidyverse) library(psych) library(MBESS) # 复用你构造的示例数据、itemNames变量即可 reliability_res <- mydata %>% nest_by(age, raterType) %>% mutate( # 提取子集中的所有题项列计算alpha系数 alpha = alpha( data %>% select(all_of(itemNames)), na.rm = TRUE )$total$raw_alpha, # 提取子集中的所有题项列计算omega系数 omega = ci.reliability( data %>% select(all_of(itemNames)), type = "omega", interval.type = "none", na.rm = TRUE )$est ) %>% # 移除嵌套的原始数据列,得到最终汇总结果 select(-data) %>% ungroup()
结果校验
你之前手动计算的age=3、raterType="self"分组结果,和上述批量计算的输出完全匹配:
- 该分组alpha值为-0.3018416
- 该分组omega值为0.00836356
实用提示:如果实际分析中存在部分分组样本量过小、题项方差为0等异常情况,可以用
purrr::safely()包裹计算函数,避免整个计算流程中断,单独定位异常分组做排查。
内容的提问来源于stack exchange,提问作者itpetersen
相关产品推荐
相关产品推荐

