有没有办法使用 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.

首先,我认为您使用 aggregatetrim 的方式不对。 '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