我有一个带有原始分数和样本权重的数据文件。现在我想使用心理包的描述功能,同时考虑样本的权重。
是否有人知道如何做到这一点,或者是否有这样的函数,它的功能与心理学完全相同: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、峰度、偏度等也是基于样本加权平均值?
发布于 2020-06-08 21:39:46
由于心理包不处理权重,并且没有可供选择的包服务于加权描述符的等效集合,因此必须从不同的包中挑选,并像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一样。https://stackoverflow.com/questions/29748042
复制相似问题