我正在尝试估算Burr分布的参数。这个程序应该很简单。我导出并编码了对数似然函数,我使用“maxLik”函数进行估计。
从错误消息我明白log(n)
可能获得char或NaN值,这就是为什么返回错误,但它并没有真正帮助。我多次检查代码。它应该工作。如果我改变loglik函数(比如,我使用带有一个参数的Laplace分布中的loglik),那么代码就可以了。所以,我认为我定义loglik函数的方式有问题。
以下是我正在使用的代码:
y = c(rep(Mean.Income,Number))
N=length(y)
logLik = function(m,n,k)
{
ll = N*(log(m)+log(n)+log(k)) - (k+1)*sum(log(1+m*y^n)) + (n-1)*sum(y)
return (ll)
}
estimate = maxLik(logLik,start=c(0.1, 0.1, 0.1), print.level=2, method="NR", grad=NULL, hess=NULL)
y - 收入数据。它包括收入和获得这种收入的家庭数量。这可能是大数字的问题吗?我有大约3000个观察值,收入变化5,000-400,000,发生次数(数量变量)从4到8530不等。
此外,我觉得此部分log(1+m*y^n)
可能存在问题,因为y
是向量而m, n
是数字。
当我自己检查功能时,它可以工作。例如:
> logLik(1,5,0.1)
[1] 2560797466
我将非常感谢任何关于我做错事的提示。
答案 0 :(得分:1)
这样的函数不会为您估计的每个值传递函数参数,而是传递一个包含所有值的向量,您必须选择所需的元素。如果您将命名向量作为起始值传递,则可以更轻松地跟踪估算值。例如
y <- c(rep(rpois(20,500),sample(2:7, 20, replace=T)))
N <- length(y)
logLik = function(x) {
m <- x["m"]; n <- x["n"]; k <- x["k"]
ll = N*(log(m)+log(n)+log(k)) - (k+1)*sum(log(1+m*y^n)) + (n-1)*sum(y)
return (ll)
}
library(maxLik)
estimate = maxLik(logLik,start=c(m=0.1, n=0.1, k=0.1), print.level=2,
method="NR", grad=NULL, hess=NULL)
这至少可以解决您遇到的错误。这是因为参数n
和k
从未设置且缺失