对数据 table 中的加权组进行重新采样并显示所有复制中排名顺序的频率
Resample weighted group means in data table and show the frequencies of the rank order over all replications
我有一个数据集 (df),其中大约 3500 个观察结果嵌套在 11 个组 (a:k) 中。我的目标变量是净推荐值 (nps),每个 observation/respondent 取三个值 0、1 或 -1 之一(但基本上目标变量的类型无关紧要:可以使用任何数值变量)。此外,目标变量用变量 "weight".
加权
根据 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 次:
使用替换原始数据集的样本计算每组的加权平均值。使用 data.table:
很容易实现
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 次重复的结果,我想创建一个 table,它显示每个组 (a:k) 结果出现在 rank1, rank2, rank3, …, rank 上的次数所有 10000 次重复中有 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 ...
任何其他格式也可以,只要它能显示有多少 cases/replications 一个小组获得了哪个排名。
我不知道如何将上述两个步骤与 'replicate' 函数结合起来,以及如何按组和排名汇总结果。
如有任何帮助,我将不胜感激。
我们可以创建一个函数,在采样后创建 'rank' 列,然后使用 replicate
,复制相同的 n
次,绑定 list
rbindlist
和 dcast
的元素转换为 'wide' 格式
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
我有一个数据集 (df),其中大约 3500 个观察结果嵌套在 11 个组 (a:k) 中。我的目标变量是净推荐值 (nps),每个 observation/respondent 取三个值 0、1 或 -1 之一(但基本上目标变量的类型无关紧要:可以使用任何数值变量)。此外,目标变量用变量 "weight".
加权根据 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 次:
使用替换原始数据集的样本计算每组的加权平均值。使用 data.table:
很容易实现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 次重复的结果,我想创建一个 table,它显示每个组 (a:k) 结果出现在 rank1, rank2, rank3, …, rank 上的次数所有 10000 次重复中有 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 ...
任何其他格式也可以,只要它能显示有多少 cases/replications 一个小组获得了哪个排名。
我不知道如何将上述两个步骤与 'replicate' 函数结合起来,以及如何按组和排名汇总结果。
如有任何帮助,我将不胜感激。
我们可以创建一个函数,在采样后创建 'rank' 列,然后使用 replicate
,复制相同的 n
次,绑定 list
rbindlist
和 dcast
的元素转换为 'wide' 格式
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