不可理解的行为ccf函数统计信息包

时间:2018-08-15 16:39:36

标签: r function dataframe statistics atomic

这个问题的重点是表明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")

enter image description here

如果仅故意将y系列写为x系列的滞后,而不是自然地是x系列的滞后,则此函数仅给出正确的答案,则此功能在现实生活中不起作用。 / strong>

1 个答案:

答案 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 ...

如果您具有有关xy变量的相对滞后的外部信息,则必须必须告诉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)

enter image description here

现在尝试ccf()

ccf(x,y,"covariance",lag.max=10)[

enter image description here] 2

工作正常...

或者,您可以做类似的事情

 ## pad at the beginning
 y <- c(rep(0,5),x) + rnorm(length(x)+5)
 ## pad at the end
 x <- c(x,rnorm(5))

模拟。