2015-02-22 2 views
1

Я хочу запрограммировать максимальную вероятность гамма-распределения в R; до сих пор я сделал следующее:Передача списка функции в R для использования в оптимизации

library(stats4) 
x<-scan("http://www.cmc.edu/pages/faculty/MONeill/Math152/Handouts/gamma-arrivals.txt") 
loglike2<-function(LL){ 
alpha<-LL$a 
beta<-LL$b 
(alpha-1)*sum(log(x))-n*alpha*log(beta)-n*lgamma(alpha)} 

mle(loglike2,start=list(a=0.5,b=0.5)) 

, но когда я хочу, чтобы запустить его, появится следующее сообщение:

Error in mle(loglike2, start = list(a = 0.5, b = 0.5)) : 
    some named arguments in 'start' are not arguments to the supplied log-likelihood 

что я делаю не так? Спасибо

ответ

0

Из сообщения об ошибке, похоже, mle должен иметь возможность видеть имена переменных, перечисленные в start=, в самом вызове функции.

loglike2<-function(a, b){ 
    alpha<-a 
    beta<-b 
    (alpha-1)*sum(log(x))-n*alpha*log(beta)-n*lgamma(alpha) 
} 

mle(loglike2,start=list(a=0.5,b=0.5)) 

Если это не работает, вы должны размещать reproducible example со всеми переменными, определенными, а также явно указывать, какой пакет функция mle откуда.

+0

спасибо @MrFlick, я обновил вопрос с данными для работы на – Little

+0

. Вы все еще не указали, с какого пакета вы получаете функцию 'mle'. Плюс переменная 'n' все еще не определена. – MrFlick

+0

извините, мой плохой, теперь он включен – Little

0

Сообщение об ошибке, к сожалению, является криминальным, поскольку оно указывает на значения mes из-за того, что альфа и гамма должны быть положительными и mle оптимизируется по действительным числам. Следовательно, вам нужно transfomt вектор, по которому функция оптимизируется, например, так:

library(stats4) 
x<-scan("http://www.cmc.edu/pages/faculty/MONeill/Math152/Handouts/gamma-arrivals.txt") 

loglike<-function(alpha,beta){ 
    (alpha-1)*sum(log(x))-n*alpha*log(beta)-n*lgamma(alpha) 
} 

fit <- mle(function(alpha,beta) 
       # transfrom the parameters so they are positive 
       loglike(exp(alpha),exp(beta)), 
      start=list(alpha=log(.5),beta=log(.5))) 

# of course you would have to exponentiate the estimates too. 
exp(coef(fit1)) 

отмечают, что ошибка в настоящее время является то, что вы используете n в loglike() , которые вы не определены. Если вы определите n, вы получите сообщение об ошибке Lapack routine dgesv: system is exactly singular: U[1,1] = 0. который составляет , вызванный не очень хорошим догадком для стартового значения альфа и бета или (более вероятно), что loglike() не имеет минимумов (я думаю, что ваш удаленный пост с прошлой ночи имел несколько другую формулу, в состоянии получить работу, но не в состоянии реагировать на б/с постом был удален ...)

FYI, если вы хотите, чтобы проверить параметры альфа и бета, которые вызывают ошибки, вы можете использовать обзорное назначение для публикации последних названных параметров в среде, в которой loglike() определяется как:

loglike<-function(alpha,beta){ 
    g <<- c(alpha,beta) 
    (alpha-1)*sum(log(x))-n*alpha*log(beta)-n*lgamma(alpha) 
} 
Смежные вопросы