具有参数数组的MLE函数

时间:2016-07-20 08:00:53

标签: r

我想知道在数组中给出拟合参数时如何在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”,没有默认

有人能告诉我如何以正确的方式实现我想要的目标吗?

1 个答案:

答案 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函数评估是将nmLL的形式参数进行匹配。在案例1 中,匹配没有困难,但在案例2 中您没有匹配,因此您将无法评估LL

  

那么,如果他们有50个参数,人们会怎么做?他们是手工打字吗?

在仔细思考之后,这不是一个虚假的论点吗?如果你真的有50个参数,使用数组真的可以节省你的工作吗?

首先,在您的函数LL中,您必须指定param_array[1]param_array[2],...,param_array[50],即您仍然需要手动输入50个参数进入正确的位置。在指定start时,您仍然需要按元素键入长度为50的向量元素,对吧?与不使用数组而不是列表相比,这不是相同的工作量吗?