как рассчитать корреляцию между одной строкой и оставшейся строкой фрейма данных - PullRequest
2 голосов
/ 16 марта 2019

У меня есть такие данные

 name  col1  col2  col3
1    a 43.78 43.80 43.14
2    b 43.84 43.40 42.85
3    c 37.92 37.64 37.54
4    d 31.72 31.62 31.74

Давайте назовем это df

df<-structure(list(name = structure(1:4, .Label = c("a", "b", "c", 
"d"), class = "factor"), col1 = c(43.78, 43.84, 37.92, 31.72), 
    col2 = c(43.8, 43.4, 37.64, 31.62), col3 = c(43.14, 42.85, 
    37.54, 31.74)), class = "data.frame", row.names = c(NA, -4L
))

Теперь я хочу вычислить R2 и скорректированный R2 между строкой d и другие строки

Если я хочу увидеть все комбинации, я могу сделать следующее для корреляции

out <- cor(t(df[, -1]))
out[upper.tri(out, diag = TRUE)] <- NA
rownames(out) <- colnames(out) <- df$name
out <- na.omit(reshape::melt(t(out)))
out <- out[ order(out$X1, out$X2), ]

, которая дает мне это

   X1 X2      value
5   a  b  0.8841255
9   a  c  0.6842705
13  a  d -0.6491118
10  b  c  0.9457125
14  b  d -0.2184630
15  c  d  0.1105508

, но я толькохочу между строкой d и остальными, а также хочу иметь как коэффициент корреляции, так и скорректированный R2

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Если я вас правильно понимаю, вы хотите корреляцию между d и каждым оставшимся столбцом.

(M <- t(as.matrix(`rownames<-`(df1[-1], df$name))))
#          a     b     c     d
# col1 43.78 43.84 37.92 31.72
# col2 43.80 43.40 37.64 31.62
# col3 43.14 42.85 37.54 31.74

Благодаря векторизации мы можем очень легко вычислить корреляцию между d и остатком:

out <- t(cor(M[, 4], M[, -4]))

R 2 это просто квадрат корреляции ( Ссылка ), которую мы можем cbind к корреляциям.

`colnames<-`(cbind(out, out^2), c("cor", "r2"))
#          cor         r2
# a -0.6491118 0.42134617
# b -0.2184630 0.04772607
# c  0.1105508 0.01222148

( Примечание: Если вам интересна форма &#96;colnames<-&#96;, вы можете прочитать "Advanced R: 6.8.4 Функции замены" .)


Данные

df1 <- structure(list(name = structure(1:4, .Label = c("a", "b", "c", 
"d"), class = "factor"), col1 = c(43.78, 43.84, 37.92, 31.72), 
    col2 = c(43.8, 43.4, 37.64, 31.62), col3 = c(43.14, 42.85, 
    37.54, 31.74)), class = "data.frame", row.names = c(NA, -4L
))
0 голосов
/ 16 марта 2019

Проще, если вы сначала перенесете свой фрейм данных.После этого используйте purrr::map и broom::tidy, чтобы выполнить работу

library(tidyverse)

df <- structure(list(name = structure(1:4, .Label = c("a", "b", "c", 
"d"), class = "factor"), col1 = c(43.78, 43.84, 37.92, 31.72), 
    col2 = c(43.8, 43.4, 37.64, 31.62), col3 = c(43.14, 42.85, 
    37.54, 31.74)), class = "data.frame", row.names = c(NA, -4L
))

# transpose df
df_transpose <- df %>% 
  gather(variable, value, -name) %>% 
  spread(name, value) %>% 
  select(-variable)

# loop through columns, apply `cor` vs 'd' column
colnames(df_transpose) %>%
  set_names() %>% 
  map(~ cor(df_transpose[, .x], df_transpose[, 'd'])) %>%
  map_dfr(., broom::tidy, .id = "var")

#> # A tibble: 4 x 2
#>   var        x
#>   <chr>  <dbl>
#> 1 a     -0.649
#> 2 b     -0.218
#> 3 c      0.111
#> 4 d      1

Создано в 2019-03-15 пакетом prex (v0.2.1.9000))

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