lapply функция с 2 переменными count

Я очень зеленый в R, поэтому, вероятно, есть очень простое решение:

Я хочу рассчитать среднюю корреляцию между векторами-столбцами в квадратной матрице:

x<-matrix(rnorm(10000),ncol=100)
aux<-matrix(seq(1,10000))
loop<-sapply(aux,function(i,j) cov(x[,i],x[,j])
cor_x<-mean(loop)

При оценке линии sapply я получаю сообщение об ошибке «индекс вне границ». Я знаю, что могу сделать это с помощью скрипта, но есть ли способ добиться этого в одной строке кода?


person Pinemangoes    schedule 31.01.2014    source источник


Ответы (2)


Проблема связана с aux. Переменная aux должна находиться в диапазоне от 1 до 100, поскольку у вас есть 100 столбцов. Но ваш aux представляет собой последовательность вдоль строк x и, следовательно, находится в диапазоне от 1 до 10000. Он будет работать со следующим кодом:

aux <- seq(1, 100)
loop <- sapply(aux, function(i, j) cov(x[, i], x[, j]))

После этого вы можете рассчитать среднюю ковариацию с помощью:

cor_x <- mean(loop)

Если вы хотите исключить повторяющиеся поля (например, cov(X,Y) по своей сути идентично cov(Y,X)), вы можете использовать:

cor_x <- mean(loop[upper.tri(loop, diag = TRUE)])

Если вы также хотите исключить cov(X,X), то есть дисперсию, вы можете использовать:

cor_x <- mean(loop[upper.tri(loop)])
person Sven Hohenstein    schedule 31.01.2014

Никаких петель не надо. Просто используйте mean(cov(x)), который делает это очень эффективно.

person Roland    schedule 31.01.2014
comment
+1, я просто формулировал тот же ответ, хотя ему нужна средняя ковариация - person BrodieG; 31.01.2014
comment
@BrodieG Ну, они знают, как использовать mean. - person Roland; 31.01.2014
comment
Но нужно ли удалять самоковариантность? Я предполагаю, что это тоже относительно тривиально с diag, но пытался выяснить, какой правильный ответ, хотя похоже, что OP включает его. - person BrodieG; 31.01.2014
comment
@BrodieG Ну, они об этом не просят, но, как демонстрирует Свен, легко использовать diag или upper.tri. - person Roland; 31.01.2014
comment
Ваше решение самое элегантное, но я выбрал решение Свена, потому что оно подробно объясняет, что не так с моей петлей. - person Pinemangoes; 04.02.2014