我想定义自己的密度函数,以便在mle2
的{{1}}包中对R
的公式调用中使用。估计模型的参数但我不能在返回的bbmle
对象上应用residuals
或predict
等函数。
这是我为简单泊松模型定义函数的示例。
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)
的功能定义中我做错了什么吗?
由于
答案 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