Я пытаюсь выяснить, как проводить наблюдения, сгруппированные индивидами в продольном наборе данных.
Я начал с этого отличного ответа о том, как удалить данные > 2 стандартных отклонения от среднего значения переменной. Автор также помогает показать, как это сделать в рамках категорий.
Мой вариант использования немного отличается: у меня есть продольный набор данных, и я хочу удалить людей, которые со временем систематически показывают, что это выбросы. Вместо того, чтобы снимать экстремальные наблюдения внутри предметов, я хотел бы либо полностью исключить этих лиц (обрезать данные), либо заменить нижний и верхний 2,5% значением разреза (winsorizing, см. http://en.wikipedia.org/wiki/Winsorising).
Например, мои данные с длинной формой могут выглядеть так:
name time points
MJ 1 998
MJ 2 1000
MJ 3 998
MJ 4 3000
MJ 5 998
MJ 5 420
MJ 6 999
MJ 7 998
Lebron 1 9
Lebron 2 1
Lebron 3 3
Lebron 4 900
Lebron 5 4
Lebron 5 4
Lebron 6 3
Lebron 7 8
Kobe 1 2
Kobe 2 1
Kobe 3 4
Kobe 4 2
Kobe 5 1000
Kobe 5 4
Kobe 6 7
Kobe 7 9
Larry 1 2
Larry 2 1
Larry 3 4
Larry 4 2
Larry 5 800
Larry 5 4
Larry 6 7
Larry 7 9
Если бы я хотел удалить экстремальные наблюдения в points
внутри индивидуумов (name
), мой код:
do.call(rbind,by(df,df$name,function(x) x[!abs(scale(x$points)) > 2,]))
Но я действительно хочу исключить ИНДИВИДУАЛЬНЫЙ, который является экстремальным (в данном случае MJ
). Как мне это сделать?
(P.S.) - вставьте здесь все оговорки о том, как нельзя удалять выбросы. Это просто тест надежности!)