这个问题的重点是表明ccf提供了错误的答案
我正在写Shiny app
。在一个标签中,我想使用function
包中的ccf
函数绘制互协方差stats
。
但是,我在此函数中发现了奇怪的行为:
x <- rnorm(100)
y <- lag(x,-5) + rnorm(100)
ccf(y, x, ylab='CCovF', type='covariance')
得出正确的交叉协方差函数图:
但是,我更改了y
的类型,然后情节错了:
y <- as.numeric(y)
ccf(y, x, ylab='CCovF', type='covariance')
有人知道发生了什么吗?是什么原因导致了这种现象以及如何解决?
在应用程序中,y输入将没有tsp属性,而只是数字类型。
这实际上是问题中最重要的部分,因为y输入将具有数字类型而不是原子类型。
我尝试在lag()
上使用y
使其恢复其属性,但该功能仍然无法正常工作:
ccf(lag(y,0), x, type = "covariance")
如果仅故意将y系列写为x系列的滞后,而不是自然地是x系列的滞后,则此函数仅给出正确的答案,则此功能在现实生活中不起作用。 / strong>
答案 0 :(得分:4)
考虑一下R对这些向量的“了解”:
set.seed(101)
x <- rnorm(100)
y <- lag(x,-5)+rnorm(100)
y_num <- as.numeric(y)
@李哲源在评论中指出,添加lag()
元素会使y
成为时间序列对象,具有已知滞后时间:
str(y)
## num [1:100] -0.058 -0.0397 1.4585 1.3871 1.0575 ...
## - attr(*, "tsp")= num [1:3] 6 105 1
tsp
属性是一个向量,由一个起始值(6,即5的滞后),一个结束值和频率(请参见?tsp
)组成。
str(x)
## num [1:100] -0.326 0.552 -0.675 0.214 0.311 ...
相反,x
只是一个数字矢量。在缺少tsp
属性的情况下,R无法知道其滞后时间,因此它将假定它从时间1开始。
将y
转换为数字时,它将失去其tsp
属性,因此R不再知道其滞后时间。唯一明智的猜测是它也从时间1开始(即滞后0)。
str(y_num)
## num [1:100] -0.058 -0.0397 1.4585 1.3871 1.0575 ...
如果您具有有关x
和y
变量的相对滞后的外部信息,则必须必须告诉R它是什么。您可以:
tsp
属性,例如tsp(y_num) <- c(6,105,1)
。一般来说,您可以使用tsp(y_num) <- c(1+lag_val,length(y_num)+lag_val, 1)
lag()
,但是有一定程度的滞后:ccf(x, lag(y_num,5), type="covariance")
可以正常工作ccf(c(rep(0,5),y),x)
-但这会稍微改变CCF计算。 (您不能使用NA
值进行填充。)否则R唯一能做的就是假设所有向量都在时间1开始。
我将对此进行另一次尝试(也许这应该是一个单独的答案);我认为您的模拟,尤其是lag()
,并没有像您认为的那样运作。 lag()
不会更改向量中的实际值,它只是通知R时间序列的开始时间不同。相反,让我们通过制作两个互不相同的三角波模式来更明确地进行仿真:
set.seed(101)
x <- rep(c(1:5,5:1),10) + rnorm(100,sd=0.5)
y <- rep(c(5:1,1:5),10) + rnorm(100,sd=0.5)
matplot(cbind(x,y),type="l",col=1:2,lty=1)
现在尝试ccf()
:
ccf(x,y,"covariance",lag.max=10)[
] 2
工作正常...
或者,您可以做类似的事情
## pad at the beginning
y <- c(rep(0,5),x) + rnorm(length(x)+5)
## pad at the end
x <- c(x,rnorm(5))
模拟。