Функция векторизации, работающая с функцией с двумя аргументами - PullRequest
1 голос
/ 19 мая 2019

У меня есть функция с двумя аргументами (автоковариантная функция с двумя лагами) для векторизации, но я не могу получить ее результат в виде матрицы. Я пытаюсь избежать циклов и всех видов применения функций.

Я пытался 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)

Я ожидаю матрицу, так как ввод является функцией с двумя аргументами.

1 Ответ

2 голосов
/ 19 мая 2019

То, как вы звоните 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

Код генерации данных.

Я повторю код генерации данных, но на этот раз установлю начальное значение ГСЧ.

set.seed(1234)
x <- arima.sim(n = 100, list(ar = 0.5))

Кроме того, в вопросе, который вы пропустили n <- 100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...