2

我正在分析来自实验的响应时间 (RT) 数据。在这些实验中,每个人完成一定数量的各种试验类型的试验。仅使用来自正确试验的 RT 数据;因此,每个受试者每个试验类型要分析的 RT 数量不同。我正在尝试创建一个异常值函数,该函数应用一个标准偏差截止值,该截止值取决于要分析的试验次数(Van Selst & Jolicoeur,1994)。例如,如果第一个受试者有 100 次 A 试验,我想计算该受试者 A 试验的平均值和标准偏差,然后应用标准偏差截止值(例如,大于平均值加或减的绝对值的试验标出的标准偏差数记为 0)。

我想使用的标准偏差截止值如下所示:

#n = # of trials
if n < 4 then SDout=3
if n == 4 then SDout=1.458
if n == 5 then SDout =1.68
if n == 6 then SDout=1.841
if n == 7 then SDout=1.961
if n == 8 then SDout=2.050
if n == 9 then SDout=2.12
if n == 10 then SDout=2.173
if n == 11 then SDout=2.22
if n == 12 then SDout=2.246
if n == 13 then SDout=2.274
if n == 14 the SDout=2.31
if n >= 15 & if n < 20 then SDout=2.326
if n >= 20 &if n < 25 then SDout=2.391
if n >= 25 & if n < 30 then SDout=2.41
if n >= 30 & if n < 35 then SDout=2.4305
if n >= 35 & if n < 50 then SDout=2.45  
if n >= 50 & if n < 100 then SDout=2.48
if n >= 100 then SDout=2.5

我的数据有 3 列:id(主题标识符)、ttype(试验类型)和 RT。

从本质上讲,我需要这个函数做的是:获取每个试验类型的每个受试者的 RT 平均值、SD 和试验次数,然后根据 SDout 乘以 SD 并将其添加到指 RT。最后,我想要创建一个新列的函数,其中外围试验得分为 0,“良好”试验得分为 1。

我认为实现这一点的一种方法是使用嵌套循环,其中试验类型嵌套在主题中。但是,编写这个函数超出了我的技能水平,所以我寻求帮助来创建它。如果有人有建议或提示,或实现此目的的非循环方式,我将不胜感激。

谢谢

4

2 回答 2

2

因此,您希望进行 Van Selst 和 Jolicoeur (1994) 类型的异常值检查。从那时起,有很多关于 RT 的工作,从强烈的论点认为任何这样的异常值拒绝都是站不住脚的(例如 Ulrich & Miller,1994 年),到建议如何以其他方式纠正问题,如改变分布。此外,一些人建议在前高斯假设下分析分布,并对分布的正态和指数部分发生的情况赋予不同的含义。

通常,您收集的任何类型的数据都会不时具有超出几个标准偏差的值。你看到的它们的数量会在像 RT 这样的倾斜分布中被夸大。通常像您尝试的那样去除异常值会去除 3% 的值。大约 3% 是对具有 SD 截止值的 RT 的预期(我认为这是 Miller 的一篇论文表明了这一点)。因此,您实际上并没有删除异常值,而是作为响应分布一部分的真实数据。

我可以建议你不要这样做。您在 RT 中有两个问题。一是你可以有真正有问题的异常值。另一个是分布是倾斜的(由于 CLT,在具有足够数量的 RT / 受试者的平均 RT 中被移除)。用异常值拒绝来纠正后者会导致很多问题。纠正前者需要异常值拒绝技术来帮助识别真正的异常值。

通常,您还会有准确度测量。给定反应时间的精度函数具有特征模式。RT 通常会很快提高准确性,然后在一段时间内保持这种状态并在稍后下降(即使刺激始终可用)。您可以使用对此函数的分析来消除本身不是异常值但不能反映您希望分析的内容的 RT。低于某个准确度阈值的早期 RT 实际上并不是对刺激的反应。它们将是猜测和预期。较晚的 RT,高于准确度阈值但在准确度开始下降之后,不会反映对刺激开始的反应,而是稍后做出的决定。

(当然,在很多情况下,您必须改变这些类型的评估。如果是响应兼容性任务,早期 RT 可能是唯一推动您的效果的事情。如果任务具有非常大的影响,例如在搜索功能中,这样的分析可能是站不住脚的。当然,如果你没有准确度测量,这很困难。在这些不同的情况下考虑不同的方法。但不要盲目地折腾 RT,因为它们的 z-score 很大。)

于 2013-04-15T18:58:17.820 回答
1

如果你真的下定决心要这样做...

# This function does the basic outlier rejection
vjout<- function(x){
    n <- length(na.omit(x))
    if (n > 3) {
        CriterionSD <- c(0.0, 0.0, 0.0, 1.458, 1.68, 1.841, 1.961, 2.05, 2.12, 2.173, 2.22, 2.246, 2.274, 2.31, 2.326)
        m <- mean(x, na.rm=T)
        if (n > 15) c <- CriterionSD[15] else c <- CriterionSD[n]
        c <- c*sd(x, na.rm=T)
        x[abs(x-m) > c] <- NA
    }
    return(x)
}

# in order to use vjout to generate a new column of data assign it using 
# the following with subject and condition.  Then, you select the data
# excluding NA cells in the new column
vjoutlier<- function(rt, subj, cond){
    ave (rt, subj:cond, FUN=vjout)
}
于 2013-04-15T19:04:58.373 回答