Почему «кривая» так отличается от «линий» и «точек» в R?

Я хотел бы сопоставить частотные данные с дискретным обобщенным бета-распределением (ДГБД).

Данные выглядят так:

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.

введите здесь описание изображения

Рисунок 2. Правильный способ использования кривой: укажите «n»


person Frank Wang    schedule 17.03.2014    source источник
comment
выглядит так же для меня только нетрансформированный. два других соответствуют данным   -  person rawr    schedule 17.03.2014
comment
Не могли бы вы уточнить? В чем разница?   -  person Frank Wang    schedule 17.03.2014
comment
хорошо, zmf — это просто общая функция, такая как формула для линии y = mx + b или y = x**2. У них есть общие формы, которые мы можем построить, но если вы подгоните их под данные или установите некоторые параметры (пересечение по оси y, наклон и т. д.), это будет изменить форму и расположение кривой   -  person rawr    schedule 17.03.2014
comment
@rawr Но эта же функция используется в lines и points.   -  person Matthew Lundberg    schedule 17.03.2014
comment
@FrankWANG Обратите внимание, что аргумент log = "xy" для curve игнорируется, поскольку add = TRUE. Логарифмы применяются без аргумента в результате предыдущей команды plot. Это не объясняет разницу. Похоже, что ответ на вопрос, выделенный жирным шрифтом, заключается в том, что lines и points верны, но что-то не так с curve. Более интересный вопрос, что не так?   -  person Matthew Lundberg    schedule 17.03.2014
comment
Точно. Я также нахожу это. Я согласен с вашей точкой зрения: мы чего-то не знаем о кривой.   -  person Frank Wang    schedule 17.03.2014
comment
Мне нечего добавить в качестве объяснения, но посмотрите, что происходит, когда вы добавляете n=length(Rank) к вашему вызову curve. Кажется, это более правильная линия.   -  person Jota    schedule 17.03.2014
comment
@Frank То же самое, если вы укажете xlim = range(Rank) в команде plot, а не c(1,80)   -  person Matthew Lundberg    schedule 17.03.2014
comment
@Frank, это решает проблему. Большое спасибо.   -  person Frank Wang    schedule 17.03.2014
comment
Все еще похоже, что это может быть ошибка в curve.   -  person Matthew Lundberg    schedule 17.03.2014
comment
@MatthewLundberg Когда я указываю xlim = range(Rank) в команде plot, но не n=length(Rank) в команде curve, я все равно получаю странное поведение. Разве это не так для вас?   -  person Jota    schedule 18.03.2014
comment
@Фрэнк Это не так. Я получаю правильный график. Я использую 3.0.2 в Linux.   -  person Matthew Lundberg    schedule 18.03.2014
comment
@MatthewLundberg Я получаю странный график, используя 3.0.1 и 3.0.3 в Windows.   -  person Jota    schedule 18.03.2014
comment
@MatthewLundberg Нет, это не ошибка, а сложное определение функции :) См. ответ ниже.   -  person plannapus    schedule 28.03.2014


Ответы (1)


Причина, по которой вам нужно указать здесь n, заключается в том, что ваша функция зависит от length(x)!

zmf = function(x) exp(co[[1]]+ co[[2]]*log(length(x)+1-x) + co[[3]]*log(x))
                                           ^^^^^^^^^

Здесь длина x, предоставленных вашей функции curve, равна n!

Вот ваш график, если вы придерживаетесь n=101 по умолчанию, но кормите свои line и points вектором xx длины 101:

plot(p~Rank, xlim = c(1,80), log = "xy",xlab = "Rank (log)", ylab = "Probability (log)")
curve(zmf, col="blue", add = T)
xx=seq(1,length(Rank),length.out=101)
lines(zmf(xx)~xx, col = "red")
points(zmf(xx)~xx, col = "purple")

введите здесь описание изображения

Ни вуду, ни жука! :)

person plannapus    schedule 28.03.2014