簡體   English   中英

皮爾遜相關性按分類變量“分層”

[英]Pearson Correlation “Stratified” by Categorical Variable

我是R.的新手

我有興趣為我的數據計算Pearson Correlations。 我已經成功地弄清楚如何計算我的數據集x和y中兩個連續變量的相關性; 但是,我希望通過第三個分類變量“分層”相關性:狀態。 我想能夠說“x和y的相關系數/ p值是[狀態]中的[結果]。”

我已經嘗試了位於dplyr包中的group_by方法,該方法位於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")))

結果

您是否能夠幫助澄清我在使用此代碼時做錯了什么,或者我是否需要使用替代方法來完成此任務?

有幾種方法可以在dplyr實現,或者更一般地說, tidyverse是一組能夠達到預期效果的流行工具。 這些工具的主要區別在於管道%>% ,它提供了一種從左到右而不是從內到外編寫代碼的方法(或者在環境中創建一堆中間對象)。 雖然管道可以與基礎R一起使用,但它的受歡迎程度來自於dplyr

以下是mtcars數據集的幾個示例。 關鍵功能是domap ,它們非常通用。 我建議運行?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))

它給出了一個列表,可以使用相同或另一個map函數進行操作:

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

考慮到每組僅進行1次觀察,這是合理的

你做的是:

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

將整個CorrDat設置傳遞給do函數,因此它執行與組相同的操作次數。

%>%管道假定傳遞的數據將用作以下函數中的第一個參數,如果不應該將數據稱為as . 您可以執行.$column.[,2]等操作。

隨着基礎R,您可以使用by

例如,復制missuse的帖子中的一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM