关于 R 中 bootstrap 回归中的残差存储

regarding residual storing in bootstrap regression in R

我正在尝试通过从原始样本中对 X 和 Y 重新采样来进行 bootstrapping 回归。 我采用了更手动的方法(不使用任何包) 这是我到目前为止的工作,

set.seed(326581)
X1=rnorm(10,0,1)
Y1=rnorm(10,0,2)
data=data.frame(X1,Y1)

lst <- replicate(
  100,
  df.smpl <- data %>% sample_n(10, replace = T),
  simplify = FALSE)

该列表包含 100 个样本,其中每个样本有 2 列 (X,Y),样本大小为 10。这些是 bootstrap 个样本。

为了获得 bootstrap 残差,我将 X 和 Y 列分成两个单独的数据框,如下所示,

new1=data.frame(lapply(lst, `[`, 'X1'))

new2=data.frame(lapply(lst, `[`, 'Y1))

之后,我尝试使用以下代码存储从每个模型拟合得到的残差,

res=c()
for(i in 1:100)
{
 res[i]=residuals(lm(new2[,i]~new1[,i]))
}

但似乎有些不对劲。任何人都可以帮我弄清楚吗?

顺便问一下,还有比这更简单的方法吗?

你这样做太复杂了。将对象存储在 list 中的全部优点是您可以轻松地循环遍历它们,例如lapplysapply.

因此,例如,要存储线性模型拟合的残差,您可以这样做

res <- lapply(lst, function(df) residuals(lm(Y1 ~ X1, data = df)))

这将 lm(Y1 ~ X1) 形式的线性模型拟合到 lst 中的所有 data.frame,并将残差存储在包含 100 个向量的 list

length(res)
#[1] 100

您还可以存储基于 lm 适合所有 100 个采样 data.frame 的残差,方法是使用 sapply 而不是 10x100 matrix lapply

res <- sapply(lst, function(df)
    residuals(lm(Y1 ~ X1, data = df))) 
dim(res)
#[1]  10 100

更新

为了回应您的评论,您可以执行以下操作

首先计算并存储list中每个data.frame中的残差和残差派生的权重。

# Add residuals and weights to lst
lst <- lapply(lst, function(df) {
    df$res <- residuals(lm(Y1 ~ X1, data = df));
    df$weights <- 1 / fitted(lm(abs(res) ~ X1, data = df))^2;
    df;
})

然后 运行 加权线性回归和 return 第二个(斜率)系数

# Return 2nd coeffficient of weighted regression
coeff <- lapply(lst, function(df)
    coefficients(lm(Y1 ~ X1, data = df , weights = weights))[2])