Я новичок в R.

Я заинтересован в вычислении корреляции Пирсона для моих данных. Я успешно понял, как вычислить корреляцию двух непрерывных переменных в моем наборе данных, x и y; однако я надеюсь «расслоить» корреляции третьей категориальной переменной: состоянием. Я хотел бы иметь возможность сказать «коэффициент корреляции / p-значение x и y равен [Результату] в [Состояние]».

Я пробовал метод group_by, расположенный в пакете dplyr, размещенном в cor.test (показано ниже). Мне нужны как коэффициенты, так и p-значения, поэтому я пытался использовать метод cor.test. Я также пробовал использовать матричный метод, но и у меня не получилось.

Data<-read.csv("PATHWAYNAME")
  library(dplyr)
  CCor<-cor.test(Data$x, Data$y,
          method=c("pearson"), group_by(State))
  CCor

Я могу запустить каждый набор значений для каждого состояния отдельно, чтобы получить коэффициенты и p-значения; однако я уверен, что есть более эффективный способ выполнить эту задачу. Мои данные достаточно велики, и запускать их по отдельности будет утомительно.

Заранее спасибо за вашу помощь!

ОБНОВЛЕНИЕ: Используя это как образец набора данных, который чрезвычайно усечен, но аналогичным образом представляет переменные в моем собственном, я хотел бы знать, коррелирует ли средний доход с количеством посещений в каждом из перечисленных штатов; то есть, имеет ли средний доход положительную или отрицательную корреляцию с количеством посещений в штате Алабама?

>State  NumVis  AvgIncome
>IN       45        60000
>AL       100       56000
>AK       45        80000
>ME       89        54000
>NC       120       100000
>SC       356       43000
>ND       100       25000
>SD       63        20000
>MN       54        46000
>ID       85        55000

При запуске этих данных с использованием кода, указанного ниже, мой результат таков:

 CorrDat<-read.csv("File")
     CorrDat %>%
       group_by(State) %>%
        do(tidy(cor.test(CorrDat$NumVis, CorrDat$Income, method="pearson")))

Полученные результаты

Не могли бы вы помочь прояснить, что я делаю неправильно с этим кодом, или мне нужно использовать альтернативный метод для выполнения этой задачи?

r
4
user9165024 2 Янв 2018 в 21:43

2 ответа

Лучший ответ

Есть несколько способов сделать это в R. dplyr или, в более общем смысле, tidyverse - это популярная группа инструментов, способных достичь желаемого результата. Ключевым отличием этих инструментов является конвейер %>%, который предоставляет средства для написания кода слева направо, а не изнутри (или для создания кучи промежуточных объектов в среде). Хотя трубку можно использовать с базой R, ее популярность пришла с dplyr.

Вот несколько примеров по набору данных mtcars. Ключевые функции: do и map, которые весьма универсальны. Я предлагаю запустить ?do и ?map.

library(tidyverse)

mtcars %>%
  group_by(cyl) %>%
  summarize(cor = cor(mpg, disp))
#output
# A tibble: 3 x 2
    cyl correlation
  <dbl>       <dbl>
1     4  -0.8052361
2     6   0.1030827
3     8  -0.5197670

Другой способ:

mtcars  %>% 
  group_by(cyl) %>%
  do(cor = cor(.$mpg, .$disp)) %>%
  unnest()

Или для других переменных:

mtcars  %>% 
  group_by(cyl) %>%
  do(cor = as.data.frame(cor(.[,-2]) )) %>%
  unnest() 

Пример с cor.test:

library(broom)

mtcars  %>% 
  group_by(cyl)  %>% 
  do(tidy(cor.test(.$mpg, .$disp))) 
#output
    cyl   estimate  statistic     p.value parameter   conf.low   conf.high                               method alternative
  <dbl>      <dbl>      <dbl>       <dbl>     <int>      <dbl>       <dbl>                               <fctr>      <fctr>
1     4 -0.8052361 -4.0740206 0.002782827         9 -0.9474526 -0.39724826 Pearson's product-moment correlation   two.sided
2     6  0.1030827  0.2317344 0.825929685         5 -0.7046776  0.79446840 Pearson's product-moment correlation   two.sided
3     8 -0.5197670 -2.1075838 0.056774876        12 -0.8232990  0.01492976 Pearson's product-moment correlation   two.sided

И еще один способ использования purrr :: map:

mtcars  %>% 
  split(.$cyl)  %>% 
  map(~cor.test(.x$mpg, .x$disp))

Который дает список, которым можно управлять с помощью той же или другой функции карты:

mtcars  %>% 
  split(.$cyl)  %>% 
  map(~cor.test(.x$mpg, .x$disp)) %>%
  map_dbl("p.value")
#output:
          4           6           8 
0.002782827 0.825929685 0.056774876 

Для извлечения коэффициентов:

mtcars  %>% 
  split(.$cyl)  %>% 
  map(~cor.test(.x$mpg, .x$disp)) %>%
  map(~data.frame(cor = .x$estimate, p = .x$p.value)) #check also `map_dfr` and `map_dfc`

#output
$`4`
           cor           p
cor -0.8052361 0.002782827

$`6`
          cor         p
cor 0.1030827 0.8259297

$`8`
          cor          p
cor -0.519767 0.05677488

ОБНОВЛЕНИЕ: ответ на обновленный вопрос:

Проблема в том, как указать вызов do. Это верно:

df %>%
  group_by(State) %>%
  do(tidy(cor.test(.$NumVis, .$AvgIncome, method="pearson")))

Где . представляет данные, переданные предыдущим конвейером. В опубликованном примере это приводит к:

Error in cor.test.default(.$NumVis, .$AvgIncome, method = "pearson") : 
not enough finite observations

Что разумно, учитывая, что предоставляется только одно наблюдение на группу

Что вы сделали:

CorrDat<-read.csv("File")
     CorrDat %>%
       group_by(State) %>%
        do(tidy(cor.test(CorrDat$NumVis, CorrDat$Income, method="pearson")))

Передача всего набора CorrDat в функцию do, чтобы она выполняла одну и ту же операцию столько раз, сколько есть групп.

Канал %>% предполагает, что переданные данные будут использоваться в качестве первого аргумента в следующей функции, в противном случае на данные можно ссылаться как на .. Вы можете выполнять такие операции, как .$column или .[,2] и т. Д.

5
missuse 3 Янв 2018 в 19:47

С базой r вы можете использовать {{X0 }}.

Например, репликация одного из примеров из сообщения о неправильном использовании:

do.call(rbind,
        by(mtcars, mtcars$cyl, FUN = function(x) cor.test(x$mpg, x$disp, data = x)))

statistic parameter p.value     estimate   null.value alternative method                                 data.name          conf.int 
4 -4.074021 9         0.002782827 -0.8052361 0          "two.sided" "Pearson's product-moment correlation" "x$mpg and x$disp" Numeric,2
6 0.2317344 5         0.8259297   0.1030827  0          "two.sided" "Pearson's product-moment correlation" "x$mpg and x$disp" Numeric,2
8 -2.107584 12        0.05677488  -0.519767  0          "two.sided" "Pearson's product-moment correlation" "x$mpg and x$disp" Numeric,2
0
erocoar 2 Янв 2018 в 19:59