使用构造函数来固定参数:它是如何工作的?
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 创建
问题
我想了解构造函数如何设法在我们需要时固定参数。
我正在看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 创建