首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >范畴变量的Pearson关联“分层”

范畴变量的Pearson关联“分层”
EN

Stack Overflow用户
提问于 2018-01-02 18:43:31
回答 2查看 1.6K关注 0票数 4

我对R很陌生。

我对计算我的数据的Pearson相关性感兴趣。我已经成功地解决了如何计算数据集中两个连续变量的相关性,x和y;然而,我希望用第三个分类变量“分层”这些关联:状态。我想说的是“x和y的相关系数/p值是状态的结果”。

我已经尝试过group_by方法,它位于dplyr包中,包含在cor.test中(如下所示)。我需要系数和p值,所以我一直在尝试使用cor.test方法。我也尝试过使用矩阵方法,但也没有成功。

代码语言:javascript
复制
Data<-read.csv("PATHWAYNAME")
  library(dplyr)
  CCor<-cor.test(Data$x, Data$y,
          method=c("pearson"), group_by(State))
  CCor

我能够单独运行每个状态的每一组值,以获得系数和p值;然而,我确信有一种更有效的方法来完成这个任务。我的数据足够大,因此单独运行它们将是非常乏味的。

提前感谢您的帮助!

UPDATE:使用它作为一个样本数据集,非常截断,但类似地代表我自己的变量,我想知道平均收入是否与每个州的访问次数相关;也就是说,平均收入与阿拉巴马州的访问次数是正相关还是负相关?

代码语言:javascript
复制
>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

当使用以下代码运行此数据时,我的结果是:

代码语言:javascript
复制
 CorrDat<-read.csv("File")
     CorrDat %>%
       group_by(State) %>%
        do(tidy(cor.test(CorrDat$NumVis, CorrDat$Income, method="pearson")))

结果

您能帮助澄清我对这段代码做错了什么吗?或者如果我需要使用另一种方法来完成这个任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-02 18:53:52

有几种方法可以在R. dplyr中实现,或者更一般地说,tidyverse是一组流行的工具,能够达到预期的结果。这些工具的关键区别在于管道%>%,它提供了一种从左到右编写代码而不是从内到外编写代码的方法(或者在环境中生成一堆中间对象)。尽管该管道可以与基本R一起使用,但它的流行来源于dplyr

下面是关于mtcar数据集的几个示例。关键功能是domap,这两个功能非常通用。我建议运行?do?map

代码语言:javascript
复制
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

另一种方式是:

代码语言:javascript
复制
mtcars  %>% 
  group_by(cyl) %>%
  do(cor = cor(.$mpg, .$disp)) %>%
  unnest()

或者更多的变量:

代码语言:javascript
复制
mtcars  %>% 
  group_by(cyl) %>%
  do(cor = as.data.frame(cor(.[,-2]) )) %>%
  unnest() 

Cor.test的一个例子:

代码语言:javascript
复制
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的方法:

代码语言:javascript
复制
mtcars  %>% 
  split(.$cyl)  %>% 
  map(~cor.test(.x$mpg, .x$disp))

它提供了一个列表,它可以使用相同的或另一个映射函数操作:

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

要提取系数:

代码语言:javascript
复制
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调用。这是正确的:

代码语言:javascript
复制
df %>%
  group_by(State) %>%
  do(tidy(cor.test(.$NumVis, .$AvgIncome, method="pearson")))

其中,.表示前面管道传递的数据。在该示例中发布的结果如下:

代码语言:javascript
复制
Error in cor.test.default(.$NumVis, .$AvgIncome, method = "pearson") : 
not enough finite observations

考虑到每组只需观察一次,这是合理的。

你所做的是:

代码语言:javascript
复制
CorrDat<-read.csv("File")
     CorrDat %>%
       group_by(State) %>%
        do(tidy(cor.test(CorrDat$NumVis, CorrDat$Income, method="pearson")))

将整个CorrDat集传递给do函数,因此它执行与组相同的操作。

%>%管道假定传递的数据将用作以下函数中的第一个参数,如果不应该,则数据可以引用为.。您可以执行诸如.$column.[,2]等操作。

票数 6
EN

Stack Overflow用户

发布于 2018-01-02 19:59:23

对于基数r,您可以使用by

例如,复制夫人的文章中的一个例子:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48066130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档