我想创建一个自定义引导程序功能。原因有几个。
我知道有些软件包(主要是boot
,rms
,caret
和其他软件包)可以帮助我解决问题,并且用途广泛,但我希望能够创建出于上述原因,我自己可以执行此功能。
据我所知,引导程序是一种重采样方法,可以从样本(本例中为数据帧)中随机抽取n个样本。然后使用这n个随机样本计算估算值。
例如,说我适合模型(不过,对于我的“示例”代码而言,这并不重要)
model <- coxph(Surv(time, cens)~groups, data=df)
我使用了生存,因为那是我现在要应用的生存方式,但是因为我有兴趣了解真正发生的事情,所以选择哪种模型真的无关紧要。
现在,让我们“重新采样”。从理论上讲,这是我每次阅读有关引导程序的知识
bstrap <- sample(df, 1000, replacement=T)
preds <- predict(model, bstrap)
mean(preds)
confint(preds) #This is probably the "faultiest" part, as C.I are supposed to be calculated by the bootstrap itself
这样的作品会吗? 我可以在其中看到一些错误的内容,但这就是我对主题的直觉促使我根据所读自学的内容进行思考的地方。 为什么不行呢?我使用与模型拟合的数据完全相同的事实是否可以解决? 是因为重采样不是字面上的意思?还有吗?
非常感谢!
答案 0 :(得分:0)
我假设您想引导预测。这是基本的实现。 (我使用lm
,但与其他模型相同。)
mod <- lm(Sepal.Length ~ Petal.Length, data = iris)
preds <- predict(mod)
#bootstrap:
n <- 1000 #number of bootstrap resamples
bootpred <- matrix(ncol = length(preds), nrow = n)
set.seed(42) #for reproducibility
#loop over n
for (i in seq_len(n)) {
bootdat <- iris[sample(n, replace = TRUE),] #bootstrap resample of data
bootmod <- lm(Sepal.Length ~ Petal.Length, data = bootdat) #fit model to bootstrap resample
bootpred[i,] <- predict(bootmod, newdata = iris) #calculate predictions from this model
}
CI <- apply(bootpred, 2, quantile, probs = c(0.025, 0.975)) #quantiles
plot(preds ~ Petal.Length, data = iris, pch = 16)
points(CI[1,] ~ Petal.Length, data = iris, col = "dark red", pch = 16)
points(CI[2,] ~ Petal.Length, data = iris, col = "dark red", pch = 16)
如果仔细研究,您会发现您缺少重要的步骤,最重要的是模型的循环和重新拟合。
此外,通常最好计算出偏差校正后的置信区间。
通常,最好执行剩余的引导程序(而不是正常的引导程序)(更稳定)。