Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R mle2公式调用的自定义密度函数定义出错_R_Poisson_Mle - Fatal编程技术网

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

R mle2公式调用的自定义密度函数定义出错,r,poisson,mle,R,Poisson,Mle,我想定义我自己的密度函数,用于从R的bbmle包调用mle2的公式。模型的参数是估计的,但我不能对返回的mle2对象应用残差或预测之类的函数 这是一个例子,我为一个简单的泊松模型定义了一个函数 library(bbmle) set.seed(1) hpoisson <- rpois(1000, 10) myf <- function(x, lambda, log = FALSE) { pmf <- (lambda^x)*exp(-lambda)/factorial(x)

我想定义我自己的密度函数,用于从
R
bbmle
包调用
mle2
的公式。模型的参数是估计的,但我不能对返回的
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)
另一方面,如果我只是使用
R
的内置
dpois
函数按如下方式拟合模型,则会计算残差:

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

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

  • 函数名必须以
    d
    开头,必须有第一个参数
    x
    ,并且必须有一个命名参数
    log
    。(通常,
    log
    参数必须做一些合理的事情:特别是,
    mle2
    将使用
    log=TRUE
    调用函数,函数最好返回日志可能性!),尽管这不是必需的,直接计算对数似然度,然后在
    log=FALSE
    时求指数,而不是在
    log=TRUE
    时计算似然度并将其记录下来,这在数值上更为合理(有些情况下,例如零膨胀模型,这实际上是不可行的)。例如,将我的
    dmyf()
    定义与OP代码中的
    myf()
    定义进行比较
  • 为了使用诸如
    predict
    之类的附加方法,您必须定义一个名称以
    s
    开头的附加函数;它返回指定参数的时刻列表、摘要统计信息等——请参见下面的示例,该示例从
    bbmle::spois
    复制而来
库(“bbmle”)
种子(1)

hpoisson不是一个真正的答案,但在这方面需要更多的帮助:

我用它来尝试制作一个“定制”的贝塔二项式函数,以模仿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)
}

亲爱的Ben,我的目标是定义一个非齐次泊松过程,其中dmyf中的lambda是协变量的函数。再次,我尝试了这一点,并且正确估计了协变量的系数。但我想知道在这种情况下,我在smyf中指定的时刻是否有意义,以及我是否能够正确预测过程的结果并对其进行诊断。你有什么建议我可以在哪里找到更多的信息?我已经试过NHPoisson,它能产生很好的情节,但我不确定我能不能根据自己的需要来调整它。所以我想知道bbmle是否可以做到这一点。好吧,如果你想计算残差,那么你需要定义一些预测值,这样你就可以比较预测值和观察值……我试着用这些技巧来制作我自己的dbetabinom,但我得到了一个错误。请参阅下面的新“答案”,因为我无法在注释中使用更高级的格式。帮帮我@BenBolker,你是我唯一的希望…@BenBolker我的自定义函数仍然有问题。你能看到我的问题吗:?你可以把这变成一个新问题。。。我认为您的问题在于必须提供一个
log=TRUE
选项,因为这正是
mle2
需要的。我将在我的回答中对此加以详述。
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)
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)
}
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] `