В моих реальных данных у меня есть несколько выбросов для нескольких переменных.Мои данные выглядят примерно так, как показано ниже, но числа абсолютно случайны.Я хотел бы вытащить все точки данных, которые больше или меньше 2 SD, используя винсоризацию.
df<-read.table(header=T, text="id, group, test1, test2
1, 0, 57, 82
2, 0, 77, 80
3, 0, 67, 90
4, 0, 15, 70
5, 0, 58, 72
6, 1, 18, 44
7, 1, 44, 44
8, 1, 18, 46
9, 1, 20, 44
10, 1, 14, 38")
До сих пор я определил свои выбросы для переменных test1 и test2 для каждой группы, используя следующуюкод:
outlier <- function(x, SD = 2){
mu <- mean(x)
sigma <- sd(x)
out <- x < mu - SD*sigma | x > mu + SD*sigma
out
}
# identify the outliers for each variable by each group
with(df, ave(test1, group, FUN = outlier))
with(df, ave(test2, group, FUN = outlier))
# add these new-found outliers to the data set
df$out1 <- with(df, ave(test1, group, FUN = outlier))
df$out2 <- with(df, ave(test2, group, FUN = outlier))
Мне известна функция winsorize в пакете robustHD, но я не уверен: 1).как адаптировать команду к 90% винсоризации (2 SD), 2).обеспечение винзоризации для 2 разных групп, 3).и включение нескольких переменных в эту winsorization.
Дополнительно, но не обязательно ... есть ли способ увидеть, что функция 'winsorize' изменила числа с тех, на которые числа были изменены?