Функция 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))
, что делает это очень эффективно.