我想知道在数组中给出拟合参数时如何在R中进行最大似然估计。当参数数量很大时需要这样做。所以基本上,为了适应数据x的正态分布,我想做类似下面的事情
LL <- function(param_array) {
R = dnorm(x, param_array[1], param_array[2])
-sum(log(R))
}
mle(LL, start = list(param_array = c(1,1)))
(而不是http://www.r-bloggers.com/fitting-a-model-by-maximum-likelihood/第一部分中的原始代码) 如果我运行上面的代码,我将收到错误
dnorm中的错误(x,param_array [1],param_array [2]):参数 缺少“param_array”,没有默认
有人能告诉我如何以正确的方式实现我想要的目标吗?
答案 0 :(得分:2)
stats4::mle
不是一个长函数,您可以在R控制台中检查它:
> stats4::mle
请注意start
的处理方式:
start <- sapply(start, eval.parent)
nm <- names(start)
案例1
如果你这样做:
LL <- function(mu, sigma) {
R = dnorm(x, mu, sigma)
-sum(log(R))
}
mle(LL, start = list(mu = 1, sigma = 1))
你得到:
nm
#[1] "mu" "sigma"
此外,
formalArgs(LL)
#[1] "mu" "sigma"
案例2
如果你这样做:
LL <- function(param_array) {
R = dnorm(x, param_array[1], param_array[2])
-sum(log(R))
}
mle(LL, start = list(param_array = c(1,1)))
你得到了
nm
#[1] NULL
但
formalArgs(LL)
#[1] param_array
问题
LL
内的stats::mle
函数评估是将nm
与LL
的形式参数进行匹配。在案例1 中,匹配没有困难,但在案例2 中您没有匹配,因此您将无法评估LL
。
那么,如果他们有50个参数,人们会怎么做?他们是手工打字吗?
在仔细思考之后,这不是一个虚假的论点吗?如果你真的有50个参数,使用数组真的可以节省你的工作吗?
首先,在您的函数LL
中,您必须指定param_array[1]
,param_array[2]
,...,param_array[50]
,即您仍然需要手动输入50个参数进入正确的位置。在指定start
时,您仍然需要按元素键入长度为50的向量元素,对吧?与不使用数组而不是列表相比,这不是相同的工作量吗?