我是R和统计学的新人。我正在玩最大似然估计,我得到一些不正确的结果。我想用简单的线性函数建模x:
x<-apply(matrix(seq(1,10,1), nrow=1), 1, function(x) 10*x+runif(10,-3,3))
LL<-function(a,b){
R=apply(x,1,function(y) a*y+b)
-sum(log(R))
}
mle(LL, start=list(a=10, b=0))
我得到以下结果:
Coefficients:
a b
43571.957 1338.345
而不是~10,b~0。
我根据Spacedman的建议修改了代码:
set.seed(99)
x<-apply(matrix(seq(1,10,1), nrow=1), 1, function(x) 10*x+runif(10,-3,3))
LL<-function(a,b){
R = x[,1] - a*(1:10) + b
-sum(R^2)
}
library(stats4)
mle(LL, start=list(a=11, b=0.3))
Error in solve.default(oout$hessian) :
Lapack routine dgesv: system is exactly singular: U[1,1] = 0
我不知道如何摆脱这个错误。更改视图并再次生成x值无济于事。
答案 0 :(得分:6)
这里有几点需要注意。为了澄清我们首先将错误项的分布从统一分布runif(x, -3, 3)
更改为std。正态分布:rnorm(x)
。我们现在可以轻松地模拟您的数据,然后通过以下方式设置(减去)对数似然和最大化(minizime):
a <- 10
b <- 0
set.seed(99)
x <- apply(matrix(seq(1, 10, 1), nrow=1), 1, function(x) b + a * x + rnorm(10))
minuslogL <- function(a, b) -sum(dnorm(x[, 1] - (b + a * 1:10), log = TRUE))
library(stats4)
mle(minuslogL, start = list(a = 11, b = 0.3))
Call:
mle(minuslogl = minuslogL, start = list(a = 11, b = 0.3))
Coefficients:
a b
9.8732793 0.5922192
请注意,这很有效,因为可能性很平滑且mle()
使用&#34; BFGS&#34;用于优化,例如。准牛顿,梯度法。让我们尝试相同的统一错误:
set.seed(99)
x <- apply(matrix(seq(1, 10, 1), nrow=1), 1, function(x) b + a * x + runif(10, -3, 3))
minuslogL2 <- function(a,b) -sum(dunif(x[, 1] -(a * 1:10 + b), -3, 3, log = TRUE))
mle(minuslogL2, start = list(a = 11, b = 0.3))
Error in optim(start, f, method = method, hessian = TRUE, ...) :
initial value in 'vmmin' is not finite
这失败了!为什么?由于均匀误差会限制参数空间,因此您无法获得平滑的可能性。如果你移动参数a,b太远离真值,你会得到Inf。如果你移动得足够近,你将获得相同的可能性(例如,许多可能的最小值):
> minuslogL2(11, 0.3)
[1] Inf
> minuslogL2(10, 0)
[1] 17.91759
> minuslogL2(10.02, 0.06)
[1] 17.91759
最大化此可能性与找到集合{a,b}: -logL(a, b) == -logL(10, 0)
相比,可以通过普通搜索算法找到它。