Я ищу прирост эффективности при вычислении (автоматической) ковариационной матрицы из отдельных измерений с течением времени t
с помощью t, t-1
и т.д.
В матрице данных каждая строка представляет отдельное лицо, и каждый столбец представляет собой ежемесячные измерения (столбцы находятся во временном порядке). Подобно следующим данным (хотя и с некоторой дополнительной дисперсией).
# simulate data
set.seed(1)
periods <- 70L
ind <- 90000L
mat <- sapply(rep(ind, periods), rnorm)
Ниже приведен код (уродливый), с которым я пришел, чтобы получить ковариационную матрицу для измерений/отстающих измерений. Это займет почти 4 секунды. Я уверен, что, двигаясь к data.table
, думая больше и не полагаясь на петли, я мог бы сократить время на большую сумму. Но поскольку ковариационные матрицы повсеместны, я подозреваю, что уже существует стандартный (и эффективный) способ сделать это в R, о котором я должен знать в первую очередь.
# Get variance covariance matrix for 0-5 lags
n_lags <- 5L # Number of lags
vcov <- matrix(0, nrow = n_lags + 1L, ncol = n_lags + 1)
for (i in 0L:n_lags) {
for (j in i:n_lags) {
vcov[j + 1L, i + 1L] <-
sum(mat[, (1L + (j - i)):(periods - i)] *
mat[, 1L:(periods - j)]) /
(ind * (periods - j) - 1)
}
}
round(vcov, 3)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.001 0.000 0.000 0.000 0.000 0.000
[2,] 0.000 1.001 0.000 0.000 0.000 0.000
[3,] 0.000 0.000 1.001 0.000 0.000 0.000
[4,] 0.000 0.000 0.000 1.001 0.000 0.000
[5,] -0.001 0.000 0.000 0.000 1.001 0.000
[6,] 0.000 -0.001 0.000 0.000 0.000 1.001