[英]Incorrect Holm-adjusted p-values in psych::corr.test()?
在准備有關Holm調整的p值的教材時,我着手通過R的psych :: corr.test()進行手工調整。 除兩個以外,所有26個by- R和by R調整后的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
歡迎來到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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.