2

特定のパーセンタイルが既にわかっている場合、正規分布を生成する方法を理解しようとしています。

ユーザーは同様の質問に対して非常に包括的な回答を提供しました (リンクはこちら) が、既存のデータで試してテストしたところ、分散が大きすぎました。

私がこれをした方法:

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 であることを示します。

このリンクの方法に従いました。これは私のコードです:

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

これはすべてコメント(リンク済み)からのもので、これまでのところとても良い. 次に、生成された正規分布が適合値でどの程度うまく機能するかを確認しようとしました。

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 だったので、私は心配していました。

分布を何度も再生成しましたが、分散は一貫して必要以上に大きくなりました。

私は困惑しています。分散をより正確にする方法を誰かに教えていただければ幸いです。それとも、これは避けられないことですか?

(初めてここに投稿するので、ルールを破っていたら申し訳ありません。必要に応じてもっと明確にすることができます。)

4

1 に答える 1