【问题标题】:Error in log(n) : non-numeric argument to mathematical functionlog(n) 中的错误:数学函数的非数字参数
【发布时间】:2014-06-29 18:54:59
【问题描述】:

我正在尝试估计 Burr 分布的参数。这个过程应该很简单。我导出并编码了一个对数似然函数,并使用“maxLik”函数进行估计。

从错误消息中,我了解到log(n) 可能会获取 char 或 NaN 值,这就是返回错误的原因,但这并没有真正帮助。我检查了几次代码。它应该工作。如果我更改 loglik 函数(例如,我正在使用带有一个参数的拉普拉斯分布的 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

我将非常感谢任何关于我做错了什么的提示。

【问题讨论】:

    标签: r distribution


    【解决方案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)
    

    这至少可以解决您遇到的错误。这是因为参数nk 从未设置过并且丢失了

    【讨论】:

    • 我明白你的意思。是的,你是对的,这已经解决了问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2023-03-16
    相关资源
    最近更新 更多