scoping rules
关于 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)表示的是单参数取值范围, 这是不同之处.