【问题标题】:regarding residual storing in bootstrap regression in R关于 R 中自举回归中的残差存储
【发布时间】:2018-07-11 04:35:00
【问题描述】:

我正在尝试通过从原始样本中重新采样 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]))
}

但似乎有些不对劲。谁能帮我解决这个问题?

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

【问题讨论】:

    标签: r regression simulation


    【解决方案1】:

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

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

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

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

    length(res)
    #[1] 100
    

    您还可以使用sapply 而不是lapply,将基于lm 的残差存储在10x100 matrix 中的所有100 个采样data.frames 中

    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 2nd coeffficient of weighted regression
    coeff <- lapply(lst, function(df)
        coefficients(lm(Y1 ~ X1, data = df , weights = weights))[2])
    

    【讨论】:

    • 谢谢。我应该更多地了解这个应用函数
    • 不用担心@Statlover,非常欢迎您。根据我自己的 R 学习经验,熟悉 *apply 家庭肯定会花时间很值得,我可以保证它会在以后的道路上派上用场。
    • 您可能还想查看purrr 库(也可以在dplyr 的tidyverse 中)。它具有像map() 这样的函数,它们与apply() 函数做许多相同的事情,但通常在保留类型和使用友好名称方面更好。简介:jennybc.github.io/purrr-tutorial
    • @MauritsEvers 我有一个后续问题。我尝试使用残差进行加权最小二乘回归。这是我的代码。 weght=lapply(lst, function(data1) 1/fitted(lm(abs(res)~X,data=data1))^2) coeff=lapply(lst, function(data1) coefficients(lm(Y ~ X, data = data1 , weights = weght))[2]) 。但这给了我一些错误。你能帮我解决吗?
    • @MauritsEvers 没关系,我发现出了什么问题。非常感谢您的帮助。
    猜你喜欢
    • 2017-10-03
    • 2011-10-16
    • 2020-02-07
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多