我正在尝试在mle2
包中使用命令bbmle
。我正在看Bolker撰写的“使用bbmle
包进行的最大似然估计和分析”的p2。我不知何故无法输入正确的起始值。这是可复制的代码:
l.lik.probit <-function(par, ivs, dv){
Y <- as.matrix(dv)
X <- as.matrix(ivs)
K <-ncol(X)
b <- as.matrix(par[1:K])
phi <- pnorm(X %*% b)
sum(Y * log(phi) + (1 - Y) * log(1 - phi))
}
n=200
set.seed(1000)
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
x4 <- rnorm(n)
latentz<- 1 + 2.0 * x1 + 3.0 * x2 + 5.0 * x3 + 8.0 * x4 + rnorm(n,0,5)
y <- latentz
y[latentz < 1] <- 0
y[latentz >=1] <- 1
x <- cbind(1,x1,x2,x3,x4)
values.start <-c(1,1,1,1,1)
foo2<-mle2(l.lik.probit, start=list(dv=0,ivs=values.start),method="BFGS",optimizer="optim", data=list(Y=y,X=x))
这是我得到的错误:
Error in mle2(l.lik.probit, start = list(Y = 0, X = values.start), method = "BFGS", :
some named arguments in 'start' are not arguments to the specified log-likelihood function
知道为什么吗?谢谢你的帮助!
最佳答案
您已经错过了几件事情,但是最重要的是,默认情况下mle2
接受参数列表。您可以改用参数向量,但是您必须加倍努力。
我已经在一些地方微调了代码。 (我将对数似然函数更改为负对数似然函数,否则将无法使用!)
l.lik.probit <-function(par, ivs, dv){
K <- ncol(ivs)
b <- as.matrix(par[1:K])
phi <- pnorm(ivs %*% b)
-sum(dv * log(phi) + (1 - dv) * log(1 - phi))
}
n <- 200
set.seed(1000)
dat <- data.frame(x1=rnorm(n),
x2=rnorm(n),
x3=rnorm(n),
x4=rnorm(n))
beta <- c(1,2,3,5,8)
mm <- model.matrix(~x1+x2+x3+x4,data=dat)
latentz<- rnorm(n,mean=mm%*%beta,sd=5)
y <- latentz
y[latentz < 1] <- 0
y[latentz >=1] <- 1
x <- mm
values.start <- rep(1,5)
现在,我们进行调整。最主要的是指定
vecpar=TRUE
并使用parnames
让mle2
知道参数向量中元素的名称...library("bbmle")
names(values.start) <- parnames(l.lik.probit) <- paste0("b",0:4)
m1 <- mle2(l.lik.probit, start=values.start,
vecpar=TRUE,
method="BFGS",optimizer="optim",
data=list(dv=y,ivs=x))
如以上针对此特定示例所指出的,您刚刚重新实现了概率回归(尽管我知道您现在想扩展它以允许以某种方式实现异方差...)
dat2 <- data.frame(dat,y)
m2 <- glm(y~x1+x2+x3+x4,family=binomial(link="probit"),
data=dat2)
最后,我想说的是,您应该检查
parameters
参数,该参数允许您为任意一个参数和formula
接口(interface)指定一个亚线性模型:m3 <- mle2(y~dbinom(prob=pnorm(eta),size=1),
parameters=list(eta~x1+x2+x3+x4),
start=list(eta=0),
data=dat2)
PS
confint(foo2)
在此设置下似乎可以正常工作(按要求提供配置文件CI)。ae <- function(x,y) all.equal(unname(coef(x)),unname(coef(y)),tol=5e-5)
ae(m1,m2) && ae(m2,m3)
关于r - R : mle2中的配置文件置信区间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12097584/