psych :: corr.test()中Holm调整后的p值不正确?

时间:2019-06-21 00:15:23

标签: r

在准备关于Holm调整的 p 值的教材时,我着手手动进行调整,并通过 R 的psych :: corr.test进行调整。 ()。除26个值外,所有26个值和通过 R 调整的 p 值均一致。我以为这是用户错误,但是我一生无法弄清楚自己在做什么错。

下面的代码将:

  1. 再现有问题的p值(心理软件包)。
  2. 未调整的p值排名(最低= 1)。
  3. 将Holm p值计算为p(unadj。)*等级。
  4. 比较调整后的p值。
library(psych)  
dat = state.x77  
R.out = corr.test(dat)  
R.out$p  
unadj.p = ifelse(lower.tri(R.out$p) == F, NA, R.out$p)  
p.ranks = 29 - rank(unadj.p, na.last = T)  
p.ranks = matrix(ifelse(p.ranks < 1, NA, p.ranks), 8, 8)  
myHolm = unadj.p * p.ranks  
myHolm = ifelse(myHolm > 1, 1, myHolm)  
myHolm = t(myHolm)  
round(myHolm, 4)  
round(R.out$p, 4)  
myHolm == R.out$p  

分析结果如下所示。第一个表中的调整后的p值(最小值)与第二个表中的p值匹配(来自corr.test()),除了第1行第7列第8列中的两个值。

这是我在这里的第一篇文章-对与发布规范的任何差异表示抱歉。

>   round(myHolm,4)  
     [,1] [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]  
[1,]   NA    1 1.0000 1.0000 0.2328 1.0000 0.2398 0.8765  
[2,]   NA   NA 0.0286 0.2343 1.0000 0.0000 1.0000 0.1616  
[3,]   NA   NA     NA 0.0002 0.0000 0.0000 0.0000 1.0000  
[4,]   NA   NA     NA     NA 0.0000 0.0002 0.7918 1.0000  
[5,]   NA   NA     NA     NA     NA 0.0065 0.0011 1.0000  
[6,]   NA   NA     NA     NA     NA     NA 0.1583 0.2510  
[7,]   NA   NA     NA     NA     NA     NA     NA 1.0000  
[8,]   NA   NA     NA     NA     NA     NA     NA     NA  
>   round(R.out$p,4)  
           Population Income Illiteracy Life Exp Murder HS Grad  Frost   Area  
Population     0.0000 1.0000     1.0000   1.0000 0.2328  1.0000 0.2510 1.0000  
Income         0.1467 0.0000     0.0286   0.2343 1.0000  0.0000 1.0000 0.1616  
Illiteracy     0.4569 0.0015     0.0000   0.0002 0.0000  0.0000 0.0000 1.0000  
Life Exp       0.6387 0.0156     0.0000   0.0000 0.0000  0.0002 0.7918 1.0000  
Murder         0.0146 0.1080     0.0000   0.0000 0.0000  0.0065 0.0011 1.0000  
HS Grad        0.4962 0.0000     0.0000   0.0000 0.0003  0.0000 0.1583 0.2510  
Frost          0.0184 0.1141     0.0000   0.0660 0.0001  0.0088 0.0000 1.0000  
Area           0.8765 0.0095     0.5938   0.4581 0.1106  0.0179 0.6828 0.0000  
>   myHolm == R.out$p  
           Population Income Illiteracy Life Exp Murder HS Grad Frost  Area  
Population         NA   TRUE       TRUE     TRUE   TRUE    TRUE FALSE FALSE  
Income             NA     NA       TRUE     TRUE   TRUE    TRUE  TRUE  TRUE  
Illiteracy         NA     NA         NA     TRUE   TRUE    TRUE  TRUE  TRUE  
Life Exp           NA     NA         NA       NA   TRUE    TRUE  TRUE  TRUE  
Murder             NA     NA         NA       NA     NA    TRUE  TRUE  TRUE  
HS Grad            NA     NA         NA       NA     NA      NA  TRUE  TRUE  
Frost              NA     NA         NA       NA     NA      NA    NA  TRUE  
Area               NA     NA         NA       NA     NA      NA    NA    NA  

1 个答案:

答案 0 :(得分:0)

欢迎来到SO,您的第一篇文章看起来很棒,因此没有问题。

就您的计算而言,您遇到了一个问题,因为当乘以unadj.p * p.ranks时,排名的顺序不会保留。例如,如果您检查第1行第7列的值或[1,7](您的值为0.2398),则低于第7行第8列的值或[7,8](0.2510)。情况并非如此,因为您的p.ranks矩阵显示它们应该分别排在第13位和第14位([1,7]是两者中的较高者)。

我们应该简单地对它们进行排序,而不是简单地乘以unadj.p * p.ranks,然后取所得乘法的累积最大值。

    library(psych)  
    dat = state.x77  
    R.out = corr.test(dat)  
    R.out$p  
    unadj.p = ifelse(lower.tri(R.out$p)==F,NA,R.out$p)  

    # convert into vector for ease of calculation
    p <- as.numeric(unadj.p)
    # remove missing values
    p <- p[!is.na(p)]

    # find the ranks of p
    pr <- rank(p)

    # put p in order
    po <- p[order(p)]

    # put ranks in order (1 is smallest)
    pro <- pr[order(pr, decreasing = T)]

    # now they are in order we can take the CUMULATIVE MAX to preserve order
    pcum <- cummax(po * pro)

    # now put back in our order and stick in our matrix
    myHolm <-unadj.p
    myHolm[!is.na(myHolm)] <- pcum[pr]


    myHolm = ifelse(myHolm>1,1,myHolm)  
    myHolm = t(myHolm)  

    myHolm == R.out$p  

#            Population Income Illiteracy Life Exp Murder HS Grad Frost Area
# Population         NA   TRUE       TRUE     TRUE   TRUE    TRUE  TRUE TRUE
# Income             NA     NA       TRUE     TRUE   TRUE    TRUE  TRUE TRUE
# Illiteracy         NA     NA         NA     TRUE   TRUE    TRUE  TRUE TRUE
# Life Exp           NA     NA         NA       NA   TRUE    TRUE  TRUE TRUE
# Murder             NA     NA         NA       NA     NA    TRUE  TRUE TRUE
# HS Grad            NA     NA         NA       NA     NA      NA  TRUE TRUE
# Frost              NA     NA         NA       NA     NA      NA    NA TRUE
# Area               NA     NA         NA       NA     NA      NA    NA   NA