【问题标题】:Error with custom density function definition for mle2 formula call用于 mle2 公式调用的自定义密度函数定义错误
【发布时间】:2015-02-07 15:53:41
【问题描述】:

我想定义我自己的密度函数,用于从Rbbmle 包中对mle2 的公式调用。模型的参数是估计的,但我不能在返回的 mle2 对象上应用 residualspredict 之类的函数。

这是我为简单泊松模型定义函数的示例。

library(bbmle)

set.seed(1)
hpoisson <- rpois(1000, 10)

myf <- function(x, lambda, log = FALSE) {
  pmf <- (lambda^x)*exp(-lambda)/factorial(x)
  if (log)
    log(pmf)
  else
    pmf
}

myfit <- mle2(hpoisson ~ myf(lambda), start = list(lambda=9), data=data.frame(hpoisson))
residuals(myfit)

myfit 中,lambda 估计正确,但是当我在myfit 上调用残差时,我收到一条错误消息:

Error in myf(9.77598906811668) : 
  argument "lambda" is missing, with no default

另一方面,如果我简单地使用R 的内置dpois 函数按如下方式拟合模型,则会计算残差:

myfit <- mle2(hpoisson ~ dpois(lambda), start = list(lambda=9), data=data.frame(hpoisson))
    residuals(myfit)

谁能告诉我我在myf的函数定义中做错了什么?

谢谢

【问题讨论】:

    标签: r poisson mle


    【解决方案1】:

    文档中解释的不是很清楚,但是使用自定义密度函数有几个先决条件:

    • 函数的名称必须以d开头,必须有第一个参数x,并且必须有一个命名参数log。 (log 参数必须做一些明智的事情:特别是,mle2 将使用 log=TRUE 调用函数,并且函数最好返回对数似然!)一般来说,虽然这不是必需的,直接计算对数似然,然后在 log=FALSE 时取幂,而不是计算似然度并在 log=TRUE 时记录它(在某些情况下,例如零膨胀模型,这不是'不是真的可行)。例如,将我的 dmyf() 定义与 OP 代码中的 myf() 定义进行比较...
    • 为了使用附加方法,例如predict,您必须定义一个名称以s 开头的附加函数;它返回指定参数的时刻列表、汇总统计信息等 - 请参见下面的示例,该示例复制自 bbmle::spois
    library("bbmle")
    set.seed(1)
    hpoisson <- rpois(1000, 10)
    
    dmyf <- function(x, lambda, log = FALSE) {
        logpmf <- x*log(lambda)-lambda-lfactorial(x)
        if (log) return(logpmf)  else return(exp(logpmf))
    }
    smyf <- function(lambda) {
        list(title = "modified Poisson",
             lambda = lambda, mean = lambda,
             median = qpois(0.5, lambda),
             mode = NA, variance = lambda, sd = sqrt(lambda))
    }
    myfit <- mle2(hpoisson ~ dmyf(lambda),
                  start = list(lambda=9), data=data.frame(hpoisson))
    residuals(myfit)
    

    【讨论】:

    • 亲爱的 Ben,我的目标是定义一个非齐次 Poisson 过程,其中 dmyf 中的 lambda 是协变量的函数。同样,我已经尝试过,并且协变量的系数被正确估计。但是我想知道在这种情况下,我在 smyf 中指定的时刻是否有意义,以及我是否可以正确预测该过程的结果并对其进行一些诊断。你有什么建议我可以在哪里找到更多信息?我已经尝试过 NHPoisson,它产生了很棒的情节,但我不确定我是否可以根据我的需要对其进行调整。所以我想知道这是否可以用 bbmle 完成。
    • 好吧,如果你想计算残差,那么你需要定义一些预测值,这样你就可以比较预测值和观察值...
    • 我尝试使用这些技巧来制作我自己的 dbetabinom,但我遇到了错误。请参阅下面的新“答案”,因为我无法在 cmets 中进行更高级的格式化。帮助我@BenBolker,你是我唯一的希望......
    • @BenBolker 我的自定义函数仍然存在问题。你能在这里看到我的问题:stackoverflow.com/questions/35443537/… 吗?
    【解决方案2】:

    不是真正的答案,但需要更多帮助:

    我用它来尝试制作一个“自定义”beta-binomial 函数来模仿 bbmle 小插图的第一位中的那个。

    set.seed(1001)
    x1 <- rbetabinom(n=1000, prob=0.1, size=50, theta=10)
    dmybetabinom <- function(x, N, theta, p, log=FALSE) {
        (choose(N,x)*beta(N-x+theta*(1-p),x+theta*p))/beta(theta*(1-p),theta*p)
    }
    

    该函数的工作原理类似于 dbetabinom:

    dbetabinom(0:9,size=9,theta=4, prob=0.5) [1] 0.04545455 0.08181818 0.10909091 0.12727273 0.13636364 0.13636364 0.12727273 0.10909091 [9] 0.08181818 0.04545455 dmybetabinom(0:9,N=9,theta=4, p=0.5) [1] 0.04545455 0.08181818 0.10909091 0.12727273 0.13636364 0.13636364 0.12727273 0.10909091 [9] 0.08181818 0.04545455

    但是当我尝试对其使用 mle2 功能时,我遇到了这个错误:

    m0fa <- mle2(x1~dmybetabinom( N=50, theta, p), start=list(p=0.2, theta=9), data=data.frame(x1) )`
    
    Error in optim(par = c(0.2, 9), fn = function (p)  :   non-finite finite-difference value [1] `
    

    【讨论】:

    • 您可以提出一个新问题...我相信您的问题是您必须提供log=TRUE 选项,因为这就是mle2 要问的为了。我会在我的回答中放大这一点。
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    相关资源
    最近更新 更多