[英]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.