我想使用data.table功能运行每月回归并返回系数,残差等。
在下面的示例代码中,我希望能够看到每个命名列表。我的第一个reg.list调用做到了这一点,但它要求我为要返回的每个列表调用fit.lm帮助器函数。这可能没有效率。我的第二个reg.list调用仅调用一次,但是我将所有变量串在一起而不是放在命名列表中。也许我没有采用正确的方法。
f1 <- data.table(datadate = '1/1/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f2 <- data.table(datadate = '1/2/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f3 <- data.table(datadate = '1/3/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
fdata <- rbind(f1,f2,f3)
fit.lm <- function(mdate) {
cols <- c("datadate", "id", 'y', 'x')
load <- fdata[datadate == mdate, ..cols]
mod <- lm(formula = 'y ~ x', data = load)
return(list(coef = list(mod$coefficients), residuals = list(mod$residuals), r2 = list(summary(mod)$r.squared)))
}
reg.list <- fdata[, list( coef = fit.lm(datadate)$coef,
residuals = fit.lm(datadate)$residuals,
r2 = fit.lm(datadate)$r2), by = datadate]
reg.list <- fdata[, list(mod = fit.lm(datadate)), by = datadate]
reg.list[[2]]
在第二次调用reg.list的过程中,我将必须按以下方式访问输出:
reg.list[[2]][1]
reg.list[[2]][2]
reg.list[[2]][3]
reg.list[[2]][4]
reg.list[[2]][5]
reg.list[[2]][6]
reg.list[[2]][7]
reg.list[[2]][8]
reg.list[[2]][9]
这似乎不是一种非常用户友好的方式。我想我做错了。我想做类似的事情:
reg.list[2][['coef']]
reg.list[2][['residuals']]
reg.list[2][['r2']]
答案 0 :(得分:0)
基于@IceCreamToucan所说的内容,我认为这里的主要问题是fit.lm函数推出了不同长度的列表,因此data.table无法使结果平坦。如果使函数为返回列表的每个项目推出相同数量的值,则data.table可以使结果变平并使数据保持整洁。参见下面的代码->
f1 <- data.table(datadate = '1/1/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f2 <- data.table(datadate = '1/2/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
f3 <- data.table(datadate = '1/3/2019', id=paste('id', 1:100, sep=''), x=runif(100), y=runif(100))
fdata <- rbind(f1,f2,f3)
fit.lm <- function(mdate) {
cols <- c("datadate", "id", 'y', 'x')
load <- fdata[datadate == mdate, ..cols]
mod <- lm(formula = 'y ~ x', data = load)
return(c(as.list(mod$coefficients),
'sse' = sqrt(mean(mod$residuals^2)),
'r2' = summary(mod)$r.squared
)
)
}
fdata[,fit.lm(datadate), by = datadate]
答案 1 :(得分:0)
感谢@IceCreamToucan和@Bryan提供有用的信息。利用我从你们俩那里学到的东西,我能够构建自己想要的东西(请参见下面的代码)。我想返回3个列表(或对象),以便coef将是回归包含的所有coef的列表,而残差将是包含许多残差的列表。
fit.lm <- function(mdate) {
cols <- c("datadate", "id", 'y', 'x')
load <- fdata[datadate == mdate, ..cols]
mod <- lm(formula = 'y ~ x', data = load)
return(list('coef' = list(mod$coefficients),
'resid' = list(mod$residuals),
'r2' = summary(mod)$r.squared))
}
reg.list <- fdata[, fit.lm(datadate), by = datadate]
这使我可以轻松地看到自己的系数...
coefs <- do.call("rbind", reg.list$coef)