R-重新采样加权组在数据表中表示,并显示所有复制中等级顺序的频率



我有一个数据集(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次:

  1. 使用替换原始数据集的样品计算每个组的加权平均值。使用数据很容易实现:

    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]
    

注意:重新采样时,没有确切数量的观测值。

  1. 接下来,我想知道组的排名顺序是指:

    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次复制,用rbindlistdcast绑定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

最新更新