我对R很陌生。
我对计算我的数据的Pearson相关性感兴趣。我已经成功地解决了如何计算数据集中两个连续变量的相关性,x和y;然而,我希望用第三个分类变量“分层”这些关联:状态。我想说的是“x和y的相关系数/p值是状态的结果”。
我已经尝试过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值;然而,我确信有一种更有效的方法来完成这个任务。我的数据足够大,因此单独运行它们将是非常乏味的。
提前感谢您的帮助!
UPDATE:使用它作为一个样本数据集,非常截断,但类似地代表我自己的变量,我想知道平均收入是否与每个州的访问次数相关;也就是说,平均收入与阿拉巴马州的访问次数是正相关还是负相关?
>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")))您能帮助澄清我对这段代码做错了什么吗?或者如果我需要使用另一种方法来完成这个任务?
发布于 2018-01-02 18:53:52
有几种方法可以在R. dplyr中实现,或者更一般地说,tidyverse是一组流行的工具,能够达到预期的结果。这些工具的关键区别在于管道%>%,它提供了一种从左到右编写代码而不是从内到外编写代码的方法(或者在环境中生成一堆中间对象)。尽管该管道可以与基本R一起使用,但它的流行来源于dplyr。
下面是关于mtcar数据集的几个示例。关键功能是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]等操作。
发布于 2018-01-02 19:59:23
对于基数r,您可以使用by。
例如,复制夫人的文章中的一个例子:
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,2https://stackoverflow.com/questions/48066130
复制相似问题