Как исключить выбросы индивидуально для цели и участника R - PullRequest
0 голосов
/ 09 ноября 2019

Я (очень) новичок в R, и мне было интересно, могу ли я получить некоторую помощь. Я хотел бы знать, как исключить выбросы, которые представляют собой два стандартных отклонения для среднего времени реакции каждого участника и среднего времени реакции каждого целевого объекта, и заменить его на.

Мои данные выглядят так:

ptp  rt    group   target
1    1094  E       dog
1    2100  E       hat
2    918   E       dog
2    1211  E       hat
3    1142  E       dog
3    1222  E       hat
1    10    W       dog
1    993   W       hat
2    897   W       dog
2    1078  W       hat
3    4002  W       dog
3    899   W       hat

Я рассчитал среднее значение и sd для каждого участника и элемента

mean <- tapply(data$rt, data$target, mean)
sd <-  tapply(data$rt, data$target, sd)
mean <-  tapply(data$rt, data$ptp, mean)
sd <- tapply(data$rt, data$ptp, sd)

Тем не менее, я супер новичок в R и разрабатываю код для вычисления двух стандартных отклонений от среднего значения (среднее значение + 1,96 * SD и среднее значение-1,96 * SD), и преобразование всех значений, которые находятся за пределами диапазона для обоих участников, в NA немного выше моего понимания. Должен быть более простой способ, чем делать это вручную! Любая помощь будет высоко ценится.

Большое спасибо, Джен

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Чтобы получить хорошую сводную статистику, вы можете использовать aggregate().

aggregate(rt ~ target + ptp, dat, function(x) c(mean=mean(x), sd=sd(x), sd196=sd(x)*1.96))
#   target ptp    rt.mean      rt.sd rt.sd196
# 1    dog   1  552.00000  766.50375 1502.34735
# 2    hat   1 1546.50000  782.76721 1534.22373
# 3    dog   2  907.50000   14.84924   29.10452
# 4    hat   2 1144.50000   94.04520  184.32860
# 5    dog   3 2572.00000 2022.32539 3963.75777
# 6    hat   3 1060.50000  228.39549  447.65516

Для исключения (при условии, что вы хотите исключить целые наблюдения для каждого "target"), вы можете установить подмножество данных равным NA с использованием ave().

dat$rt[with(dat, ave(rt, target, ptp, FUN=function(x) mean(x)/sd(x))) > 1.96] <- NA
#    ptp   rt group target
# 1    1 1094     E    dog
# 2    1   NA     E    hat
# 3    2   NA     E    dog
# 4    2   NA     E    hat
# 5    3 1142     E    dog
# 6    3   NA     E    hat
# 7    1   10     W    dog
# 8    1   NA     W    hat
# 9    2   NA     W    dog
# 10   2   NA     W    hat
# 11   3 4002     W    dog
# 12   3   NA     W    hat

Чтобы не исключать участника целиком, не включайте ptp в ave() и выполните:

dat$rt[with(dat, ave(rt, target, FUN=function(x) mean(x)/sd(x))) > 1.96] <- NA

NB: Заранее проверьте, не присвоены ли имена функциям. В вашем примере вы создаете конфликт с функциями mean() и sd().

Данные

dat <- structure(list(ptp = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 
3L, 3L), rt = c(1094L, 2100L, 918L, 1211L, 1142L, 1222L, 10L, 
993L, 897L, 1078L, 4002L, 899L), group = c("E", "E", "E", "E", 
"E", "E", "W", "W", "W", "W", "W", "W"), target = c("dog", "hat", 
"dog", "hat", "dog", "hat", "dog", "hat", "dog", "hat", "dog", 
"hat")), row.names = c(NA, -12L), class = "data.frame")
0 голосов
/ 09 ноября 2019

По моему опыту, лучший и короткий способ - это сделать:

library(dplyr)

data_2SD <- data %>% 
  group_by(ptp,target) %>% 
  mutate_at(vars(rt), ~replace(.x, abs(scale(.x)) >= 2, NA))

В вашем случае нет таких наблюдений, сгруппированных по каждому ptp и target, которые больше или меньшечем два стандартных отклонения их среднего времени реакции:

Выход:

> data_2SD
# A tibble: 12 x 4
# Groups:   ptp, target [6]
     ptp    rt group target
   <dbl> <dbl> <chr> <chr> 
 1     1  1094 E     dog   
 2     1  2100 E     hat   
 3     2   918 E     dog   
 4     2  1211 E     hat   
 5     3  1142 E     dog   
 6     3  1222 E     hat   
 7     1    10 W     dog   
 8     1   993 W     hat   
 9     2   897 W     dog   
10     2  1078 W     hat   
11     3  4002 W     dog   
12     3   899 W     hat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...