关于 R 中 scoping rules 的一些笔记与理解.

在一个Function中,对一个变量的lexical scoping rule的检索次序是,先检查本Function中的environment,如果能找到该变量,则返回该变量,如果不能,则检索这个Function被创建(不是被调用)的Environment,以此类推,一直到检索Global Environment。

对于一个优化问题, 我们的目标函数可以封装为一个函数, 但是函数的接口处需要接受我们非需要优化的参数的其他东西, 比如data, 那么这里就需要把这些非相关的数据进行固定(fixed);

现在考虑一个normal likelihood的优化问题, 我们写出如下的构造函数

make.NegLogLik <- function(data, fixed=c(FALSE,FALSE)){
  params <- fixed
  function(p){
    params[!fixed] <- p
    mu <- params[1]
    sigma <- params[2]
    a <- -0.5*length(data)*log(2*pi*sigma^2)
    b <- -0.5*sum((data-mu)^2) / (sigma^2)
    -(a+b)
  }
}

然后将外部数据输入函数进行目标函数构造

set.seed(10)
normals <- rnorm(100,1,2)
nLL <- make.NegLogLik(normals)
optim(c(mu = 0, sigma = 1), nLL)

得到的结果如下

mu sigma
0.727088 1.873201

这里需要注意的是optim是相当于R上广义优化函数, 可以作为多参数的优化, 这里的参数相当于我们建模里面的决策变量, 作为参数函数映射到最小的一个值.

对于单参问题, 可以直接用R的optimize函数, 不同的是其第一个参数是函数, 第二个参数如c(0,1)表示的是单参数取值范围, 这是不同之处.