Я хотел бы сопоставить частотные данные с дискретным обобщенным бета-распределением (ДГБД).
Данные выглядят так:
freq = c(1116, 2067, 137 , 124, 643, 2042, 55 ,47186, 7504, 1488, 211, 1608,
3517 , 7 , 896 , 378, 17 ,3098, 164977 , 601 , 196, 637, 149 , 44,2 , 1801, 882 , 636,5184, 1851, 776 , 343 , 851, 33 ,4011, 209, 715 ,
937 , 20, 6922, 2028 , 23, 3045 , 16 , 334, 31 , 2)
Rank = rank(-freq, ties.method = c("first") )
p = freq/sum(freq)
получить формы журнала
log.f = log(freq)
log.p = log(p)
log.rank = log(Rank)
log.inverse.rank = log(length(Rank)+1-Rank)
линейная регрессия дискретного обобщенного бета-распределения
co=coef(lm(log.p~log.inverse.rank + log.rank))
zmf = function(x) exp(co[[1]]+ co[[2]]*log(length(x)+1-x) + co[[3]]*log(x))
участок
plot(p~Rank, xlim = c(1, 80), log = "xy",xlab = "Rank (log)", ylab = "Probability (log)")
curve(zmf, col="blue", add = T)
xx=c(1:length(Rank))
lines(zmf(xx)~xx, col = "red")
points(zmf(xx)~xx, col = "purple")
Рисунок 1. Сюжет выглядит так
Мой вопрос в том, как правильно продемонстрировать результат? линии (точки) или кривые?
Обновлять:
Хоть я и не разобрался с подчиненной логикой, но решение найдено:
@Frank напоминает мне, что я заметил трюк с установкой длины n на кривой. Это решает проблему. Таким образом, n на кривой необходимо, когда мы пытаемся подогнать необработанные данные. Хотя во многих ситуациях n игнорируется.
plot(p~Rank, log = "xy",xlab = "Rank (log)", ylab = "Probability (log)")
curve(zmf, col="blue", add = T, n = length(Rank)) # set the the number of x values at which to evaluate.
zmf
— это просто общая функция, такая как формула для линииy = mx + b
илиy = x**2
. У них есть общие формы, которые мы можем построить, но если вы подгоните их под данные или установите некоторые параметры (пересечение по оси y, наклон и т. д.), это будет изменить форму и расположение кривой - person rawr   schedule 17.03.2014lines
иpoints
. - person Matthew Lundberg   schedule 17.03.2014log = "xy"
дляcurve
игнорируется, посколькуadd = TRUE
. Логарифмы применяются без аргумента в результате предыдущей командыplot
. Это не объясняет разницу. Похоже, что ответ на вопрос, выделенный жирным шрифтом, заключается в том, чтоlines
иpoints
верны, но что-то не так сcurve
. Более интересный вопрос, что не так? - person Matthew Lundberg   schedule 17.03.2014n=length(Rank)
к вашему вызовуcurve
. Кажется, это более правильная линия. - person Jota   schedule 17.03.2014xlim = range(Rank)
в командеplot
, а неc(1,80)
- person Matthew Lundberg   schedule 17.03.2014curve
. - person Matthew Lundberg   schedule 17.03.2014xlim = range(Rank)
в командеplot
, но неn=length(Rank)
в командеcurve
, я все равно получаю странное поведение. Разве это не так для вас? - person Jota   schedule 18.03.2014