Проблема с корреляционной матрицей для большой таблицы в R - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть таблица данных, как показано ниже.

data table1:

Cty  LR1998  LR1999....LR2018  SM1998  SM1999 ..... SM2018
1    0.1     2.5 ....  5.2     14.52   58.62  ..... 69.2  
7    0       50.2 ...  10.6    25.5    80.2   ..... 80.5 
.
.

Мне нужно найти корреляцию (Pearson) для каждого "Cty" для периода времени с 1998 по 2018 год, используя переменные LR и SM для этого периода времени.

Я также хотел бы создать хороший корреляционный график.

Может кто-нибудь подсказать мне, как это сделать с помощью R? Я знаю, как использовать функцию «cor», но не знаю, как использовать ее для большой таблицы данных.

Example Output:

Cty  Cor   p-value
1    0.16  0.125
7    0.32  <0.05

Большое спасибо.

Ответы [ 2 ]

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

Чтобы получить корреляцию между странами, это может помочь изменить данные. Хотя есть базовая функция reshape, я всегда находил ее непонятной, поэтому я часто использую tidyr (или data.table) для изменения формы операций.

Сначала некоторые данные:

set.seed(2)
n <- 6
x <- cbind.data.frame(
  CTY = LETTERS[seq_len(n)],
  sapply(paste0("LR", 2000:2006), function(ign) runif(n)),
  stringsAsFactors=FALSE
)

Изменение формы, так что каждая страна уникальна по вертикали (исключая мой неоправданно сложный tidyr метод с "должен был быть очевидным" t, спасибо Пуджа р):

y <- `colnames<-`(t(x[-1]), x[[1]])
cor(y)

(Самое большое различие между моим теперь удаленным gather / spread подходом состоит в том, что это все еще matrix, тривиально преобразуемый с as.data.frame, если это необходимо. Здесь не должно быть необходимости.)

Теперь корреляция довольно прямолинейна.

cor(y)
#        A      B       C       D      E      F
# A  1.000 -0.435 -0.1443 -0.2010  0.736 -0.471
# B -0.435  1.000 -0.3825 -0.3493 -0.145  0.279
# C -0.144 -0.382  1.0000  0.0885 -0.426  0.447
# D -0.201 -0.349  0.0885  1.0000 -0.523 -0.128
# E  0.736 -0.145 -0.4261 -0.5232  1.000 -0.121
# F -0.471  0.279  0.4467 -0.1279 -0.121  1.000

С данными в этом формате адаптация к использованию cor.test немного больше работы. Я буду опираться на большее количество tidyverse для этого:

# library(purrr)
crossing(a=x$CTY, b=x$CTY) %>%
  rowwise() %>%
  do(bind_cols(.,
               purrr::map2_dfc(.$a, .$b,
                               ~ as.data.frame(cor.test(y[,.x], y[,.y])[c("estimate", "p.value")]))
               )) %>%
  ungroup()
# # A tibble: 36 x 4
#    a     b     estimate p.value
#  * <chr> <chr>    <dbl>   <dbl>
#  1 A     A        1      0     
#  2 A     B       -0.435  0.329 
#  3 A     C       -0.144  0.757 
#  4 A     D       -0.201  0.666 
#  5 A     E        0.736  0.0591
#  6 A     F       -0.471  0.286 
#  7 B     A       -0.435  0.329 
#  8 B     B        1      0     
#  9 B     C       -0.382  0.397 
# 10 B     D       -0.349  0.443 
# # ... with 26 more rows

Поскольку ваши корреляционные тесты являются ассоциативными (так же, как a,b и b,a), мы можем удалить дубликаты и запустить тесты с:

crossing(a=x$CTY, b=x$CTY) %>%
  transmute(a1 = pmin(a,b), b1 = pmax(a,b)) %>%
  distinct() %>%
  rowwise() %>%
  do(bind_cols(.,
               purrr::map2_dfc(.$a1, .$b1,
                               ~ as.data.frame(cor.test(y[,.x], y[,.y])[c("estimate", "p.value")]))
               )) %>%
  ungroup()
# # A tibble: 21 x 4 ...
0 голосов
/ 09 ноября 2018

Для графика корреляции вы можете попробовать это: Транспонировать фрейм данных и использовать функцию «пар»

пар (т (таблица1 [-1]))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...