2013-11-15 80 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