如何在 R 中创建自定义 bootstrap 函数?
How to create a custom bootstrap function in R?
我想创建一个自定义 bootstrap 函数。原因有几个。
- 更好地理解(或者说理解)过程
- 推断 bootstrap 在其他地方重新采样而不依赖于包
我知道有一些软件包(主要是 boot
、rms
、caret
等)可以帮助我解决我的问题并且用途广泛,但我希望能够由于上述原因,自己创建一个功能。
据我了解,bootstrap 是一种重采样方法,与从样本(在我们的例子中是数据帧)中随机抽取 n 个样本一致。然后用这n个随机样本来计算估计值。
所以,例如,假设我适合一个模型(无论如何,这对我的 "example" 代码来说真的无关紧要)
model <- coxph(Surv(time, cens)~groups, data=df)
我使用了生存模式,因为这是我现在想要应用它的地方,但因为我有兴趣了解真正发生的事情,所以我们选择哪种模型并不重要。
现在,让我们"resample"。从理论上讲,这是我每次阅读有关 bootstrap
时的理解
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
这样的东西行得通吗?
我可以在那里看到一些错误的东西,但这正是我对这个话题的直觉驱使我根据我读到的 bootstrap 来思考的地方。
为什么那行不通?这可能是因为我使用的数据与我的模型完全相同吗?
是因为重采样不是那么字面意思吗?还有别的吗?
非常感谢!
我假设您想 bootstrap 预测。这是基本的实现。 (我用的是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)
如果你仔细研究这个,你会发现你错过了重要的步骤,最重要的是模型的循环和改装。
此外,通常最好计算偏差校正置信区间。
通常实际执行剩余 bootstrapping 比正常 bootstrapping 更好(更稳定)。
我想创建一个自定义 bootstrap 函数。原因有几个。
- 更好地理解(或者说理解)过程
- 推断 bootstrap 在其他地方重新采样而不依赖于包
我知道有一些软件包(主要是 boot
、rms
、caret
等)可以帮助我解决我的问题并且用途广泛,但我希望能够由于上述原因,自己创建一个功能。
据我了解,bootstrap 是一种重采样方法,与从样本(在我们的例子中是数据帧)中随机抽取 n 个样本一致。然后用这n个随机样本来计算估计值。
所以,例如,假设我适合一个模型(无论如何,这对我的 "example" 代码来说真的无关紧要)
model <- coxph(Surv(time, cens)~groups, data=df)
我使用了生存模式,因为这是我现在想要应用它的地方,但因为我有兴趣了解真正发生的事情,所以我们选择哪种模型并不重要。
现在,让我们"resample"。从理论上讲,这是我每次阅读有关 bootstrap
时的理解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
这样的东西行得通吗? 我可以在那里看到一些错误的东西,但这正是我对这个话题的直觉驱使我根据我读到的 bootstrap 来思考的地方。 为什么那行不通?这可能是因为我使用的数据与我的模型完全相同吗? 是因为重采样不是那么字面意思吗?还有别的吗?
非常感谢!
我假设您想 bootstrap 预测。这是基本的实现。 (我用的是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)
如果你仔细研究这个,你会发现你错过了重要的步骤,最重要的是模型的循环和改装。
此外,通常最好计算偏差校正置信区间。
通常实际执行剩余 bootstrapping 比正常 bootstrapping 更好(更稳定)。