在R中对有序数据执行Friedman检验时遭遇「非无重复完全区组设计」错误的技术求助
解决Friedman检验报错:
not an unreplicated complete block design 这个错误的核心原因是你的数据不符合Friedman检验的前提要求:Friedman检验需要的是无重复的完全区组设计——也就是说,每个区组(这里是你的参与者ID vectemp)在每个处理水平(时间点 time1 的每个水平)下,只能有1条观测记录。你的数据里肯定存在某个参与者在同一个时间点下有多个loameasure的记录,导致检验无法运行。
第一步:定位重复的记录
先检查哪些参与者在同一时间点有重复观测,你可以用以下代码:
方法1:用base R查看频次表
# 生成每个参与者-时间点组合的观测数表格 freq_table <- table(selt$vectemp, selt$time1) # 筛选出观测数大于1的组合 freq_table[freq_table > 1]
方法2:用dplyr更直观地查看重复行
library(dplyr) selt %>% count(vectemp, time1) %>% # 统计每个组合的行数 filter(n > 1) # 只显示重复的组合
运行后你就能明确看到哪些参与者在哪个时间点有多余的记录。
第二步:根据情况处理数据
找到重复原因后,你可以选择以下方案:
- 如果是数据录入错误:直接删除或修正重复的记录,确保每个
vectemp+time1组合只有1条数据。 - 如果是同一参与者在同一时间点有多次测量:对于有序数据
loameasure,你可以用中位数(适合有序数据的汇总统计)来合并重复记录,示例代码:
# 按参与者和时间点分组,取loameasure的中位数 selt_clean <- selt %>% group_by(vectemp, time1) %>% summarise(loameasure = median(as.numeric(loameasure)), .groups = "drop") # 把loameasure转回有序因子(如果需要) selt_clean$loameasure <- factor(selt_clean$loameasure, ordered = TRUE)
第三步:重新运行Friedman检验
处理完重复数据后,再执行你的检验代码:
friedman_test(formula = loameasure ~ time1 | vectemp, data = selt_clean)
另外补充一点:你的loameasure是有序数据,把它设为有序因子(factor(..., ordered = TRUE))会更合适,不过Friedman检验本身对有序/名义因子的兼容性都不错,核心还是要先解决区组内重复的问题。
内容的提问来源于stack exchange,提问作者Sophie Dewil
相关产品推荐
相关产品推荐

