我正在尝试通过从原始样本中重新采样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]))
}
但似乎出了点问题。谁能帮我解决这个问题?
请问有没有比这更简单的方法了?
答案 0 :(得分:2)
您正在执行不必要的复杂操作。将对象存储在list
中的全部好处是您可以轻松地通过例如lapply
或sapply
。
例如,要存储线性模型拟合的残差,您可以做
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;
})