【问题标题】:Linear regression with XTS objectXTS 对象的线性回归
【发布时间】:2014-03-08 16:34:24
【问题描述】:

如何使用xts 对象进行线性回归? lm(xtsObject ~ index(xtsObject)) 不行,我试过了。

我的数据是一家公司的每日股价。但是index 将自纪元以来的秒数提供给lm 函数。如何解决?

【问题讨论】:

  • dyn 包可以对动物园对象进行回归。

标签: r xts linear-regression


【解决方案1】:
# 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)

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

    • 我的答案是不是 i>危险。这不是统计建议的网站。我展示了一种方法来使用r来获得op想要的东西。你的观点没有“意识到意识起源......”是一个稻草男人的论点。一个人希望,如果一个人与数据拟合回归,就会知道他们的数据是如何格式化/编码的,并相应行动。 span>
    【解决方案3】:

    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
    

    【讨论】:

    • 我相信您提出了一个具有误导性但并非完全不正确的解决方案。请阅读下面的答案,让我知道您的想法。
    • 这不是一个统计帮助网站,而是一个关于编程的网站 - OP 提出了一个带有 no 数据的问题。我编造了一些数据并展示了如何做他们想做的事。由 OP 来决定他们想要的趋势分量的规模——我能看到的唯一问题是我实际展示的内容(不是我会为自己的数据这样做)是趋势的估计影响很小考虑到趋势变量的大尺度。我可以想到为什么趋势从 0 开始没有用的许多原因 - 另一种方法是将时间变量居中。
    • 我不同意。如果您知道时间趋势从 1167724800 开始,那么您的方法很好。但是,这种方法的结果不是很可读。这就是为什么人们在实践中选择从 1 或 0 开始的时间趋势 (en.wikipedia.org/wiki/Linear_trend_estimation)。例如,如果时间趋势从 1 开始,则截距代表数据的平均值。出于这个原因,我建议人们考虑我在下面概述的方法。此外,使用dynlmdyn 比转换为data.frame 以使用lm 更有意义。
    • 截距表示当x 为零时y 的期望值。如果x 从 1 开始,则截距与协变量范围之外的点相关,就像在我的示例中一样。时间趋势并不是从你所说的荒谬值开始的:as.numeric(as.Date("2007-01-02")) 给出了13515 - 即自纪元以来的许多天。我认为您将日期误认为是 POSIXt 次。您的方法可能同样具有误导性:trend(x) 为常规时间排序生成 seq_along(x) - 我所做的几乎所有时间序列建模都是时间不规则的。
    • 我的意思是,由于 OP 没有提供数据,因此我制作了一些简单的数据来展示如何准确提取数据的时间点。我并不是在提倡您使用这些 exact 日期 - 如果我这样做,我经常将时间变量缩放为 / 1000,或者将其居中,以便截距很好地限制在观察中 - 我只是显示过程。你的方法也做出假设。我可以看到使用类似 dynlm 的工具的实用性,但前提是数据是定期观察。同样,这不是一个关于统计细节的网站 - 我假设 OP 有大脑并且会使用它。
    猜你喜欢
    • 2017-02-26
    • 2012-10-30
    • 2014-05-07
    • 2013-07-20
    • 1970-01-01
    • 2020-03-06
    • 2020-09-05
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多