我有一个数据集,我需要删除异常值。该数据来自105名受试者的重复测量实验。我使用的代码仅从研究中的一个条件(“markLiturEndurt”)中删除异常值,而不从其他两个(“markStadsEndurt”和“litStaEndurt”)中删除异常值。每个条件都是二进制的,并已编码为“Skilyrdi”
我使用的代码如下所示:
(Skilyrdi<-unique(gogn$markLiturEndurt))
(fjoldiRada<-length(gogn$subject))
(fjoldiSkil<-length(Skilyrdi))
gognHrein<-0
for (i in 1:length(Skilyrdi))
{
gognSkil<-subset(gogn,gogn$markLiturEndurt==Skilyrdi[i])
numerThatt<-unique(gognSkil$subject)
for (j in 1:length(numerThatt))
{
gognThatt<-subset(gognSkil,gognSkil$subject==numerThatt[j])
(medalST<-mean(gognThatt$areitiRT))
(sfST<-sd(gognThatt$areitiRT))
(nedriMork<-100)
(efriMork<-medalST+3*sfST)
gognThatt<-subset(gognThatt,gognThatt$areitiRT>nedriMork)
gognThatt<-subset(gognThatt,gognThatt$areitiRT<efriMork)
gognHrein<-rbind(gognHrein,gognThatt)
}
}
我已经尝试过搞乱代码,但是我有限的R编程技巧让我变得更好。我很确定应该可以修改我的代码,以便在所有条件下检查异常值,或者我可以为每个条件创建额外的for循环,然后将它们绑定在一起。
subject umferd areitiACC areitiRT markLiturEndurt markStadsEndurt litStaEndurt
117 1 1 1202 0 0 0
117 2 1 924 0 1 0
117 4 1 1139 0 0 0
117 5 1 1211 0 0 0
117 6 1 998 1 1 0
117 7 1 778 0 1 0
“areitiRT”是因变量的反应时间。 “umferð”是每一轮,“areitiACC”是正确或错误的答案。其他三个变量是自变量。
我想要实现的目标:
我感兴趣的依赖变量是areitiRT
这是“反应时间”。我正在使用的独立变量是markLiturEndurt
markStadsEndurt
litStaEndurt
。每个独立变量可以取两个值“0”(IV改变)和“1”(IV保持不变)。
我想通过进行ANOVA来了解DV可以采取的每种情况下反应时间的差异。在我可以进行ANOVA之前,我需要清理数据,因此它不包含任何极端值。对于每个受试者,在DV的每个条件下的反应时间areitiRT
需要检查在该条件下的每个观察,并且与该受试者的平均反应时间进行比较。反应时间小于100毫秒且大于“平均+ 3 *标准偏差”需要消除。
答案 0 :(得分:0)
我已经花了一个星期的时间回到你身边,因为我一直在度假,对延迟感到抱歉。
我还不完全确定你需要什么,所以这里有一些选择。如果您通过编辑问题澄清所需内容,我可以适当地编辑我的答案。
以gogn
为例,使用以下数据集:
gogn <- structure(list(subject = c(117L, 117L, 117L, 117L, 117L, 117L,
117L, 118L, 118L, 118L, 118L, 118L, 118L), umferd = c(1L, 2L,
4L, 5L, 6L, 7L, 7L, 1L, 2L, 4L, 5L, 6L, 7L), areitiACC = c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), areitiRT = c(1202L,
924L, 1139L, 1211L, 998L, 778L, 53L, 1202L, 924L, 1139L, 1211L,
1024L, 778L), markLiturEndurt = c(0L, 0L, 0L, 0L, 1L, 0L, 0L,
0L, 0L, 0L, 0L, 1L, 0L), markStadsEndurt = c(0L, 1L, 0L, 0L,
1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L), litStaEndurt = c(0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("subject",
"umferd", "areitiACC", "areitiRT", "markLiturEndurt", "markStadsEndurt",
"litStaEndurt"), class = "data.frame", row.names = c(NA, -13L
))
gogn <- gogn[gogn$areitiRT > 99, ]
或者,如果您想使用dplyr
:
require("dplyr")
gogn <- subset(gogn, areitiRT > 99)
在这两种情况下,这将消除小于100毫秒(即100毫秒或更长)的反应时间。
这涉及更多,但并不太难。首先,我们需要一份所有独特主题的清单:
uSubject <- as.list(unique(gogn$subject))
然后我们创建一个列表,其中包含每个主题的3 * sd + mean
值:
outliers <- lapply(uSubject, function(x){
3 * sd(gogn$areitiRT[gogn$subject == x]) +
mean(gogn$areitiRT[gogn$subject == x])
})
然后我更喜欢将其输入数据框(gogn
)作为新列以便于使用:
for(i in 1:length(outliers)){
gogn$outlier[gogn$subject == uSubject[i]] <- outliers[i]
}
然后我们可以将每个单独的反应时间与“异常值”进行比较。我们刚刚计算出来,如果它更大,就抛弃它:
gogn <- gogn[which(gogn$areitiRT < gogn$outlier), ]
# this removes any cases where reaction time is NOT less than the limit
这个答案是否与你需要做的一致?