【发布时间】:2014-03-23 17:09:32
【问题描述】:
我试图弄清楚如何对纵向数据集中按个人分组的观察结果进行缩尾处理。
我从这个excellent answer 开始讨论如何从变量的平均值中删除>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
如果我想在个人 (name) 中删除 points 中的极端观察,我的代码将是:
do.call(rbind,by(df,df$name,function(x) x[!abs(scale(x$points)) > 2,]))
但我真正想做的是排除极端的个人(在这种情况下,MJ)。我该怎么做呢?
(附注 - 在这里插入所有关于不应删除异常值的警告。这只是一个稳健性测试!)
【问题讨论】:
-
嗯,作为第一步,您需要定义汇总统计数据,根据该统计数据将某人识别为异常值。该统计数据是什么,与其他值的距离应该被视为异常值吗?
-
是的,这根本不应该是一个问题,除了我们不知道你会用什么指标来定义 MJ 是极端的。
-
@JoshO'Brien 感谢您指出这一点;我将对我的问题进行澄清。最初的目标是进行 95% 的 Winsorization,其中对底部 2.5% 的个体和顶部 2.5% 的个体的观察值将替换为切割值。 (见:en.wikipedia.org/wiki/Winsorising)。但是,只是“修剪”这些观察结果的答案同样有用,因为问题在于识别而不是删除?
标签: r