mle2公式调用的自定义密度函数定义出错

时间:2015-02-07 15:53:42

标签: r poisson mle

我想定义自己的密度函数,以便在mle2的{​​{1}}包中对R的公式调用中使用。估计模型的参数但我不能在返回的bbmle对象上应用residualspredict等函数。

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

mle2

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) 中,正确估计了lambda,但是当我在myfit上调用残差时,我收到错误消息:

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) 的功能定义中我做错了什么吗?

由于

2 个答案:

答案 0 :(得分:3)

在文档中没有非常清楚地解释,但使用自定义密度函数有一些先决条件:

  • 函数的名称必须以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)

答案 1 :(得分:0)

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

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

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] `

该功能的作用类似于dbetabinom:

no

但是当我尝试在其上使用mle2函数时,我遇到了这个错误:

12345670000115 
14245670000116 
58492010000118