在准备关于Holm调整的 p 值的教材时,我着手手动进行调整,并通过 R 的psych :: corr.test进行调整。 ()。除26个值外,所有26个值和通过 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
答案 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