我需要以某种特定的方式对数据集执行引导,该引导应使用一种特殊的重采样方式(通过累积的行)执行迭代。
我有一个数据集(baseEV),看起来像这三列(但有更多行):
Ntree Ntrans Xi
1 1 0.1
2 1 0.1
3 1 0.1
4 1 7
5 1 7
1 3 0.1
2 3 0.1
3 3 9
4 3 6
5 3 3
1 4 0.1
2 4 11
3 4 9
4 4 6
5 4 3
1 5 0.1
2 5 10
3 5 4
4 5 2
5 5 4
如果我通过更改Ntree来对Xi重新采样,计算该统计量,然后使用自举估算该统计量,则需要测试统计量如何变化: D =(35 * Ntree-1)/ SUM([Xi]) 但是,我还需要在更改Ntree以查看D的影响时,不应丢弃较小的Ntree值。例如,当我计算Ntree = 4时,我需要引导程序将Ntree = 1,2和3的行与Ntree = 4一起使用,而不使用Ntree = 5的数据。
但是当我应用此代码时:
library(boot)
library(dplyr)
library(tidyr)
library(broom)
AvgDEns <- function(data, indices) {
data <- data[indices,]
mean((35*(data$Ntree))-1)/sum((data$Xi))
}
bootresults2 <- baseEV %>%
group_by(Ntree) %>%
do(tidy(boot(data = ., statistic = AvgDEns , R = 200)))
bootresults2
因此,生成的引导程序仅在单独使用Ntree = 1或Ntree = 2或3等时才考虑到结果,但是我需要使用过程来保留较小的(Ntree)值行并计算与他们一起工作。 上面的代码产生以下结果
> bootresults2
# A tibble: 5 x 4
# Groups: Ntree [5]
Ntree statistic bias std.error
<dbl> <dbl> <dbl> <dbl>
1 1 85 0 0
2 2 3.25 12.9 44.7
3 3 4.71 3.34 25.6
4 4 6.62 0.252 1.43
5 5 10.2 0.298 2.01
如果我们根据需要执行这些计算,则正确的结果应该是,例如在第2行:3.19444,而不是3.25(错误的数字,该结果仅对Ntree的行仅应用了AvgDens函数= 2,不考虑Ntree = 1);对于3,应为2.3798(仅执行Ntree = 3而不考虑Ntree = 2和Ntree = 1的AvgDens的结果),而不是4.71,并且Ntreee = 5应该收敛到2.12974(使用表中所有数据计算的AvgDens )与引导程序的每次迭代。
但是,不知道如何做到这一点;我很困。建议程序的任何启示将不胜感激!