【发布时间】:2021-03-26 12:11:12
【问题描述】:
问题
我试图了解构造函数如何在我们需要时设法保持参数固定。
我正在查看彭的在线book 中的示例,我将其发布在下面。
在这种情况下,构造函数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,它会返回一个函数:
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 创建
【问题讨论】:
标签: r optimization subset