You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:48:27