使用group_by()按被试分组计算ICC值时返回相同结果的问题
问题根源
所有分组返回完全一致ICC值的核心原因是dplyr非标准求值规则与DescTools::ICC的参数传递逻辑不兼容:
在group_by()后的summarise()调用中,直接在ICC()函数内部用.引用数据时,.不会被自动解析为「当前分组的子集数据」,而是会被捕获为管道起始位置的全量原始数据集(包含SubID分组列)。因此每次迭代计算ICC时,传入函数的都是同一个三列全量数据,最终所有分组的返回值与全量数据集计算的ICC值完全一致,不存在按分组迭代计算的过程。
修复方案
需要显式获取当前分组的纯数据(自动剔除分组列)传入ICC函数,避免上述求值偏差,推荐写法:
df %>% group_by(SubID) %>% summarise( icc = DescTools::ICC(x = cur_data())$results[3, 2] )
其中cur_data()是dplyr分组上下文的内置函数,不受.的求值歧义影响,能准确返回当前分组去掉分组列后的纯数据框。
结果验证
上述代码运行后会得到按分组独立计算的ICC结果,与全量计算的固定值有明显差异:
# A tibble: 3 × 2 SubID icc <dbl> <dbl> 1 1 -0.0769 2 2 -0.286 3 3 0.500
注意:
DescTools::ICC要求输入数据仅包含参与信度计算的评分变量,不能携带分组列。cur_data()会自动剔除当前分组的标识列,仅保留Rate1、Rate2作为计算输入,避免将分组列误识别为评分变量导致结果偏差。
内容的提问来源于stack exchange,提问作者Bear25
相关产品推荐
相关产品推荐

