关于R中自举回归中的剩余存储

时间:2018-07-11 04:35:01

标签: r regression simulation

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

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。这些是引导程序示例。

要获取引导程序残差,我将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]))
}

但似乎出了点问题。谁能帮我解决这个问题?

请问有没有比这更简单的方法了?

1 个答案:

答案 0 :(得分:2)

您正在执行不必要的复杂操作。将对象存储在list中的全部好处是您可以轻松地通过例如lapplysapply

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

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

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

length(res)
#[1] 100

您还可以使用lm而不是{{},根据data.frame拟合10x100 matrix中所有100个采样sapply的残差来存储残差1}}

lapply

更新

针对您的评论,您可以执行以下操作

首先在res <- sapply(lst, function(df) residuals(lm(Y1 ~ X1, data = df))) dim(res) #[1] 10 100 中的每个data.frame中计算并存储残差和残差衍生权重。

list

然后运行加权线性回归并返回第二(倾斜)系数

# 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;
})