Dplyr и tidyverse - корреляция между шаблоном переменных (одна и та же переменная VAR1_time1 и VAR1_time2) - PullRequest
0 голосов
/ 25 ноября 2018

Я начал эту тему на Code Review и попросил кросс-постинг, потому что (по сравнению со StackOverflow) у Code Review мало dplyr и tidyverse пользователей.Пожалуйста, не стесняйтесь подавлять эту тему, если она не подходит для этого сообщества!Но если все в порядке, взгляните на этот набор данных.«А» и «b» используются для того, чтобы можно было различать, когда измерялась одна и та же переменная.В этом случае X1a и X1b обращаются к одной и той же переменной, но «a» было (предположим ..) в прошлом году, а «b» было в этом году.

Original dataframe

У меня есть конкретная цель!Я хочу соотнести «а» и «б» и построить его.Ось X имеет имя переменной (1, 2, 3 и т. Д.), А ось Y имеет результат корреляции.Plot

Поддельные данные, которые я создал, чтобы помочь мне прояснить этот вопрос, и код, который я разработал, следующие:

 all_items <- data.frame("1a" = sample(1:5), 
                            "2a" = sample(1:5),
                            "3a" = sample(1:5),
                            "1b" = sample(1:5),
                            "2b" = sample(1:5),
                            "3b" = rep(sample(1:5),10))


    #matrix with correlation
    all_correlation <- cor(all_items, method = "spearman") %>% 
      as.data.frame()

    #filter
    all_correlation <- all_correlation %>% select(-c(ends_with("a"))) #columns

    #create a colum with the now name
    all_correlation <- all_correlation %>% 
      mutate(item = row.names(.)) %>% select(item, everything())

    #supress some rows
    all_correlation <- all_correlation %>%  filter(!grepl("b", item))

    #filter(stringr::str_detect(row.names(.), "b"))
    #get only the diagonal
    all_correlation <- data.frame(item=1:3,Result=diag(as.matrix(all_correlation[, -1])))

    #P Value
    all_correlation_p_value <- Hmisc::rcorr(as.matrix(all_items))$P %>% as.data.frame()

    #filter
    all_correlation_p_value <- all_correlation_p_value %>% select(-c(ends_with("a")))
    all_correlation_p_value <- all_correlation_p_value %>% mutate(item = row.names(.)) %>% select(item, everything())
    all_correlation_p_value <- all_correlation_p_value %>%  filter(!grepl("b", item))
    all_correlation_p_value <- data.frame(item=1:3,P_Valor=diag(as.matrix(all_correlation_p_value[, -1])))

    #General table with the correlation  results
    all_correlation <- right_join(all_correlation,all_correlation_p_value, by = "item")


#Plot
ggplot(all_correlation, aes(x=item, y=Result)) + 
  geom_point(aes(color=Result)) +
  geom_line() +
  annotate("text", x = all_correlation$item, 
           y=all_correlation$Result, 
           label = paste("P-value =",round(all_correlation$P_Valor,3)), hjust = -0.1, colour = "red") +
  scale_x_continuous(breaks = seq(1,3,1)) 

Спасибо.

1 Ответ

0 голосов
/ 26 ноября 2018

Я получил ответ на проверку кода , и я поставил его здесь, чтобы каждый мог получить к нему доступ.Кредиты на flodel

Вот два возможных переписывания.Для первого обратите внимание, как Hmisc::rcorr уже вычисляет матрицы correlations ($r) и p-values ($P), чтобы вы могли основывать всю свою работу на ней, при условии, что вы извлекаете строки прав (a_vars) и столбцы (b_vars) и сохраняете только диагональзначения:

correlations <- rcorr(as.matrix(all_items), type = "spearman")
a_vars <- ends_with("a", vars = names(all_items))
b_vars <- ends_with("b", vars = names(all_items))
all_correlation <- data.frame(
  item    = seq_along(a_vars),
  Result  = diag(correlations$r[a_vars, b_vars]),
  P_Valor = diag(correlations$P[a_vars, b_vars])
)

Что мне не очень нравится в этом подходе, так это то, что он использует только 3 из 36 корреляций, которые были вычислены с помощью rcorr.Во втором подходе я начинаю с разделения данных на две таблицы (одну для a и одну для b), чтобы вычислить только 3 корреляции с помощью Map.Я также переключился с rcorr на базовый cor.test, который имеет (IMO) более интуитивное поведение: при задании двух векторов в качестве входных данных он вычисляет одну корреляцию, а не четыре.

a <- all_items %>% select(ends_with("a"))
b <- all_items %>% select(ends_with("b"))
cor_test <- Map(cor.test, a, b)
all_correlation <- data.frame(
  item    = seq_along(a),
  Result  = sapply(cor_test, `[[`, "estimate"),
  P_Valor = sapply(cor_test, `[[`, "p.value")
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...