2015-03-31 2 views
-1

У меня есть набор данных, из которого мне нужно удалить выбросы. Данные взяты из опыта повторных измерений с 105 испытуемыми. Код, который я использую, только удаляет выбросы из одного из условий исследования («markLiturEndurt»), но не двух других («markStadsEndurt» и «litStaEndurt»). Каждое условие является двоичным и закодировано в «Skilyrdi»Изменение цикла R для работы с тремя переменными

код я использую выглядит следующим образом:

(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 программирований получили лучшие меня. Я уверен, что это должно быть возможно либо изменить мой код, чтобы он проверял выбросы во всех условиях, либо, возможно, я мог бы создать дополнительные для циклов для каждого условия, а затем связать их вместе.

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 

«isitiRT» - это время реакции на зависимую переменную. «umferð» - это каждый раунд, «isitiACC» - правильный или неправильный ответ. Другими тремя переменными являются независимые переменные.

Что я хотел бы достичь:

  1. depentant переменная интерес для меня areitiRT это «время реакции». Независимыми переменными, с которыми я работаю, являются markLiturEndurtmarkStadsEndurtlitStaEndurt. Каждая независимая переменная может принимать два значения «0» (IV изменено) и «1» (постоянное значение IV).

  2. Я хочу видеть, как время реакции отличается при каждом условии, которое DV может принимать, выполняя ANOVA. Прежде чем я смогу сделать ANOVA, мне нужно очистить данные, чтобы они не содержали экстремальных значений. Время реакции areitiRT при каждом условии DV для каждого испытуемого должно быть проверено на каждое наблюдение в этом состоянии, и по сравнению с этими субъектами среднее время реакции. Время реакции меньше 100 мс и выше, тогда необходимо удалить стандартное отклонение «среднее + 3 *».

+0

Не могли бы вы предоставить некоторые данные примера, чтобы мы могли проверить ответы, прежде чем публиковать их? Благодарю. – Phil

+0

Я добавил образец данных. Большое спасибо за помощь. Если требуется больше данных, я могу ссылаться на большую часть набора данных. – hugstari

+0

Прошу вас уточнить, что такое '' Skilyrdi'' и 'gogn'? Я предполагаю, что 'gogn' - это то, что вы назвали своей файловой рамкой, но это не ясно. Просто проще будет указать, что вы пытаетесь достичь шаг за шагом (не ссылаясь на код, а просто указывая, как должен выглядеть ваш конечный результат). – Phil

ответ

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

раз Удалить реакции < 100мс

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

Или, если вы хотите использовать dplyr:

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

В обоих случаях это позволит удалить время реакции менее 100 мс (т.е. 100 мс или более).

Время реакции 3 * сд + означают

Это немного сложнее, но не слишком сложно.Во-первых, нам нужен список всех уникальных предметов:

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] 
} 

Тогда мы можем сравнить каждое отдельное время реакции с «аномальной значением величиной» мы просто вычисленной и, если 's больше, то это:

gogn <- gogn[which(gogn$areitiRT < gogn$outlier), ] 
# this removes any cases where reaction time is NOT less than the limit 

Этот ответ соответствует тому, что вам нужно делать?

+0

Спасибо Филу за ответ. Я только около года опоздал с благодарностью. Я многому научился, прочитав ваш ответ на мою проблему :) – hugstari

Смежные вопросы