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