繁体   English   中英

R:如何使用带有样本权重的 describe()

[英]R: How to use describe() with sample weights

我有一个包含原始分数和样本权重的数据文件。 现在我想使用 psych 包的 describe 函数,同时考虑样本权重。

有谁知道如何做到这一点,或者是否有与 psych::describe() 完全相同但可以处理样本权重的函数?

下一个示例将深入了解我打算做什么。

library(psych)
describe(c(2,3,4,1,4,5,3,3))
#gives:
     vars n mean   sd median trimmed  mad min max range skew kurtosis   se
1    1 8 3.12 1.25      3    3.12 1.48   1   5     4 -0.2    -1.16 0.44

样本权重为:

c(0.2,0.5,1.2,1.5,0.2,0.6,0.6,1.1)

加权平均值将是(如果我错了,请纠正我):

sum(c(2,3,4,1,4,5,3,3)* c(0.2,0.5,1.2,1.5,0.2,0.6,0.6,1.1))/sum(c(0.2,0.5,1.2,1.5,0.2,0.6,0.6,1.1))
[1] 2.898305

所以这当然不同于未加权的平均值。 如何确保报告的 SD、峰态、偏度等也基于样本加权平均值?

由于 psych 包不处理权重,并且没有替代的包可以提供等效的加权描述集合,因此必须从不同的包中挑选并像psych::describe()那样组合输出。

此外,加权描述的计算通常需要与数据中的每个案例以及分配给这些案例的各个权重一起提供,因此“快捷方式”将不起作用。 (例如,加权标准误差将等于加权标准偏差除以样本数量的平方根。)

这是一个简单的包装函数,它模仿了psych::describe()对加权数据的行为:

    wtd.describe <- function(x, weights=NULL, trim=.1){
      require(TAM)
      require(diagis)
      require(robsurvey)
      out <- NULL
      # Handling simple vectors
      x <- as.data.frame(x)
      # If no weights given, all weights = 1
      if(is.null(weights)) {weights <- seq(1, nrow(x))}
      i <- 1
      for(colname in colnames(x)){
        # Removing rows with missing data or weight
        d <- x[complete.cases(x[[colname]], weights), , drop=FALSE][[colname]]
        w <- weights[complete.cases(x[[colname]], weights)]
        wd <- data.frame(
          "vars"     = i,
          "n"        = length(d),
          "mean"     = TAM::weighted_mean(d, w = w),
          "sd"       = TAM::weighted_sd(d, w = w),
          "median"   = robsurvey::weighted_median(d, w = w, na.rm = TRUE),
          "trimmed"  = robsurvey::weighted_mean_trimmed(d, w = w, LB = trim, UB = (1 - trim), na.rm = TRUE),  
          "mad"      = robsurvey::weighted_mad(d, w = w, na.rm = TRUE, constant = 1.4826),
          "min"      = min(d),
          "max"      = max(d),
          "range"    = max(d) - min(d),
          "skew"     = TAM::weighted_skewness(d, w = w),
          "kurtosis" = TAM::weighted_kurtosis(d, w = w),
          "se"       = diagis::weighted_se(d, w = w, na.rm = TRUE),
          row.names  = colname
        )
        i <- i+1
        out <- rbind(out, wd)
      }
      return(out)
    }

请注意:

  • 我没有考虑使用的包的质量和维护状态。 随意挑选你自己的并交换它们。
  • psych:describe()大部分便利参数都没有被上述函数模拟。
  • na.rm = TRUE是隐含的,因为 TAM 包确实隐含na.rm = TRUE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM