修改R for循环以使用三个变量

时间:2015-03-31 14:28:34

标签: r for-loop

我有一个数据集,我需要删除异常值。该数据来自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”是正确或错误的答案。其他三个变量是自变量。

我想要实现的目标:

  1. 我感兴趣的依赖变量是areitiRT这是“反应时间”。我正在使用的独立变量是markLiturEndurt markStadsEndurt litStaEndurt。每个独立变量可以取两个值“0”(IV改变)和“1”(IV保持不变)。

  2. 我想通过进行ANOVA来了解DV可以采取的每种情况下反应时间的差异。在我可以进行ANOVA之前,我需要清理数据,因此它不包含任何极端值。对于每个受试者,在DV的每个条件下的反应时间areitiRT需要检查在该条件下的每个观察,并且与该受试者的平均反应时间进行比较。反应时间小于100毫秒且大于“平均+ 3 *标准偏差”需要消除。

1 个答案:

答案 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
))

删除反应时间<100ms

gogn <- gogn[gogn$areitiRT > 99, ]

或者,如果您想使用dplyr

require("dplyr")
gogn <- subset(gogn, areitiRT > 99)

在这两种情况下,这将消除小于100毫秒(即100毫秒或更长)的反应时间。

反应时间3 * sd +平均值

这涉及更多,但并不太难。首先,我们需要一份所有独特主题的清单:

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

这个答案是否与你需要做的一致?