误差函数

时间:2014-01-22 16:39:19

标签: r

我有以下矢量,它是自相关的和函数(包 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)

在每个中使用negcorrposcorr个不同的系数我希望生成多个列,其中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

您是否碰巧知道为什么错误发生以及我必须使用什么表达来生成posautorrelation和negautorelation的列

1 个答案:

答案 0 :(得分:2)

TL;博士

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"案例中一样。