【问题标题】:How to create a custom bootstrap function in R?如何在 R 中创建自定义引导函数?
【发布时间】:2019-08-01 12:38:50
【问题描述】:

我想创建一个自定义引导函数。原因有很多。

  • 更好地理解(或者说理解)流程
  • 在不依赖包的情况下推断其他地方的引导重采样

我知道有一些包(主要是 bootrmscaret 和其他包)可以帮助我解决我的问题并且用途广泛,但我希望能够自己创建一个函数用于原因如上。

据我了解,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

这样的东西会起作用吗? 我可以在那里看到一些错误的东西,但这就是我对这个主题的直觉驱使我根据我所读到的关于引导程序的内容进行思考的地方。 为什么那行不通?可能是因为我使用的数据与我的模型所用的数据完全相同吗? 是因为重采样不是那么字面意思吗?还有什么?

非常感谢!

【问题讨论】:

    标签: r statistics-bootstrap


    【解决方案1】:

    我假设您想要引导预测。这是基本的实现。 (我用的是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)
    

    如果您仔细研究这一点,您会发现您遗漏了重要的步骤,最重要的是模型的循环和改装

    此外,通常最好计算一个经过偏差校正的置信区间。

    通常实际执行剩余引导而不是正常引导会更好(更稳定)。

    【讨论】:

    • 所以,如果我理解这一点,你正在重新采样,然后用重新采样的观察拟合模型,然后用你的“重新采样模型”拟合整个样本。与我的重采样建议相比,这样做有什么区别?我可以想象它与为已经“完整”的模​​型拟合更大的样本有关。但如果是这种情况,那么我不能在 400 观察模型上使用 bootstrap = 1000 ......我说的对吗?谢谢!
    • 如果您在不重新拟合模型的情况下对重采样值进行预测,您将得到完全相同的预测(在这些值下)。该练习的目的是什么?
    • 当然你可以设置n &lt;- 1000如果你的输入data.frame中有400行。
    • 是的,你是对的,我专注于使用我的所有数据来拟合模型我并没有真正意识到拟合重新采样的“拟合”数据的废话。我的错。所以,关于我问题的第二部分:这可靠吗?这是真正的引导重采样吗?我的意思是,我们在重新采样的集合而不是我们的“原始”样本上拟合模型是否会失去力量?如果有人会使用这个“引导程序”而不是预先编写的程序(例如我在帖子中提到的包),那可以吗,或者这只是某种“合理但不明智”的事情?跨度>
    • 我建议你去读一读。我真的不能通过 cmets 给你一个统计讲座。我这里的实现相当于启动包的作用。这里我实现了case resampling。如答案中所述,我通常会使用residual resampling 进行回归。我在这个答案中展示了如何使用引导包做到这一点:stats.stackexchange.com/a/369613/11849
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2011-01-07
    • 2019-03-16
    相关资源
    最近更新 更多