これが私の見解です(パーセンタイルランクを使用)。これは、一変量の一連の測定値が利用可能であることのみを前提としています(列の見出しはX
)。事前に計算された累積頻度で動作するように少し調整したい場合がありますが、それはそれほど難しいことではありません。
# generate some artificial data
reset
set sample 200
set table 'rnd.dat'
plot invnorm(rand(0))
unset table
# display the CDF
unset key
set yrange [0:1]
perc80=system("cat rnd.dat | sed '1,4d' | awk '{print $2}' | sort -n | \
awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.8-0.5)]}'")
set arrow from perc80,0 to perc80,0.8 nohead lt 2 lw 2
set arrow from graph(0,0),0.8 to perc80,0.8 nohead lt 2 lw 2
plot 'rnd.dat' using 2:(1./200.) smooth cumulative
これにより、次の出力が得られます。
もちろん、パーセンタイル値はいくつでも追加できます。たとえば、新しい変数を定義し、perc90
他の 2 つのarrow
コマンドを要求し、 0.8
(ああ... 魔法の数字の喜び!) が出現するたびに目的のもの (この場合は 0.9) に置き換えるだけです。
上記のコードに関するいくつかの説明:
- ディスクに保存された人工データセットを生成しました。
- 80 パーセンタイルは awk を使用して計算されますが、その前に次のことを行う必要があります。
table
(最初の 4 行)によって生成されたヘッダーを削除します。(awk に 5 行目から開始するように指示することもできますが、それで進めます。)
- 2 番目の列のみを保持します。
- エントリを並べ替えます。
- 80 パーセンタイルを計算する awk コマンドには切り捨てが必要です。これは、ここで提案されているように行われます。(R では
trunc(rank(x))/length(x)
、パーセンタイル ランクを取得するような関数を使用するだけです。)
R を試してみたい場合は、その長い一連の sed/awk コマンドを次のような R の呼び出しに安全に置き換えることができます。
Rscript -e 'x=read.table("~/rnd.dat")[,2]; sort(x)[trunc(length(x)*.8)]'
rnd.dat
ホームディレクトリにあると仮定します。
補足:そして、gnuplot なしで生活できる場合は、そのようなグラフィックスを行うためのいくつかの R コマンドを次に示します (quantile
関数を使用しなくても):
x <- rnorm(200)
xs <- sort(x)
xf <- (1:length(xs))/length(xs)
plot(xs, xf, xlab="X", ylab="Cumulative frequency")
## quick outline of the 80th percentile rank
perc80 <- xs[trunc(length(x)*.8)]
abline(h=.8, v=perc80)
## alternative solution
plot(ecdf(x))
segments(par("usr")[1], .8, perc80, .8)
segments(perc80, par("usr")[3], perc80, .8)