【发布时间】:2014-03-08 16:34:24
【问题描述】:
如何使用xts 对象进行线性回归?
lm(xtsObject ~ index(xtsObject)) 不行,我试过了。
我的数据是一家公司的每日股价。但是index 将自纪元以来的秒数提供给lm 函数。如何解决?
【问题讨论】:
-
dyn 包可以对动物园对象进行回归。
标签: r xts linear-regression
如何使用xts 对象进行线性回归?
lm(xtsObject ~ index(xtsObject)) 不行,我试过了。
我的数据是一家公司的每日股价。但是index 将自纪元以来的秒数提供给lm 函数。如何解决?
【问题讨论】:
标签: r xts linear-regression
# Load library
library(tsbox)
# Convert xts to dataframe
dataframe = ts_data.frame(xts)
# See dataframe header
head(dataframe)
# Run regression
fit = lm(value ~ time, dataframe)
# Find result
summary(fit)
【讨论】:
Gavin Simpson的解决方案是危险的。要查看这一点,请注意,当您在以上运行回归时,Time Trend是as.numeric(df$Time)。这次趋势在1167724800开始。一般时间趋势开始于0.这很重要,因为如果您不知道您的时间趋势的起源,则会错误地解释您的系数估计。我建议了几个更好的替代方案。
data(sample_matrix)
xtsObject <- as.xts(sample_matrix, descr="my new xts object")
#Option 1, the best by far, no need to transform to a data.frame
library(dynlm)
dynlm(Open ~ trend(Open), data = xtsObject)
#Option 2, another option
library(dynlm)
xtsObject$t <- 0:(nrow(xtsObject)-1)
dynlm(Open ~ t, data = xtsObject)
#Option 3, the data.frame route
df <- data.frame(xtsObject['/'][,"Open"], t = 1:nrow(xtsObject))
lm(Open ~ t, df)
【讨论】:
从xtsObject 中提取数据和时间索引(就像您已经做的那样)到一个数据框中,给每个数据一个合适的名称。使用此名称引用公式中的变量,并将此数据框作为参数数据传递。比如使用?xts中的示例数据:
require("xts")
data(sample_matrix)
xtsObject <- as.xts(sample_matrix, descr="my new xts object")
## the example ts has several variables Open High Low Close,
## here I take just one, "Open"
df <- data.frame(xtsObject['/'][,"Open"], Time = index(xtsObject))
head(df)
> head(df)
Open Time
2007-01-02 50.03978 2007-01-02
2007-01-03 50.23050 2007-01-03
2007-01-04 50.42096 2007-01-04
2007-01-05 50.37347 2007-01-05
2007-01-06 50.24433 2007-01-06
2007-01-07 50.13211 2007-01-07
现在拟合模型
mod <- lm(Open ~ Time, data = df)
summary(mod)
> mod <- lm(Open ~ Time, data = df)
> summary(mod)
Call:
lm(formula = Open ~ Time, data = df)
Residuals:
Min 1Q Median 3Q Max
-1.16144 -0.47952 -0.08462 0.57053 1.44329
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.199e+02 1.199e+01 26.68 <2e-16 ***
Time -2.302e-07 1.020e-08 -22.57 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.6146 on 178 degrees of freedom
Multiple R-squared: 0.741, Adjusted R-squared: 0.7395
F-statistic: 509.2 on 1 and 178 DF, p-value: < 2.2e-16
lm() 对 xts 对象一无所知,所以如果有疑问,请做简单的事情并将它知道的东西传递给它。
请注意,您可以使用coredata(xtsObject) 而不是xtsObject['/'],例如
> head(coredata(xtsObject))
Open High Low Close
[1,] 50.03978 50.11778 49.95041 50.11778
[2,] 50.23050 50.42188 50.23050 50.39767
[3,] 50.42096 50.42096 50.26414 50.33236
[4,] 50.37347 50.37347 50.22103 50.33459
[5,] 50.24433 50.24433 50.11121 50.18112
[6,] 50.13211 50.21561 49.99185 49.99185
【讨论】:
dynlm 或dyn 比转换为data.frame 以使用lm 更有意义。
x 为零时y 的期望值。如果x 从 1 开始,则截距与协变量范围之外的点相关,就像在我的示例中一样。时间趋势并不是从你所说的荒谬值开始的:as.numeric(as.Date("2007-01-02")) 给出了13515 - 即自纪元以来的许多天。我认为您将日期误认为是 POSIXt 次。您的方法可能同样具有误导性:trend(x) 为常规时间排序生成 seq_along(x) - 我所做的几乎所有时间序列建模都是时间不规则的。