2013-06-23 2 views
4

Есть ли функция, которая может использоваться для распределения частот в R? Я знаю fitdistr, но, насколько я могу судить, он работает только для векторов данных (случайных выборок). Кроме того, я знаю, что преобразование между двумя форматами тривиально, но частоты настолько велики, что память вызывает беспокойство.Как установить частотные распределения в R?

Например, fitdistr могут быть использована следующим образом:

x<-rpois(100, lambda=10) 
fitdistr(x,"poisson") 

Есть ли функция, которая будет делать ту же установку на столе частоты? Что-то в строках:

freqt <- as.data.frame(table(x)) 
fitfreqtable(freqt$x, weights=freqt$Freq, "poisson") 

Спасибо!

+2

Можете ли вы привести пример ваших не-векторных данных, имеющих эти проблемы? – gung

+0

@gung, спасибо за быстрый ответ. Вы правы, вопрос связан только с R, поэтому я извиняюсь за публикацию вне темы. Я помечаю это как рекомендуется. –

+0

Без проблем, @FlorinCoras. Пока что, не возражаете ли вы редактировать свой Q, чтобы привести пример? Когда вы доберетесь до SO, люди захотят узнать. – gung

ответ

3

Нет встроенной функции, которую я знаю для установки распределения на частотную таблицу. Заметим, что теоретически непрерывное распределение неуместно для таблицы, поскольку данные дискретны. Конечно, для достаточно больших N и достаточно тонкой сетки это можно игнорировать.

Вы можете создать свою собственную модель облегающие функцию с помощью optim или любой другой оптимизатора, если вы знаете, что плотность вас интересует. Я сделал это here для гамма-распределения (который был плохой предположение для этого конкретного набора данных , но неважно, что).

Код воспроизводится ниже.

negll <- function(par, x, y) 
{ 
    shape <- par[1] 
    rate <- par[2] 
    mu <- dgamma(x, shape, rate) * sum(y) 
    -2 * sum(dpois(y, mu, log=TRUE)) 
} 


optim(c(1, 1), negll, x=seq_along(g$count), y=g$count, method="L-BFGS-B", lower=c(.001, .001)) 
$par 
[1] 0.73034879 0.00698288 

$value 
[1] 62983.18 

$counts 
function gradient 
     32  32 

$convergence 
[1] 0 

$message 
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH" 
+0

спасибо за ваш ответ.Я надеялся избежать создания собственных функций подгонки модели, но, как вы уже упоминаете, кажется, что процедура подгонки кривой не работает так же, как 'fitdistr'. –

0

Для установки распределения Пуассона вам нужно только среднее значение вашего образца. Тогда среднее равно лямбда, что является единственным параметром распределения Пуассона. Пример:

set.seed(1111) 
sample<-rpois(n=10000,l=10) 
mean(sample) 
[1] 10.0191 

, который почти равен значению лямбда, установленному для создания образца (l = 10). Небольшое различие (0,0191) обусловлено случайностью генератора случайных величин распределения Пуассона. По мере увеличения n разница будет уменьшаться. В качестве альтернативы, вы можете поместить распределение с помощью метода оптимизации:

library(fitdistrplus) 
fitdist(sample,"pois") 
set.seed(1111) 

Fitting of the distribution ' pois ' by maximum likelihood 
Parameters: 
     estimate Std. Error 
lambda 10.0191 0.03165296 

но это лишь пустая трата времени. Для получения теоретической информации об установочных частотных данных вы можете увидеть мой ответ here.