【问题标题】:profile confidence intervals in R: mle2R中的配置文件置信区间:mle2
【发布时间】:2012-05-15 12:46:51
【问题描述】:

我正在尝试在包bbmle 中使用命令mle2。我正在查看 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

知道为什么吗?感谢您的帮助!

【问题讨论】:

  • values.start 未指定。你必须定义它。 foo2&lt;&lt;-也有错别字。
  • 感谢您的快速回答!我进行了这些更改(我的起始值为 values.start
  • 您是否正在实施probit regression
  • 我正在做一个异方差概率,公式几乎相同,所以我在这里复制简单概率,这给了我完全相同的问题,起始值似乎被错误指定......但是为什么?
  • l.lik.probit 的公式很奇怪,因为它将 externalxy 分配给它的 arguments XY。此外,对mle2 的调用以两种相互冲突的方式使用了命名参数“X”和“Y”两次。因此,我怀疑您可能正在阅读由一连串错误导致的错误消息,它可能无法反映所有问题。也许您应该先尝试mle2 手册页上的示例,然后逐步修改它们以适应您的情况。

标签: r confidence-interval


【解决方案1】:

你错过了一些东西,但最重要的是默认情况下mle2 采用list 参数;你可以让它接受一个参数vector,但是你必须更加努力。

我在一些地方稍微调整了代码。 (我将对数似然函数更改为负对数似然函数,没有它永远不会工作!)

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并使用parnamesmle2知道参数向量中元素的名称...

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 接口:

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)

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 2012-03-07
    • 2018-01-16
    • 2018-12-30
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多