увеличение значений корреляции — R

#r #correlation #maximize

#r #корреляция #максимизировать

Вопрос:

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

Например, предположим, что у вас есть этот фрейм данных:

 df <- data.frame(val1 = c(1,2,4,8,10,20), val2 = c(2,4,8,16, 35, 14)) 
rownames(df) <- c('a','b','c','d','e','f')
 

Я хотел бы удалить пары значений, которые не позволяют мне получить корреляцию больше 0,6, поэтому в этом случае я хотел бы обнаружить, что элемент f (строка) уменьшает мою корреляцию. Наконец, если это легко, я хотел бы найти это, используя элементы (строки) a, b, c, d. Я могу получить самую высокую корреляцию.

У вас есть какие-либо идеи, как я могу это сделать?

Заранее благодарю вас за любезную помощь.

Лучшие

Комментарии:

1. Вам нужно больше ограничений. Если вы удалите все строки, кроме 2 (любые 2), корреляция будет равна 1 или -1.

2. Спасибо за ваш ответ и помощь! Я обновил текст и добавил ограничения, чтобы иметь не менее 3 строк.

Ответ №1:

Помогает ограничение не менее 3 строк. Существует два способа решения проблемы. Какой из них лучше, немного зависит от того, чего вы пытаетесь достичь. Мы можем начать со всех точек и удалять по одной за раз, или мы можем начать с 3 точек и добавлять по одной за раз. В вашем примере 6 баллов, поэтому это не имеет большого значения. Вот код для поиска наилучшей комбинации из 3 пунктов:

 combos <- combn(6, 3)
corrs <- combn(6, 3, function(x) cor(df[x, ])[1, 2])
results <- cbind(t(combos), corrs)
head(results[order(corrs, decreasing=TRUE), ])
#                corrs
# [1,] 1 2 3 1.0000000
# [2,] 1 2 4 1.0000000
# [3,] 2 3 4 1.0000000
# [4,] 1 3 4 1.0000000
# [5,] 1 2 5 0.9988739
# [6,] 1 2 6 0.9940219
 

Мы используем combn() функцию дважды, один раз, чтобы получить матрицу возможных комбинаций из 3 элементов из 6, а второй раз, чтобы применить функцию корреляции к каждой комбинации
Затем мы объединяем результаты и перечисляем 6 лучших. Существует три наилучших 3-точечных решения, имеющих корреляции 1. Для 5-точечных решений мы получаем следующее:

 combos <- combn(6, 5)
corrs <- combn(6, 5, function(x) cor(df[x, ])[1, 2])
results <- cbind(t(combos), corrs)
head(results[order(corrs, decreasing=TRUE), ])
#                    corrs
# [1,] 1 2 3 4 5 0.9381942
# [2,] 1 2 3 4 6 0.7514174
# [3,] 1 2 3 5 6 0.4908234
# [4,] 1 2 4 5 6 0.4639890
# [5,] 1 3 4 5 6 0.4062324
# [6,] 2 3 4 5 6 0.3591037
 

Теперь есть одно четкое решение, которое исключает точку 6 («f») с корреляцией .938. В общем случае размер корреляции будет увеличиваться с уменьшением точек, пока не достигнет 1 или -1. По мере увеличения количества точек потребуется больше времени для вычисления всех альтернатив. Короткий путь состоял бы в том, чтобы посмотреть на отклонения от первого основного компонента:

 df.pca <- prcomp(df)
abval <- abs(df.pca$x[, "PC2"])
df.pca$x[order(abval, decreasing=TRUE), "PC2"]
#           f           e           a           b           c           d 
# -11.4055987   5.3497271   2.1507072   1.9191656   1.4560825   0.5299163
 

Точка f (6-я точка) имеет наибольшее отклонение от первого главного компонента, поэтому ее удаление должно улучшить корреляцию. Аналогично, удаление e и f дает наилучшую 4-точечную корреляцию. Это проще, но обычно вы хотели бы удалить точку, вычислить основные компоненты с удалением этой точки, а затем определить следующую точку для удаления.

Комментарии:

1. спасибо за вашу помощь! У меня просто вопрос.. почему вы смотрите на PC2, а не на PC1? Заранее благодарю вас!

2. PC1 является главной осью корреляции между val1 и val2. Отклонения от этой строки (и, следовательно, уменьшение корреляции) равны PC2. Если бы корреляция была 1 или -1, все точки находились бы на линии, определенной PC1 .