如果我已经知道特定的百分位数,我试图了解如何生成正态分布。
用户对类似问题(link here)给出了非常全面的答案,但是当我尝试使用现有数据进行测试时,差异太大了。
我是怎么做到的:
x <- c(5,8,11)
PercRank <- c(2.1, 51.1, 98.8)
例如,PercRank = 2.1表示2.1%的数据具有值/得分&lt; = 5(x的第一个值)。同样,PercRank = 51.1表示51.1%的数据的值/得分<= 8。
我按照link中的方法进行操作。这是我的代码:
cum.p <- c(2.1, 51.1, 98.8)/100
prob <- c( cum.p[1], diff(cum.p), .01)
x <- c(5,8,11)
freq <- 1000 # final output size that we want
# Extreme values beyond x (to sample)
init <- -(abs(min(x)) + 1)
fin <- abs(max(x)) + 1
ival <- c(init, x, fin) # generate the sequence to take pairs from
len <- 100 # sequence of each pair
s <- sapply(2:length(ival), function(i) {
seq(ival[i-1], ival[i], length.out=len)
})
# sample from s, total of 10000 values with probabilities calculated above
out <- sample(s, freq, prob=rep(prob, each=len), replace = T)
quantile(out, cum.p)
# 2% 51.1% 98.8%
# 5 8 11
c(mean(out), sd(out))
# [1] 7.834401 2.214227
所有这一切都来自评论(linked),到目前为止一切都很好。然后我试着用我的拟合值检查生成的正态分布的效果如何:
data.frame(sort(rnorm(1000, mean=mean(out), sd=sd(out))))
...
# 988 13.000904
# 989 13.028881
# 990 13.076649
...
# 1000 14.567080
我很担心,因为第988个值(例如,1000个样本的98.8%) 13.000904 ,而我为98.8%百分位拟合的值 11.0。
我多次重新生成分布,方差一直大于它所需要的。
我很难过。如果有人能告诉我一种方法来使方差更准确,我将不胜感激。或者,这是不可避免的吗?
(我第一次在这里发帖,如果我违反了规则,我会道歉 - 如果需要,我可以更清楚地说明。)
答案 0 :(得分:1)
为什么不将此视为优化问题?
x <- c(5,8,11)
PercRank <- c(2.1, 51.1, 98.8)
fun <- function(par, pq) {
sum((log(pq[,1]/100)-pnorm(pq[,2], mean=par[1], sd=par[2], log.p=TRUE))^2)
}
par.estimates <- optim(c(0,1), fn=fun, pq=cbind(PercRank, x))
pnorm(11, par.estimates[[1]][1], par.estimates[[1]][2])
#[1] 0.9816948
结果似乎合理,但q = 11的预期值存在一些差异。但是,我怀疑您的数据存在问题(例如,由于四舍五入),因为以下情况很有效:
PercRank <- pnorm(x, 8, 2)*100
par.estimates <- optim(c(0,1), fn=fun, pq=cbind(PercRank, x))
par.estimates[[1]]
#[1] 7.999774 1.999953
当然,针对这个特定问题可能会有更好的优化器。