Вот мой дубль (с использованием процентильных рангов), который предполагает, что доступен только одномерный ряд измерений (ваш столбец озаглавлен 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
, а также запросить две другие команды arrow
и заменить каждое вхождение 0.8
(ах ... радость от магических чисел!) на желаемую.(в данном случае 0,9).
Некоторые пояснения по поводу приведенного выше кода:
- Я создал искусственный набор данных, который был сохранен на диске.
- 80-й процентильвычисляется с использованием awk, но перед этим нам нужно
- удалить заголовок, сгенерированный с помощью
table
(первые четыре строки);(мы могли бы попросить awk начать с 5-й строки, но давайте продолжим.) - сохранить только второй столбец;
- отсортировать записи.
- Команда awk для вычисления 80-го процентиля требует усечения, что делается в соответствии с рекомендациями здесь .(В 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
находится в вашем домашнем каталоге.
Sidenote: И если вы можете жить без 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)