【问题标题】:Vectorize function operating on a two-argument functionVectorize 函数对两个参数的函数进行操作
【发布时间】:2019-05-19 17:26:35
【问题描述】:

我有一个双参数函数(具有两个滞后的自协方差函数)来向量化,但我无法将其作为矩阵的输出。我试图避免 for 循环和各种应用函数。

我正在尝试Vectorizevectorize(新的)。例如,我想要一个 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)

我期待一个矩阵,因为输入是一个有两个参数的函数。

【问题讨论】:

    标签: r vectorization


    【解决方案1】:

    您调用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 &lt;- 100的问题中。

    【讨论】:

    • 美丽。非常感谢瑞。
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多