Bootstrap R 中的加权平均值
Bootstrap of weighted means in R
我有一个包含 27 个样本的数据框,分为 3 个层。我想复制500次加权平均值,其中平均值是在随机选择的3个样本中计算的,权重是层的相对面积。
我的想法是为每个层创建一个选择循环并计算平均值。我能够计算选择的简单平均值,但我无法计算加权平均值(我不知道如何一起提取权重和值):
#data
DF<-data.frame(v= c(16,42,63,15,42,63,85,16,43),
s= c(1,3,2,2,1,3,3,1,2),
w=c(0.2,0.5,0.3,0.3,0.2,0.5,0.5,0.2,0.3),
stringsAsFactors=T)
#simple mean
x<-c()
for (i in 1:3){
x.tm<-sample(subset(DF$v,DF$s==i),2,replace=T)
x<-c(x,x.tm)
d<-mean(x)}
此外,我对 replicate
函数以及在其中插入加权平均值的方法感到困惑。例如,尝试使用简单的方法我得到了一个空列表:
t<-replicate(500,{
for (i in 1:3){
x.tm<-sample(subset(DF$v,DF$s==i),2, replace=T)
x<-c(x,x.tm)
d<-mean(x)
}
})
我也试过使用 boot::boot 命令,但结果是一样的。
这是一个可行的方法。
为 s
=1,2,3 选择 3 个样本并在 v
和 w
之间提供 weighted.mean
的函数
fun<-function(DF) {
s<-c(1,2,3)
DF_sub_1<-DF[as.numeric(as.character(DF$s))==s[1],]
DF_sub_2<-DF[as.numeric(as.character(DF$s))==s[2],]
DF_sub_3<-DF[as.numeric(as.character(DF$s))==s[3],]
x.tm_1<-sample(nrow(DF_sub_1),2,replace=T)
x.tm_2<-sample(nrow(DF_sub_2),2,replace=T)
x.tm_3<-sample(nrow(DF_sub_3),2,replace=T)
DF_sample<-rbind(DF_sub_1[x.tm_1,],DF_sub_2[x.tm_2,],DF_sub_3[x.tm_3,])
out<-weighted.mean(DF_sample[,1],DF_sample[,3])
return(out)
}
500次复制
output<-replicate(500,fun(DF))
500 个样本,其中 3 个样本的加权平均值
output
[1] 46.00 41.15 58.70 51.50 61.70 49.00 58.70 61.70 50.60 49.00 44.70 46.25 46.40 52.80 67.20 32.90 36.55
[18] 47.95 42.05 45.35 40.75 57.10 40.75 44.70 51.85 48.90 40.10 43.75 54.40 53.20 47.95 51.50 51.90 47.30
[35] 58.30 54.50...
我有一个包含 27 个样本的数据框,分为 3 个层。我想复制500次加权平均值,其中平均值是在随机选择的3个样本中计算的,权重是层的相对面积。
我的想法是为每个层创建一个选择循环并计算平均值。我能够计算选择的简单平均值,但我无法计算加权平均值(我不知道如何一起提取权重和值):
#data
DF<-data.frame(v= c(16,42,63,15,42,63,85,16,43),
s= c(1,3,2,2,1,3,3,1,2),
w=c(0.2,0.5,0.3,0.3,0.2,0.5,0.5,0.2,0.3),
stringsAsFactors=T)
#simple mean
x<-c()
for (i in 1:3){
x.tm<-sample(subset(DF$v,DF$s==i),2,replace=T)
x<-c(x,x.tm)
d<-mean(x)}
此外,我对 replicate
函数以及在其中插入加权平均值的方法感到困惑。例如,尝试使用简单的方法我得到了一个空列表:
t<-replicate(500,{
for (i in 1:3){
x.tm<-sample(subset(DF$v,DF$s==i),2, replace=T)
x<-c(x,x.tm)
d<-mean(x)
}
})
我也试过使用 boot::boot 命令,但结果是一样的。
这是一个可行的方法。
为 s
=1,2,3 选择 3 个样本并在 v
和 w
weighted.mean
的函数
fun<-function(DF) {
s<-c(1,2,3)
DF_sub_1<-DF[as.numeric(as.character(DF$s))==s[1],]
DF_sub_2<-DF[as.numeric(as.character(DF$s))==s[2],]
DF_sub_3<-DF[as.numeric(as.character(DF$s))==s[3],]
x.tm_1<-sample(nrow(DF_sub_1),2,replace=T)
x.tm_2<-sample(nrow(DF_sub_2),2,replace=T)
x.tm_3<-sample(nrow(DF_sub_3),2,replace=T)
DF_sample<-rbind(DF_sub_1[x.tm_1,],DF_sub_2[x.tm_2,],DF_sub_3[x.tm_3,])
out<-weighted.mean(DF_sample[,1],DF_sample[,3])
return(out)
}
500次复制
output<-replicate(500,fun(DF))
500 个样本,其中 3 个样本的加权平均值
output
[1] 46.00 41.15 58.70 51.50 61.70 49.00 58.70 61.70 50.60 49.00 44.70 46.25 46.40 52.80 67.20 32.90 36.55
[18] 47.95 42.05 45.35 40.75 57.10 40.75 44.70 51.85 48.90 40.10 43.75 54.40 53.20 47.95 51.50 51.90 47.30
[35] 58.30 54.50...