我正在尝试从拟合模型中引导一个值(曲线的最大斜率)。虽然我认为代码可能更有效,但我认为它通常有效(关于如何提高效率的建议也会受到欢迎)。我遇到的问题是,当我得到最终样本值时,其中一个单元格中有Inf
会阻止我获得置信区间。我不确定这是一个引导问题还是我编写它的方式很简单。示例代码:
library(boot)
library(dplyr)
df <- data.frame (id=rep(1:10,each=10),
time1=rep(1:10,10),
ff=runif(100, 100, 150),
gg=runif(100, 120, 170))
set.seed(10)
#function
maxx<-function(formula, data,varr,indices) {
data <- data[indices,] # allows boot to select sample
fit <- lm(formula, data=data)
data$fit<-fit$fitted.values
data<-filter(data,time1>5)
data1<-data %>% group_by_(varr) %>% mutate(derivative = c(NA,diff(fit) / diff(time1))) %>%
group_by(id) %>%
slice(which.max(derivative)) %>%
ungroup() %>%
as.data.frame()
return(mean(data1$derivative,na.rm = TRUE))
}
res <- boot(data=df, statistic=maxx,
R=10, formula=ff~gg,varr="id")
这可行但由于其中一个单元格中的Inf
而无法获得SE
R>res
ORDINARY NONPARAMETRIC BOOTSTRAP
Call:
boot(data = df, statistic = maxx, R = 10, formula = ff ~ gg,
varr = "id")
Bootstrap Statistics :
original bias std. error
t1* 0.1726803 Inf NaN
res
res$t
我们可以通过进一步探索来看到这一点:
R>res$t
[,1]
[1,] 0.50399242
[2,] 0.52171509
[3,] 0.04568459
[4,] 1.41317481
[5,] 0.39741115
[6,] 0.10703703
[7,] 0.52206909
[8,] 0.91624253
[9,] Inf
[10,] 0.05076168
R>boot.ci(res, type="normal")
Error in ci.out[[4L]] : subscript out of bounds
也许我错过了一些内容,但我认为return(mean(data1$derivative,na.rm = TRUE))
会解决NA
的任何问题。有人有什么建议吗?我猜这是一个小修复。这是我第一次运行bootstrap,如果我正在做一些天真的事情,那么道歉。如果有人知道如何使整体代码更高效,那将是很好的,因为我运行的是大型随机效果模型,而不是简单的模型。感谢
答案 0 :(得分:1)
由于boot
重新取样,您可能会在给定样本中获得给定 id 的 time1 的重复值。发生这种情况时,您的导数计算diff(fit)/diff(time)
的计算结果为0/0,该值应返回NaN。对于maxx
函数的其余部分,NaN值本身不应该存在问题(虽然我不清楚你要做什么),但我怀疑由于浮点不准确diff(fit)
有时返回非零值,除以零以生成Inf或-Inf。 which.max
和mean
函数不会忽略Inf,因此您的maxx
函数偶尔会返回Inf。