Вычислить условную корреляцию сумм строк в цикле

#r #conditional-statements #correlation

#r #условные операторы #корреляция

Вопрос:

У меня есть: данные (анкета) из пяти переменных (от V1 до V5), на каждую из которых дан ответ по шкале от 1 до 6.

Я хотел бы вычислить следующие корреляции: возьмите V1 в качестве условия и для каждого возможного значения V1 вычислите корреляцию (V2 V3) с (V4 плюс V5). По сути: посмотрите только на случаи, когда V1 = 1, и вычислите значение V2 V3 с помощью V4 V5; затем для V1 = 2 и так далее.

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

 **Example Data**    

 ID     V1    V2     V3     V4     V5
61617   3     4      2      2      3
61618   3     3      3      5      5
61620   4     5      4      2      3
61621   2     5      2      4      1
61622   2     3      4      4      3
61623   3     5      2      2      3
61624   1     2      2      1      1
  

Даже для начала я вручную попробовал безусловную корреляцию сумм cor(sum(V$V2,V$V3),sum(V$V4,V$V5),use="pairwise.complete") , которая также дала NA.

Я пробовал операторы ifelse и rowSums , но безрезультатно. Как я могу подойти к этому как не программист?

Ответ №1:

Это может быть легко достигнуто с помощью dplyr pacakge.

 library(dplyr)

df %>%
  group_by(V1) %>%
  summarise(cor = cor(V2   V3, V4   V5))

# # A tibble: 6 x 2
#      V1     cor
#   <int>   <dbl>
# 1     1  0.111 
# 2     2  0.0434
# 3     3  0.140 
# 4     4  0.0791
# 5     5 -0.0298
# 6     6  0.103
  

Данные

 set.seed(123)
df <- as.data.frame(matrix(sample(1:6, 500, T), 100))

#   V1 V2 V3 V4 V5
# 1  3  2  5  3  5
# 2  6  4  6  1  3
# 3  3  2  5  5  4
# 4  2  2  3  6  2
# 5  2  6  3  6  5
# … with 95 more rows
  

Ответ №2:

Один из вариантов:

 sapply(
  split(V, V$V1),
  function(X) {
    with(X, cor(V2   V3, V4   V5, use="pairwise.complete"))
  }
)
#         2          3 
# 0.9176629 -0.4714045 
  

Воспроизводимые данные (модифицированные для меньшего количества групп):

 V <- data.frame(
  ID = c(61617L, 61618L, 61620L, 61621L, 61622L, 61623L, 61624L), 
  V1 = c(3L, 3L, 3L, 2L, 2L, 3L, 2L), 
  V2 = c(4L, 3L, 5L, 5L, 3L, 5L, 2L), 
  V3 = c(2L, 3L, 4L, 2L, 4L, 2L, 2L), 
  V4 = c(2L, 5L, 2L, 4L, 4L, 2L, 1L), 
  V5 = c(3L, 5L, 3L, 1L, 3L, 3L, 1L)
)