我有以下矢量,它是自相关的和函数(包 quantmod )
### rm(list=ls())
s <- filter(rnorm(100), filter=rep(1,3), circular=TRUE)
a <- acf(s)
b <- a[[1]]
c <- (b[2:length(b)])
posssignificance_level <- qnorm((1+0.90)/2)/sqrt(sum(!is.na(s)))
negsignificance_level <- -posssignificance_level
poscorr <- which(posssignificance_level<c)
negcorr <- which(negsignificance_level>c)
在每个中使用negcorr
和poscorr
个不同的系数我希望生成多个列,其中poscorr
和negcorr
获得滞后/秒。我做了
posautorrelation <- Lag(s, poscorr)
negautorrelation <- Lag(s, negcorr)
但是我为
获得了以下错误信息Error en `tsp<-`(`*tmp*`, value = p - (k/p[3L]) * c(1, 1, 0)) :
el atributo 'tsp' debe ser numérico de longitud tres
Además: Mensajes de aviso perdidos
1: In if (k != round(k)) { :
la condición tiene longitud > 1 y sólo el primer elemento será usado
2: In (k/p[3L]) * c(1, 1, 0) :
longitud de objeto mayor no es múltiplo de la longitud de uno menor
3: In p - (k/p[3L]) * c(1, 1, 0) :
longitud de objeto mayor no es múltiplo de la longitud de uno menor
Error durante el wrapup: no se puede abrir la conexión
您是否碰巧知道为什么错误发生以及我必须使用什么表达来生成posautorrelation和negautorelation的列
答案 0 :(得分:2)
类Lag()
没有"ts"
方法,因此它会调度到基本函数lag()
,它不喜欢传递k
滞后的向量。解决方案是强制使用Lag.numeric()
方法或将时间序列s
强制转换为其中一个受支持的类;例如"numeric"
或"zoo"
。
问题在于Lag()
的默认方法会调度到lag()
,而且据我所知,它只能提供一个滞后k
。如果你按下这个,你会在stats:::lag.default
中看到一行计算
tsp(x) <- p - (k/p[3L]) * c(1, 1, 0)
其中p
是输入数据的tsp()
,k
是滞后。当你传入K的向量时1分钟k,你得到这个:
R> p - (poscorr/p[3L]) * c(1, 1, 0)
[1] 0 98 1
Warning message:
In (poscorr/p[3L]) * c(1, 1, 0) :
longer object length is not a multiple of shorter object length
(例如使用您的部分数据)。
接下来请注意'tsp<-'()
通过
"tsp"
的{{1}}属性
x
如果你调试得足够远,你会发现这是提高错误的一行。如果我们阅读attr(x, "tsp") <- value
,我们会看到?attr
属性作为特殊情况处理
"tsp"
并且我们必须从C代码中寻找引发错误的原因。如果我们跳过这一点,我们可以推断出
Note that some attributes (namely ‘class’, ‘comment’, ‘dim’,
‘dimnames’, ‘names’, ‘row.names’ and ‘tsp’) are treated specially
and have restrictions on the values which can be set. (Note that
this is not true of ‘levels’ which should be set for factors via
the ‘levels’ replacement function.)
对最初提供给R> p - (poscorr/p[3L]) * c(1, 1, 0)
[1] 0 98 1
的时间序列s
无效。
解决方法只是直接调用更合适的Lag()
方法。有Lag()
方法,但要实现这一点,您需要将"numeric"
转换为数字向量,直接调用s
方法:
"numeric"
或强制
quantmod:::Lag.numeric(s, poscorr)
R> head(quantmod:::Lag.numeric(s, poscorr))
Lag.1 Lag.2
[1,] NA NA
[2,] -1.5363 NA
[3,] -0.2461 -1.5363
[4,] -0.3276 -0.2461
[5,] -0.8280 -0.3276
[6,] -0.2980 -0.8280
后者是这里的首选方式。您还可以强制转换为Lag(as.numeric(s), poscorr)
R> head(Lag(as.numeric(s), poscorr))
Lag.1 Lag.2
[1,] NA NA
[2,] -1.5363 NA
[3,] -0.2461 -1.5363
[4,] -0.3276 -0.2461
[5,] -0.8280 -0.3276
[6,] -0.2980 -0.8280
类对象:
"zoo"
如果将Lag(as.zoo(s), poscorr)
R> head(Lag(as.zoo(s), poscorr))
Lag.1 Lag.2
1 NA NA
2 -1.5363 NA
3 -0.2461 -1.5363
4 -0.3276 -0.2461
5 -0.8280 -0.3276
6 -0.2980 -0.8280
传递给Lag()
, k
应该会抓住这个并挽救。或者lag()
可以sapply()
k
多个lag()
来电,就像在"numeric"
案例中一样。