2013-11-15 52 views
1

我想了解如何生成正态分布,如果我已经知道特定百分位数。从已知百分位生成正态分布

一位用户对类似问题(link here)给出了非常全面的回答,但是当我用我现有的数据进行尝试和测试时,差异太大了。

如何这样做:

x <- c(5,8,11) 
PercRank <- c(2.1, 51.1, 98.8) 

PercRank = 2.1例如告诉数据的2.1%具有值/得分< = 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 

我很担心,因为第九百八十八值(例如,1000个样本98.8%)为13.000904,而我的价值适合98.8%百分位数是11.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 

当然,也有可能是这一特定问题的更好的优化。

+0

它的工作!比以前的方法好得多。非常感谢! – Michelle

+0

如果我有一个PercRank值的数据框,那么重复执行此操作最简单的方法是什么? – Michelle

+0

那么,你可能可以使用'lapply'或'apply'。 – Roland