我同意上面的评论,如果问题更精确一点,这会更容易。
这里有一些需要考虑的事情。
set.seed(1)
## simulate data: refine to reflect attributes of interest
n <- 30 ## test count
m <- 100 ## student count
## student "ability": student rows, test columns
sa <- matrix(round(runif(m*n,30,80)), nrow=m)
te <- 5 ## test error
## test scores:
ts <- matrix(round(rnorm(m*n, sa, te)),nrow=m)
rownames(ts) <- seq(m)
方法一:
使用汇总度量来折叠学生在测试中的可变性。
## test score summary
tss <- apply(ts,1,mean)
qqnorm(tss); qqline(tss, col=2)

取 tss 作为参数匹配的正态分布样本:
ps <-pnorm(tss, mean(tss), sd(tss))
## top 10% students
(a <- rownames(ts[ps>0.9,]))
[1] "4" "14" "23" "30" "39" "43" "45" "49" "50" "68" "69" "80"
方法B:
在测试中获取 z 分数,从学生的单侧 t 测试中报告 p 值。
z.ps <- function(ts) {
zs <- scale(ts)
st <- apply(zs, 1, function(s) t.test(s, alternative='greater'))
unlist(lapply(st, function(s) s$p.value))
}
ps <- z.ps(ts)
## top 10% students
(b <- rownames(ts[ps<0.1,]))
[1] "3" "4" "8" "14" "23" "30" "39" "43" "45" "49" "50" "68" "69" "80" "83"
[16] "96"
这导致更“宽松”的阈值。它确实试图解释学生内部测试之间的可变性,但正常假设有时是有问题的,即使对于较大的 n 也是如此。
请参见此处(未显示图表),并使用不同的 m,n 重复方法:
op <- par(mfrow=c(3,4))
for (i in sample(n,12)) { qqnorm(ts[i,]); qqline(ts[i,],col=2) }
par(op)
这部分是因为这些数据的模拟方式。将“学生”的能力建模为间隔一致且在人类受试者中不相关可能不太现实。
重点不是为模拟的幼稚性辩护,或以其他方式。而是要强调,如果您的“学生”是来自任意过程的性能指标,那么这些属性将影响构成明智方法的因素。
希望有帮助。