首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:如何在样本权重中使用describe()

R:如何在样本权重中使用describe()
EN

Stack Overflow用户
提问于 2015-04-20 12:34:28
回答 1查看 421关注 0票数 3

我有一个带有原始分数和样本权重的数据文件。现在我想使用心理包的描述功能,同时考虑样本的权重。

是否有人知道如何做到这一点,或者是否有这样的函数,它的功能与心理学完全相同:describe(),但能够处理示例权重?

下一个例子将给出一些关于我打算做什么的洞察力。

代码语言:javascript
复制
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

样本权重如下:

代码语言:javascript
复制
c(0.2,0.5,1.2,1.5,0.2,0.6,0.6,1.1)

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

代码语言:javascript
复制
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、峰度、偏度等也是基于样本加权平均值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 21:39:46

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

此外,加权描述符的计算通常需要与数据中的每一种情况以及分配给这些情况的单个权重一起提供,因此“快捷方式”无法工作。(例如,加权标准误差将而不是等于加权标准差除以样本大小的平方根)。

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

代码语言:javascript
复制
    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一样。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29748042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档