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

Я очень зеленый в 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 я получаю ошибку "индекс за пределами". Я знаю, что могу сделать это с помощью скрипта, но есть ли способ добиться этого в одной строке кода?

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)])

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

Другие вопросы по тегам