首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R相关图中返回重要匹配?

如何在R相关图中返回重要匹配?
EN

Stack Overflow用户
提问于 2016-11-10 08:00:18
回答 2查看 770关注 0票数 0

我想从图1所示的下列结果中返回重要的匹配。

代码语言:javascript
复制
library("corrplot")

M <- cor(mtcars)

# http://www.sthda.com/english/wiki/visualize-correlation-matrix-using-correlogram
cor.mtest <- function(mat, ...) {
    mat <- as.matrix(mat)
    n <- ncol(mat)
    p.mat<- matrix(NA, n, n)
    diag(p.mat) <- 0
    for (i in 1:(n - 1)) {
        for (j in (i + 1):n) {
            tmp <- cor.test(mat[, i], mat[, j], ...)
            p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
        }
    }
  colnames(p.mat) <- rownames(p.mat) <- colnames(mat) 
  p.mat
}

N <- length(mtcars) -1
p.mat <- cor.mtest(mtcars)
head(p.mat[, 1:N])
ids <- seq(1,N) 

corrplot(M, type="upper", order="hclust", tl.pos=c("td"), method="circle",  
    tl.cex = 0.5, tl.col = 'black', 
    diag = FALSE, p.mat = p.mat, 
    sig.level = 0.0000005)

图1输出

预期产出

代码语言:javascript
复制
cyl: wt hp
disp: wt hp cyl
...

R: 3.3.1

操作系统: Debian 8.5

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-10 08:33:30

关于多个测试的通常警告适用于这里。

我会编写一个矢量化的cor.test (有一个原因无法从stats包中获得,参见上文)。

代码语言:javascript
复制
cor.test.all <- function(DF) {
  #based on code from stats:::cor.test.default
  #see license() for the license 
  #two-sided test for pearson correlation 
  #without adjustment of p-values
  #no Na treatment
  r <- cor(DF)
  df <- nrow(DF) - 2L
  t <-  sqrt(df) * r/sqrt(1 - r^2)
  2 * pmin(pt(t, df), pt(t,  df, lower.tail = FALSE))
}

cor.p <- cor.test.all(mtcars)
diag(cor.p) <- NA
res <- which(cor.p < 0.0000005, arr.ind = TRUE)

split(colnames(cor.p)[res[,2]], rownames(cor.p)[res[,1]])
#$am
#[1] "gear"
#
#$cyl
#[1] "mpg"  "disp" "hp"   "wt"   "vs"  
#
#$disp
#[1] "mpg" "cyl" "hp"  "wt" 
#
#$gear
#[1] "am"
#
#$hp
#[1] "mpg"  "cyl"  "disp"
#
#$mpg
#[1] "cyl"  "disp" "hp"   "wt"  
#
#$vs
#[1] "cyl"
#
#$wt
#[1] "mpg"  "cyl"  "disp"
票数 1
EN

Stack Overflow用户

发布于 2016-11-10 08:25:53

如何使用cor.test迭代每个变量名称对?例:

代码语言:javascript
复制
sapply(names(mtcars), function(n1) {
    p <- sapply(setdiff(names(mtcars), n1), function(n2)
        cor.test(mtcars[, n1], mtcars[, n2])$p.value < 0.0000005)
    names(p)[p]
})
# $mpg
# [1] "cyl"  "disp" "hp"   "wt"  
# 
# $cyl
# [1] "mpg"  "disp" "hp"   "wt"   "vs"  
# 
# $disp
# [1] "mpg" "cyl" "hp"  "wt" 
# 
# $hp
# [1] "mpg"  "cyl"  "disp"
# 
# $drat
# character(0)
# 
# $wt
# [1] "mpg"  "cyl"  "disp"
# 
# $qsec
# character(0)
# 
# $vs
# [1] "cyl"
# 
# $am
# [1] "gear"
# 
# $gear
# [1] "am"
# 
# $carb
# character(0)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40522547

复制
相关文章

相似问题

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