作为我的数据分析的一部分,我使用线性回归分析来检查我是否可以使用今天的数据来预测明天的价值。
我的数据大约是公司回归的100个时间序列。到目前为止,这是我的代码:
returns <- read.zoo("returns.csv", header=TRUE, sep=",", format="%d-%m-%y")
returns_lag <- lag(returns)
lm_univariate <- lm(returns_lag$companyA ~ returns$companyA)
这没有问题,现在我希望对100家公司中的每一家进行线性回归。由于手动设置每个线性回归模型会花费太多时间,我想使用某种循环(或应用函数)来缩短过程。
我的方法:
test <- lapply(returns_lag ~ returns, lm)
但这导致错误“test2”中的意外符号,因为在那里没有识别出波浪号。
所以,基本上我想分别对每家公司进行线性回归。
看起来与我想要的类似的唯一问题是Linear regression of time series over multiple columns,但是数据似乎存储在矩阵中,而且与我正在寻找的相比,代码示例相当混乱。
答案 0 :(得分:3)
当您知道要包含在回归中的变量的确切名称时,公式很棒。在循环使用值时,它们并不是那么好。这是一个使用索引来提取每次迭代感兴趣的列的示例
#sample data
x.Date <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1
returns <- zoo(cbind(companya=rnorm(10), companyb=rnorm(10)), x.Date)
returns_lag <- lag(returns)
$loop over columns/companies
xx<-lapply(setNames(1:ncol(returns),names(returns)), function(i) {
today <-returns_lag[,i]
yesterday <-head(returns[,i], -1)
lm(today~yesterday)
})
xx
这将以列表的形式返回每列的结果。
答案 1 :(得分:2)
使用dyn包(加载动物园)我们可以这样做:
library(dyn)
z <- zoo(EuStockMarkets) # test data
lapply(as.list(z), function(z) dyn$lm(z ~ lag(z, -1)))