【问题标题】:Regression with xts object, determine t-statistic of slope coefficient using R使用 xts 对象回归,使用 R 确定斜率系数的 t 统计量
【发布时间】:2012-10-24 03:19:25
【问题描述】:

我昨天发布了这个问题,但收到了一些有价值的反馈,我的帖子还有一些不足之处:)。这是一个更新的尝试,希望更清晰:

我有一个 xts zoo 对象,想使用 R 确定过去 20 个周期内斜率系数的 t 统计量,然后测试该 t 值是否 > 2。

class(prices)

[1] "xts" "zoo"

tail(prices)
             IWM    SPY    TLT
2012-10-24 81.20 141.02 121.48
2012-10-25 81.53 141.43 120.86
2012-10-26 81.14 141.35 122.64
2012-10-31 81.63 141.35 123.36
2012-11-01 82.49 142.83 122.35
2012-11-02 81.19 141.56 122.26

我不知道如何对每列与时间进行回归,因此我创建了一个带有索引的新列(天数)并执行了与索引的回归:

lastprices = last(prices,20)
prices.data.frame = as.data.frame(lastprices)
daynumber = index(prices.data.frame)
pdfd = data.frame(prices.data.frame, daynumber)
pdfd.lm = lm(pdfd$daynumber ~ ., data=pdfd)
tstat = coef(summary(pdfd.lm))
tstat[,"t value"]
(Intercept)         IWM         SPY         TLT 
  4.5426630  -0.1788975  -1.3521969  -2.2362345 
tstattest = ifelse(tstat[,"t value"]>2,1,0)
tstattest
(Intercept)         IWM         SPY         TLT 
          1           0           0           0 

我不禁认为这不是完成这项任务的最有效方式。有没有人知道如何在不创建 daynumber 列的情况下只对每列与时间进行回归?

谢谢 - 放轻松,我刚开始学习!

【问题讨论】:

  • 您显然正在使用 zoo 或 xts 数据对象,因为这不是 lm 对象的典型输出。有些经常做 SO 的人会知道你在做什么,但是从听众中的非金融量化人员那里,如果你包含可以创建你正在使用的对象的代码,你会得到更快的回复,或者你可以产生dput(head(data) )的输出
  • 感谢 DWin。 dput(head(data) ) 的输出是: x[seq_len(n)] 中的错误:'environment' 类型的对象不是子集。代码开头如下:tickers = spl('TLT,GLD,IWM') data
  • 此时我猜你正在使用一个不在 CRAN 上的包,因为我能找到的唯一一个带有 spl 函数的包是 MCMCglmm,这看起来不像很适合这个问题。我已经放弃了,所以我没有寻找bt.prep。您确实需要提供所有包含您正在使用的功能的包的名称。
  • DWin - 我更新了完整的帖子。希望这更清楚。很想听听您的反馈。谢谢

标签: r time-series regression xts zoo


【解决方案1】:

我认为你原来的问题已经取得了有益的进展。我认为来自未命名包的输出格式实际上是 lm 的输出,其中公式的 hte LHS 上有多个列。我对您的第二个版本所做的是:

require(zoo)
require(xts)
prices <- read.zoo(text="dt           IWM    SPY    TLT
 2012-10-24 81.20 141.02 121.48
 2012-10-25 81.53 141.43 120.86
 2012-10-26 81.14 141.35 122.64
 2012-10-31 81.63 141.35 123.36
 2012-11-01 82.49 142.83 122.35
 2012-11-02 81.19 141.56 122.26", index=1, header=TRUE, FUN=as.Date, format="%Y-%m-%d")
 prices <- as.xts(prices)
dprice <- as.data.frame(prices)
dprice$dat <- 1:6

lm( cbind(IWM,SPY , TLT) ~dat , data=dprice)
#-------------
Call:
lm(formula = cbind(IWM, SPY, TLT) ~ dat, data = dprice)

Coefficients:
             IWM        SPY        TLT      
(Intercept)   81.19800  140.90000  121.24933
dat            0.09486    0.19714    0.25971

请注意,该输出中没有 t 值。 summary.lm 函数将创建这些:

tstat = coef(summary(fit))
tstat
#--------------
Response IWM :
               Estimate Std. Error     t value     Pr(>|t|)
(Intercept) 81.19800000  0.4993259 162.6152292 8.578215e-09
dat          0.09485714  0.1282151   0.7398284 5.004726e-01

Response SPY :
               Estimate Std. Error    t value     Pr(>|t|)
(Intercept) 140.9000000  0.5356109 263.064096 1.252746e-09
dat           0.1971429  0.1375322   1.433431 2.250283e-01

Response TLT :
               Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 121.2493333  0.7632198 158.86556 9.417108e-09
dat           0.2597143  0.1959767   1.32523 2.557232e-01

要从三个矩阵的列表中提取 t 值,您可以使用 lapply:

lapply( coef(summary(fit)), "[" , ,"t value")
#----------
$`Response IWM`
(Intercept)         dat 
162.6152292   0.7398284 

$`Response SPY`
(Intercept)         dat 
 263.064096    1.433431 

$`Response TLT`
(Intercept)         dat 
  158.86556     1.3252

要获得拦截,您可以使用以下命令:

 lapply( coef(summary(fit)), "[" , "(Intercept)","t value")
#-----
$`Response IWM`
[1] 162.6152

$`Response SPY`
[1] 263.0641

$`Response TLT`
[1] 158.8656

请注意,Intercept 值在这种情况下几乎没有任何意义。如果你使用数字 1:6,你会得到一个截距,如果你使用 Dates-classes 值,你会得到一个完全不同的值。 t 检验是关于截距是否为零,并且由于比例相当随意,除非您非常确定编码以及零值意味着什么,否则它没有任何解释。

【讨论】:

  • 太棒了,lapply 正是我所需要的。非常感谢您的回复。快速跟进:要将条件语句应用于 t 值,我尝试了 tval 2,tval,0 ) 但我收到消息: ifelse(tval > 2, tval, 0) 中的错误:(列表)对象不能被强制输入'double'。如何应用条件而不出现错误?
  • 您需要为ifelse 提供一个向量而不是一个列表,这就是上面的调用返回的内容。我的上一个版本也返回一个列表,但如果你将 unlist() 包裹在它周围,你会得到一个向量。所以试试: > tval
  • 再次感谢。我接受了您的建议: >tvaltest 2,tval,0) >tvaltest >响应 DBC 响应 EEM 响应 EFA 响应 GLD 响应 HYG 响应 IEF 响应 IWM 响应 IYR 响应 MDY 响应 TLT 0.000000 0.000000 0.000000 0.000000 0.000000 6.377264 0.000000 9.396363 # 这很好用,但我现在需要将数据改回 xts 对象,格式为:DBC EEM EFA 2012-11-06 1.02 1.09 1.09 有什么想法吗?我需要去掉每个符号的“响应”一词并添加回日期。 tvaltest class= “数字”
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2019-06-15
  • 2014-03-08
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多