错误滞后功能

  • 本文关键字:功能 滞后 错误 r
  • 更新时间 :
  • 英文 :


>我有以下自相关和函数的向量(包量子模)

### 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不同的系数,我想生成许多具有我通过poscorrnegcorr获得的滞后/秒的列。我愿意

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

您是否碰巧知道为什么会发生错误以及我必须使用什么表达式来生成位置自变量和负自关系的列

tl;博士

"ts"没有Lag()方法,因此它调度到基函数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"属性x

attr(x, "tsp") <- value

如果你调试得足够远,你会发现这是引发错误的行。如果我们阅读?attr,我们会看到"tsp"属性被作为特例处理

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.)

我们必须从 C 代码中寻找引发错误的原因。如果我们跳过这一部分,我们可以推断

R> p - (poscorr/p[3L]) * c(1, 1, 0)
[1]  0 98  1

对于最初提供给Lag()的时间序列s无效。

解决方法是直接调用更合适的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(),就要纾困。或者,它可以在ksapply()多个lag()调用,就像在"numeric"情况下一样。

最新更新