我有两个参数的函数(具有两个滞后的自动协方差函数)进行矢量化,但是我无法以矩阵的形式获得此参数的输出。我试图避免for循环和各种应用功能。
我正在尝试Vectorize
和vectorize
(新的)。例如,我想要一个5 x 5的协方差矩阵。当我输入
covmatrix(h1 = 1:5, h2 = 1:5)
我只得到对角线,而不是整个矩阵。
x=arima.sim(n = 100 , list(ar = .5))
cov=function(h1,h2){
(1/n)*sum((x[1:(n-h1-h2)]-mean(x))*(x[(1+h1):(n-h2)]-mean(x))*(x[(1+h1+h2):n]-mean(x)))
}
covmatrix=Vectorize(cov)
我期望矩阵作为输入是两个参数的函数。
答案 0 :(得分:2)
您呼叫covmatrix
的方式产生了正确的结果,而不是您所期望的。该呼叫等效于
covmatrix(h1 = 1, h2 = 1)
covmatrix(h1 = 2, h2 = 2)
等等。
为两个参数的每个组合调用函数的正确方法是使用outer
。
outer(1:5, 1:5, covmatrix)
# [,1] [,2] [,3] [,4] [,5]
#[1,] -0.41601317 -0.370097057 -0.124465470 -0.047267383 0.11745561
#[2,] -0.47072758 -0.272059262 -0.029614627 0.088643875 0.02381160
#[3,] -0.30116584 -0.258246136 -0.061882282 0.090978006 -0.05854558
#[4,] -0.08414056 -0.066622517 0.008072885 -0.035487867 -0.06632959
#[5,] 0.18854949 -0.003135701 -0.160137172 0.008353789 -0.18484782
数据生成代码。
我将重复数据生成代码,但这一次设置RNG种子。
set.seed(1234)
x <- arima.sim(n = 100, list(ar = 0.5))
此外,在这个问题上,您还缺少n <- 100
。