我想通过直接最小化负对数似然(不使用 glm)来获得拟合到某些比例数据的累积正态曲线的最大似然参数(MLE)。对于引入 optim() 的一些初始值没有问题:
x <- c(-0.250, -0.056, 0.137, 0.331, 0.525, 0.719, 0.912, 1.100, 1.300)
k <- c(0, 0, 5, 11, 12, 12, 12, 12, 12)
n <- c(12, 12, 12, 12, 12, 12, 12, 12, 12)
nll <- function(p) {
phi <- pnorm(x, p[1], p[2])
-sum(k * log(phi) + (n - k) * log(1 - phi))
}
para<- optim(c(0.5, 0.1), nll)$par
xseq <- seq(-.5, 1.5, len = 100)
yseq <- pnorm(xseq, para[1],para[2])
curve <- data.frame(xseq, yseq)
dat <- data.frame(x, k, n)
library(ggplot2)
ggplot(dat,aes(x = x, y = k / n)) +
geom_point()+
geom_line(data = curve, aes(x = xseq, y = yseq))
但是,如果我使用实际上更接近 MLE 参数的初始值
para<- optim(c(0.1, 0.1), nll)$par
我收到以下错误:
Error in optim(c(0.1, 0.1), nll) : function cannot be evaluated at initial parameters
似乎该错误是由负对数似然评估中的一些无穷大引起的。我发现如果我使用log.p
pnorm 选项提高精度,我不会得到错误
nll <- function(p) {
logphi1 <- pnorm(x, p[1], p[2], lower.tail = T, log.p = T)
logphi2 <- pnorm(x, p[1], p[2], lower.tail = F, log.p = T)
-sum(k * logphi1 + (n - k) * logphi2)
}
para<- optim(c(0.1, 0.1), nll)$par
但问题是,除了pnorm
我还想拟合a + b * pnorm
带有a
和b
常量的曲线,在这些情况下我不能用来log.p
提高精度。