使用构造函数来固定参数:它是如何工作的?

Using a constructor function to hold parameters fixed: how does it works?

问题

我想了解构造函数如何设法在我们需要时固定参数。

我正在看Peng网上的例子book,我在下面post

在这种情况下,构造函数 make.NegLogLik 用于构建一个函数,nLL 计算负对数似然(在本书后面,nLL 将是优化。)

函数

这是正在运行的构造函数。

构造函数本身:

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

现在让我们用它来创建另一个函数,nLL,它实际计算负对数似然

set.seed(1)
normals <- rnorm(100, 1, 2)

nLL <- make.NegLogLik(normals, c(FALSE, FALSE))

意思是没有固定的参数。如果我现在调用 nLL,它 returns 一个函数:

nLL
#> function(p) {
#>     params[!fixed] <- p
#>     mu <- params[1]
#>     sigma <- params[2]
#>     
#>     ## Calculate the Normal density
#>     a <- -0.5*length(data)*log(2*pi*sigma^2)
#>     b <- -0.5*sum((data-mu)^2) / (sigma^2)
#>     -(a + b)
#>   }

现在我用它:

nLL(c(1,2))
#> [1] 201.7361

不过我也可以用make.NegLogLik来搭建。一个不同的nLL,其中一个参数是固定的:

nLL <- make.NegLogLik(normals, c(FALSE, 2))
nLL(1)
#> [1] 201.7361

问题

实际上 make.NegLogLik 是如何工作的?

先设置fixed = c(FALSE, FALSE)。那么:params <- fixed,也就是说params当然等于c(FALSE, FALSE).

我不明白的是function(p)里面,特别是这一行:

params[!fixed] <- p

我知道!fixed等于c(TRUE, TRUE),但它不会被p覆盖吗?

如果我一步步尝试:

fixed = c(FALSE, 2)
params <- fixed
!fixed
#> [1]  TRUE FALSE
p <- 1
params[!fixed] <- p
params[!fixed]
#> [1] 1
mu <- params[1]
sigma <- params[2]
mu
#> [1] 1
sigma
#> [1] 2

我看到它正在运行,但我还是不明白 params[!fixed] <- p 是如何让它运行的。

欺骗我的是 p 在这种情况下只是一个数字,1,因为我设置了 sigma = 2;但是 p 可能是 c(1,2),并且 params[!fixed] <- p 仍然有效。

reprex package (v0.3.0)

于 2021-03-26 创建

我想我明白了,params[!fixed] <- p 所做的是将 p 的值分配给 params 中对应于 !fixed 等于 TRUE 的任何插槽。

# Example 1, with `fixed = c(FALSE, 2)`
fixed = c(FALSE, 2)
fixed
#> [1] 0 2
params <- fixed
params
#> [1] 0 2
!fixed
#> [1]  TRUE FALSE
p <- 1
params[!fixed] <- p
params[!fixed]
#> [1] 1
params
#> [1] 1 2

# Example 2, with `fixed = c(FALSE, FALSE)`
fixed = c(FALSE, FALSE)
fixed
#> [1] FALSE FALSE
params <- fixed
params
#> [1] FALSE FALSE
!fixed
#> [1] TRUE TRUE
p <- c(1,2)
params[!fixed] <- p
params[!fixed]
#> [1] 1 2
params
#> [1] 1 2

# Example 3, with `fixed = c(1, FALSE)`
fixed = c(1, FALSE)
fixed
#> [1] 1 0
params <- fixed
params
#> [1] 1 0
!fixed
#> [1] FALSE  TRUE
p <- 2
params[!fixed] <- p
params[!fixed]
#> [1] 2
params
#> [1] 1 2

reprex package (v0.3.0)

于 2021-03-26 创建