有没有办法使用 aggregate 命令按组计算不对称平均值(例如,从百分位数 0.05 到 0.5)? R-工作室
Is there a way to calculate an asymmetrical mean (e. g. from percentile 0.05 to 0.5) by group using the aggregate command? R-STUDIO
我正在计算价格数据集上的 Tukey 离群值检测算法。
问题是我需要按组计算它(同一数据集中包含的另一个变量),它与 aggregate
命令一起工作得很好,直到我需要只使用计算平均值百分位数 5 到中位数之间的数据和一个仅使用从中位数到百分位数 95 的数据。
据我所知,命令是这样的:aggregate(doc$
x, by=list(doc$
group), FUN=mean, trim = 0.05)
,如果均值被对称地修剪,取上下 5%(总计10%) 在打印结果之前从数据中提取。
我不知道如何完成接下来的步骤,我需要计算上下均值,以中位数为分界点,仍然保持上下 5% 的折扣。
medlow <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim =c(0.05,0.5))
medup <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim =c(0.5,0.95))
medtrunc <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim = 0.05)
我希望输出是每组所需的数字,但结果是
Error in mean.default(X[[i]], ...) : 'trim' must be numeric of length one.
首先,我认为您使用 aggregate
和 trim
的方式不对。 'trim' must be numeric of length one
意味着您只能从分布的上下尾部排除特定部分的数据:
df = data.frame(
gender = c(
"male","male","male","male","female","female","female", "female"
),
score = rnorm(8, 10, 2)
)
aggregate(score ~ gender, data = df, mean, trim = 0.1)
gender score
1 female 11.385263
2 male 9.954465
对于基于中位数的拆分并计算拆分数据的trim中位数,您可以通过简单的[=18=创建一个新变量MedianSplit
来轻松拆分数据框]循环:
df$MedianSplit <- 0
for (i in 1:nrow(df)) {
if (df$score[i] <= median(df$score)) {
df$MedianSplit[i] = "lower"
} else {
df$MedianSplit[i] = "upper"
}
}
df
gender score MedianSplit
1 male 7.062605 lower
2 male 9.373052 upper
3 male 6.592681 lower
4 male 7.298971 lower
5 female 7.795813 lower
6 female 7.800914 upper
7 female 12.431028 upper
8 female 10.661753 upper
然后,使用 aggregate
计算 trimmed 均值:
低于中位数的数据(即、[0, 0.5]
)
aggregate(
score ~ gender,
data = df[ which(df$MedianSplit == "lower"), ],
mean, trim = 0.05
)
gender score
1 female 7.795813
2 male 6.984752
对于那些高于中位数的人(即 [0.5, 1]):
汇总(
分数 ~ 性别,
data = df[ which(df$MedianSplit == "upper"), ],
意思是,trim = 0.05
)
gender score
1 female 10.297898
2 male 9.373052
我正在计算价格数据集上的 Tukey 离群值检测算法。
问题是我需要按组计算它(同一数据集中包含的另一个变量),它与 aggregate
命令一起工作得很好,直到我需要只使用计算平均值百分位数 5 到中位数之间的数据和一个仅使用从中位数到百分位数 95 的数据。
据我所知,命令是这样的:aggregate(doc$
x, by=list(doc$
group), FUN=mean, trim = 0.05)
,如果均值被对称地修剪,取上下 5%(总计10%) 在打印结果之前从数据中提取。
我不知道如何完成接下来的步骤,我需要计算上下均值,以中位数为分界点,仍然保持上下 5% 的折扣。
medlow <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim =c(0.05,0.5))
medup <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim =c(0.5,0.95))
medtrunc <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim = 0.05)
我希望输出是每组所需的数字,但结果是
Error in mean.default(X[[i]], ...) : 'trim' must be numeric of length one.
首先,我认为您使用 aggregate
和 trim
的方式不对。 'trim' must be numeric of length one
意味着您只能从分布的上下尾部排除特定部分的数据:
df = data.frame(
gender = c(
"male","male","male","male","female","female","female", "female"
),
score = rnorm(8, 10, 2)
)
aggregate(score ~ gender, data = df, mean, trim = 0.1)
gender score
1 female 11.385263
2 male 9.954465
对于基于中位数的拆分并计算拆分数据的trim中位数,您可以通过简单的[=18=创建一个新变量MedianSplit
来轻松拆分数据框]循环:
df$MedianSplit <- 0
for (i in 1:nrow(df)) {
if (df$score[i] <= median(df$score)) {
df$MedianSplit[i] = "lower"
} else {
df$MedianSplit[i] = "upper"
}
}
df
gender score MedianSplit
1 male 7.062605 lower
2 male 9.373052 upper
3 male 6.592681 lower
4 male 7.298971 lower
5 female 7.795813 lower
6 female 7.800914 upper
7 female 12.431028 upper
8 female 10.661753 upper
然后,使用 aggregate
计算 trimmed 均值:
低于中位数的数据(即、[0, 0.5]
)
aggregate(
score ~ gender,
data = df[ which(df$MedianSplit == "lower"), ],
mean, trim = 0.05
)
gender score
1 female 7.795813
2 male 6.984752
对于那些高于中位数的人(即 [0.5, 1]):
汇总( 分数 ~ 性别, data = df[ which(df$MedianSplit == "upper"), ], 意思是,trim = 0.05 )
gender score
1 female 10.297898
2 male 9.373052