关于 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
中的全部优点是您可以轻松地循环遍历它们,例如lapply
或 sapply
.
因此,例如,要存储线性模型拟合的残差,您可以这样做
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])
我正在尝试通过从原始样本中对 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
中的全部优点是您可以轻松地循环遍历它们,例如lapply
或 sapply
.
因此,例如,要存储线性模型拟合的残差,您可以这样做
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])