我正在分析实验中的响应时间(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并添加到了平均RT。最后,我想创建一个新列的功能,其中异地试验得分为0,“好”试验得分为1。
我可以想到实现这一点的一种方法是使用嵌套循环,试验类型嵌套在主题中。但是,编写此功能超出了我的技能水平,所以我在创建它时寻求帮助。如果有人有建议或提示,或非循环的方式来实现这一点,我将非常感激。
由于
答案 0 :(得分:2)
所以你想要做一个Van Selst和Jolicoeur(1994)类型的异常值检查。从那时起,关于RT的工作已经有很多,其中包括强烈的论点,即任何这种异常拒绝都是站不住脚的(例如Ulrich&amp; Miller,1994),以及如何以其他方式纠正问题的建议,如转换分布。此外,一些人建议分析前高斯假设下的分布,并将不同的含义归因于分布的正常和指数部分的情况。
一般而言,您收集的任何类型的数据都会有不时超过几个标准偏差的值。你看到它们的数量会像RT那样在偏态分布中被夸大。通常,像你正在尝试的异常值去除会消除3%的值。大约3%是关于具有那些SD截止值的RT的预期(我认为这是米勒的论文显示)。因此,您实际上并没有删除异常值,而是删除了响应分布的真实数据。
我建议你不要这样做。你有两个问题在RT。一个是你可以有真正有问题的异常值。另一个是分布是偏斜的(由于CLT,在具有足够数量的RT /主题的平均RT中被移除)。用异常值排除来纠正后者会导致很多问题。纠正前者需要异常拒绝技术,以帮助识别真正的异常值。
通常,您也会有准确度量。给定反应时间的准确度函数具有特征模式。 RT通常会非常快速地提高准确度,然后在一段时间内保持这种状态并在稍后的时间点下降(即使刺激持续可用)。您可以使用此函数的分析来摆脱不是异常值的RT,而不是反映您希望分析的内容。低于某个准确度阈值的早期RT不会实际上是对刺激的响应。他们将是猜测和期待。较晚的RT,高于准确度阈值但在准确度开始下降之后,将不会反映对刺激开始的响应,而是在稍后的时间作出决定。通常这两个都是少量的RT(尽管对象识别具有令人惊讶的模式)。
(当然,很多情况下你必须改变这些类型的评估。如果它是响应兼容性任务,早期的RT可能是推动你效果的唯一因素。如果任务有非常大的影响,例如搜索功能,这样的分析可能是站不住脚的。当然,如果你没有精确度测量就很难。在那些不同的情况下考虑不同的方法。但是不要盲目地抛出RT,因为它们有很大的z分数。 )
答案 1 :(得分: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)
}