trimr包nonRecursive函数为何会移除全部数据?
问题排查:trimr::nonRecursive移除所有数据的原因及解决办法
我采用Van Selst & Jolicoeur (1994)提出的非递归方法移除数据异常值,使用trimr包的nonRecursive函数在被试(participant)和条件(condition)层面处理,并设置returnType = "raw"以返回移除异常值后的原始数据。但结果所有数据都被移除,而非仅异常值。
示例数据
df <- data.frame(participant = c(rep(1, times = 3), rep(2, times = 3)), condition = rep(c("control", "AOMIspec", "AOMIgen"), times = 2), word = rep(c("ascend", "frugal", "campus"), times = 2), accuracyScore = rep(NA, times = 6), wholeWordTime = c(1.721456, 1.772691, 1.618516, 2.0550096, 2.1921245, 3.0659085) ) # 数据预览 print(df)
输出结果:
participant condition word accuracyScore wholeWordTime 1 1 control ascend NA 1.721456 2 1 AOMIspec frugal NA 1.772691 3 1 AOMIgen campus NA 1.618516 4 2 control ascend NA 2.055010 5 2 AOMIspec frugal NA 2.192124 6 2 AOMIgen campus NA 3.065908
处理代码
library(trimr) df_trim <- trimr::nonRecursive(data = df, minRT = 0.1, pptVar = "participant", condVar = "condition", rtVar = "wholeWordTime", accVar = "accuracyScore", digits = 5, returnType = "raw", omitErrors = FALSE)
原因分析
核心问题在于每个被试-条件组的样本量仅为1:
Van Selst & Jolicoeur的非递归异常值移除方法,需要基于组内的RT分布计算截断阈值(比如根据均值、标准差或百分位数确定异常范围)。当每个分组只有1条数据时,无法计算分布统计量(如标准差为NA),函数会默认将该唯一数据判定为异常值并移除,最终导致所有数据被清空。
关于accuracyScore全为NA的问题:虽然设置了omitErrors = FALSE,但这不是主要原因——即使将accVar参数移除,仅保留被试和条件分组,由于每组样本量为1,依然会出现所有数据被移除的情况。
解决方案
- 补充分组样本量:确保每个
participant-condition组至少有3-5条数据,这样函数才能正常计算异常值阈值。 - 调整分组逻辑:如果每个条件下每个被试确实只有1个试次,可以取消按条件分组,仅按被试层面处理异常值(移除
condVar参数),或者直接跳过异常值移除步骤(单数据点无异常可言)。 - 临时验证方案:给示例数据增加同组数据后测试,比如:
# 扩充每个被试-条件组的样本量 df_expand <- rbind(df, data.frame(participant = c(1,1,1,2,2,2), condition = rep(c("control", "AOMIspec", "AOMIgen"), times=2), word = rep("test",6), accuracyScore = rep(NA,6), wholeWordTime = rnorm(6, mean=2, sd=0.2))) # 重新运行函数 df_trim_expand <- trimr::nonRecursive(data = df_expand, minRT = 0.1, pptVar = "participant", condVar = "condition", rtVar = "wholeWordTime", accVar = "accuracyScore", digits = 5, returnType = "raw", omitErrors = FALSE)
此时函数会正常保留非异常值数据。
内容的提问来源于stack exchange,提问作者milsandhills
相关产品推荐
相关产品推荐

