|
查了下gBox的代码,问题出现在第28行
>> M = filter(M, filter = beta, method = "recursive", sides = 1, init = rep(sigma2, length(beta)))
简要的结论就是:M的列数和传入的init的长度不同, 导致filter函数里面报错。这里的M是列数为2的矩阵,init是长度为1的向量。
更详细的:
跟着代码追到filter内:
# line 11
>> nser <- NCOL(x) # x指上面的M,nser为2
....
# line 48
>> dim(init) <- c(nfilt, nser) # 这里nflit为1, nser为2
我们知道,传入的init是个长度为1的向量。line 48将一个长度为1的向量,转换成一个(1,2)的矩阵,导致报错。
如果不指定init的话,就不会报错。因为filter函数的默认值是init = NULL,也就不会出现上面向量转矩阵的问题。
个人BB:
我不是太理解filter的意义和目的(gBox的计算思路也没仔细理解),所以不知道怎么修正。
不能确定是TSA的gBox函数出了问题,还是stats的filter出了问题。
刚开始我觉得stats包作为一个基础包,应该假设它是对的,需要修正gBox函数。
但是查看filter代码的时候,发现一个很明显的错误,见filter的line14.
所以想想也有可能是stats包出了问题。因为它假设init是NULL,并且在line 47的向量转矩阵的时候也没有进行错误处理。属于一种reasonable的BUG。
另:TSA包中gBox的函数说明,最后的gBox代码是打#号的,所以很可能作者本身也没跑通。
但是他应该比较确信自己的计算没有问题,所以还是放了出来。
|