r - 如何在 R 中创建自定义引导函数?
问题描述
我想创建一个自定义引导函数。原因有几个。
- 更好地理解(或者说理解)过程
- 在不依赖包的情况下推断其他地方的引导重采样
我知道有一些包(主要是boot
,rms
和caret
其他包)可以帮助我解决我的问题并且用途广泛,但由于上述原因,我希望能够自己创建一个函数。
据我了解,bootstrap 是一种重采样方法,与从样本(在我们的案例中为数据帧)中抽取 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
像这样的东西会起作用吗?我可以在那里看到一些错误的东西,但这就是我对这个主题的直觉驱使我根据我所读到的关于引导程序的内容进行思考的地方。为什么那行不通?可能是因为我使用的数据与我的模型所用的数据完全相同吗?是因为重采样不是那么字面意思吗?还有什么?
非常感谢!
解决方案
我假设您想引导预测。这是基本的实现。(我使用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)
如果你仔细研究这个,你会发现你错过了重要的步骤,最重要的是循环和模型的改装。
此外,通常最好计算一个偏差校正的置信区间。
通常,实际执行剩余引导而不是正常引导会更好(更稳定)。
推荐阅读
- ios - 如何以编程方式设置字体大小以适应 swift4 中的 numberOflines 值
- ios - Swift 4:获取 UIImage 中像素的 RGB 值
- ios - 获取最后 10 个 NSData
- amazon-web-services - 使用 lambda 的解决方法 aws apigateway 超时 - 异步处理
- php - 每个域加载 Xdebug?面板
- api - 是否可以在 DataProvider 一次迭代后停止执行测试方法而不运行所有迭代?如果是,如何?
- linux - 期望:如何拆分没有分隔符的数字?
- docker - 要发布的私有 docker 容器
- powershell - 奇怪的 Get-Item 行为
- r - ggplot2 - 按颜色分隔箱线图标签