使用lapply时,从lm中提取残差值和日期

时间:2018-02-01 20:28:30

标签: r list linear-regression lapply lm

我有一个包含507列的数据框。第1列是观察日期。第2列到第504列是我的因变量。 505,506和507列是独立变量。我写了一个函数来为每个因变量做一个单独的回归:

varlist<-names(df)[2:504]

models <- lapply(varlist, function(x) {
  lm( na.action = na.exclude,
    substitute(i ~ rmrf + smb + hml, 

               list(i = as.name(x))
    ), 
    data = df)
})

如何将所有剩余结果导出到单独的数据框中,以及相应的标题,它来自哪个因变量以及它来自哪个日期?

我可以使用此方法从单个模型访问残差:

resid(models[[1]])

但是我无法确定这适用于哪个因变量以及残差对应的日期(观察)。另外,我还没有找到一种从所有503型号中导出残差的方法。

Resid(models[[1:503]])给出了以下错误:

模型[[1:503]]出错:递归索引在第3级失败

1 个答案:

答案 0 :(得分:1)

# All the dep var
x = df[,505:507]

# All the indep var
y = df[,2:504]

# Fit all the models, use a little bit of scoping abuse
list_models  = lapply(y, function(y) with(x, lm(y~rmf + smb + htl)))

# Get resid for all models
list_resid = lapply(list_models, resid) 

# If you want them in a data.frame instead of list
df_resid = do.call(cbind.data.frame, list_resid)

# Add the dates
df_resid = cbind(date = df[,1], df_resid)

# Reproducible example, just generating some fake data in the same structure as your data
df = matrix(runif(50*507), nrow = 50, ncol = 507)
df = data.frame(df)
df[,1] = seq(as.Date("2017/1/1"), as.Date("2017/2/19"), "days")
names(df) = paste0("var", 1:507)
names(df)[505:507] = c("rmf", "smb", "htl")
names(df)[1] = "Date"