我有一个双参数函数(具有两个滞后的自协方差函数)需要向量化,但我无法将其输出为矩阵。我尽量避免使用for循环和所有类型的应用函数。
我在尝试Vectorize和vectorize (新的)。例如,我想要一个5乘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)我期望的是一个矩阵,因为输入是一个双参数函数。
发布于 2019-05-19 17:26:36
您调用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。
https://stackoverflow.com/questions/56206212
复制相似问题