我想了解如何生成正态分布,如果我已经知道特定百分位数。从已知百分位生成正态分布
一位用户对类似问题(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。
我重新生成了许多次的分布,并且方差一直大于它所需要的。
我很难过。如果有人能告诉我一种使方差更准确的方法,我将不胜感激。或者,这是不可避免的?
(我第一次在这里发帖,我很抱歉,如果我打破规则 - 我能更清楚如果需要的话)。
它的工作!比以前的方法好得多。非常感谢! – Michelle
如果我有一个PercRank值的数据框,那么重复执行此操作最简单的方法是什么? – Michelle
那么,你可能可以使用'lapply'或'apply'。 – Roland