我昨天发布了这个问题,但收到了一些有价值的反馈意见,我的帖子有点不尽如人意:)。这是一个更新的尝试,希望更清楚:
我有一个xts动物园对象,并且想要使用R确定过去20个周期中的斜率系数的t统计量,然后测试该t值是否> 1。 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
我无法弄清楚如何对每列执行回归与时间的关系,因此我使用索引创建了一个新列(daynumber)并执行了回归与索引的比较:
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列的情况下对每列执行回归与时间的想法?
谢谢 - 让我轻松一点,我刚刚开始学习!
答案 0 :(得分:0)
我认为你原来的问题取得了很大进展。我认为来自未命名包的输出格式实际上是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检验是关于截距是否为零,并且由于比例是相当随意的,它没有解释,除非你非常确定编码和零值意味着什么。