gpt4 book ai didi

r - 如何在纵向数据集中进行 Winsorize(或删除单变量异常值)

转载 作者:行者123 更新时间:2023-12-04 01:12:42 26 4
gpt4 key购买 nike

我试图弄清楚如何对纵向数据集中的个人分组观察进行 winsorize。

我从这个开始 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

如果我想删除 points 中的极端观察结果在个人( name )中,我的代码是:
do.call(rbind,by(df,df$name,function(x) x[!abs(scale(x$points)) > 2,]))

但我真正想做的是排除极端的个人(在这种情况下, MJ )。我该怎么做呢?

(PS - 在此处插入所有关于不应删除异常值的警告。这只是一个稳健性测试!)

最佳答案

我只会使用 dplyr:

test <- read.csv("test.csv", header=TRUE)
library(dplyr)

test <- test %.%
group_by(name) %.%
mutate(mean_points=mean(points))

cut_point_top <- quantile(test$mean_points, 0.95)
cut_point_bottom <- quantile(test$mean_points, 0.05)

test <- test %.%
group_by(name) %.%
mutate(outlier_top = (mean_points >= cut_point_top),
outlier_bottom = mean_points <= cut_point_bottom) %.%
filter(!outlier_top & ! outlier_bottom)

这过滤掉了 MJ 平均得分在前 2.5% 和拉里在后 2.5% 的情况。

如果要将 points 变量替换为 2.5 个百分位数的切割点,只需删除最后一个过滤器语句,如下所示:
test <- test %.% 
group_by(name) %.%
mutate(outlier_top = (mean_points >= cut_point_top),
outlier_bottom = mean_points <= cut_point_bottom)

test$points <- ifelse(test$outlier_top, cut_point_top,
ifelse(test$outlier_bottom, cut_point_bottom, test$points))

关于r - 如何在纵向数据集中进行 Winsorize(或删除单变量异常值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com