在编写关于Holm调整的p-值的教材时,我开始手工和通过R的psych::corr.test()进行调整。除两个外,所有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值与第二个表中的值匹配--来自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 发布于 2019-06-21 02:14:13
欢迎来到这样,你的第一个帖子看起来很棒,所以没有问题。
就您的计算而言,您遇到了一个问题,因为在乘以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 NAhttps://stackoverflow.com/questions/56695363
复制相似问题