我有一个数据集(DF(,大约3500个观测值嵌套在11组中(a:k(。我的目标变量是净启动子得分(NP(,该得分为每个观察/受访者的三个值0、1或-1之一(但本质上是目标变量的类型都不重要:可以使用任何数值变量(。此外,目标变量通过变量"权重"加权。
遵循Akrun的评论,这是一些生成示例数据的代码:
# Function to randomly generate weights
rtnorm <- function(n, mean, sd, a = -Inf, b = Inf){
qnorm(runif(n, pnorm(a, mean, sd), pnorm(b, mean, sd)), mean, sd)
}
# Generate variables
set.seed(7)
nps <- round(runif(3500, min=-1, max=1), 0) # nps value which takes 1, 0 or -1
group <- sample(letters[1:11], 3500, TRUE) # groups
weight <- rtnorm(n=3500, mean=1, sd=1, a=0.04, b=16) # weights between 0.04 and 16
# Build data frame
df = data.frame(group, nps, weight)
我想复制以下步骤约10000次:
使用替换原始数据集的样品计算每个组的加权平均值。使用数据很容易实现:
dt_1 <- setDT(df[sample(1:nrow(df), 3500, replace=TRUE),] )[ , .(nps = weighted.mean(nps, w=weight, na.rm = TRUE), # this is the weighted target variable N=(.N) # this shows the number of observations drawn for each group as information only ), by = group]
注意:重新采样时,没有确切数量的观测值。
。接下来,我想知道组的排名顺序是指:
dt_1$rank <- rank(-dt_1$nps, na.last = NA, ties.method= "random")
基本上,我想重复10000次以上的两个步骤。
由于这10000个复制,我想创建一个表格,该表显示每个组(a:k(在所有10000个复制中,rank1,rank2,rank3,…,等级11,排名11。
基本上我所需的输出应该看起来像这样(我只用数字填充了第一列'a',但是所有组都应显示该组在10000重复中的位置的平均值(。
> a b c d e f g h
rank1 100 ... ... ... ... ... ... ...
rank2 500 ...
rank3 1000 ...
rank4 1500 ...
rank5 3500 ...
rank6 1500 ...
rank8 1000 ...
rank9 500 ...
rank10 250 ...
rank11 150 ...
任何其他格式都可以正常工作,只要它显示了一个组的数量/复制。
我不知道如何将上述两个步骤与"重复"函数组合在一起,以及如何按每个组和等级总结结果。
我将感谢任何帮助。
我们可以创建一个函数来在采样后创建'级别'列,然后使用replicate
,进行相同的n
次复制,用rbindlist
和dcast
绑定list
元素,以绑定到'中宽格格式
library(data.table)
fdtrank <- function(dat, n1) {
df1 <- as.data.table(df)
dt_1 <- df1[sample(nrow(df1), n1, replace = TRUE)]
dt_1[, .(nps = weighted.mean(nps, w = weight, na.rm = TRUE), N = .N), by = group
][, rank := rank(-nps, na.last = NA, ties.method = "random")][]
}
n <- 10000
lst <- replicate(n, fdtrank(df, 3500), simplify = FALSE)
res <- dcast(rbindlist(lst)[, rank := factor(rank, levels = 1:11,
labels = paste0("rank", 1:11))], rank ~ group, length, value.var = "rank")
res
# rank a b c d e f g h i j k
# 1: rank1 633 234 2874 1892 23 5 185 747 1426 1050 931
# 2: rank2 891 401 1767 1625 53 17 360 1020 1482 1167 1217
# 3: rank3 1079 599 1330 1357 80 32 481 1130 1388 1227 1297
# 4: rank4 1217 741 1115 1235 126 60 642 1196 1202 1189 1277
# 5: rank5 1240 974 841 1036 230 84 819 1298 1096 1172 1210
# 6: rank6 1260 1091 666 909 319 181 992 1244 1028 1142 1168
# 7: rank7 1202 1292 528 734 528 313 1350 1164 868 989 1032
# 8: rank8 1066 1485 410 570 808 650 1583 990 695 895 848
# 9: rank9 818 1565 292 401 1476 1168 1731 732 492 692 633
#10: rank10 449 1097 131 186 2896 2745 1237 363 249 349 298
#11: rank11 145 521 46 55 3461 4745 620 116 74 128 89