[英]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數據集的幾個示例。 關鍵功能是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))
它給出了一個列表,可以使用相同或另一個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.