fnSubset.RdCombine variable parameters with with fixed parameters and pass to
fnFull. Useful for optimizing over a subset of parameters
without writing a separate function. Values are combined by name if
available. Otherwise, xFull is constructed by position (the
default).
fnSubset(x, fnFull, xFixed, xFull=c(x, xFixed), ...)This function first confirms that
length(x) + length(xFixed) == length(xFull).
Next,
If xFull has names, match at least xFixed by
name.
Else xFull = c(x, xFixes), the default.
Finally, call fnFull(xFull, ...).
value returned by fnFull
##
## Example with 'optim'
##
fn <- function(x) (x[2]-2*x[1])^2
# note: true minimum is 0 on line 2*x[1] == x[2]
fullEst <- optim(par=c(1,1), method="BFGS", fn=fn)
fullEst$par
#> [1] 0.6 1.2
# par = c(0.6, 1.2) at minimum (not convex)
# Fix the last component to 4
est4 <- optim(par=1, fn=fnSubset, method="BFGS", fnFull=fn, xFixed=4)
est4$par
#> [1] 2
# now there is a unique minimun x[1] = 2
# Fix the first component
fnSubset(x=1, fnFull=fn, xFixed=c(a=4), xFull=c(a=1, b=2))
#> b
#> 49
# After substitution: xFull = c(a=4, b=1),
# so fn = (1 - 2*4)^2 = (-7)^2 = 49
est4. <- optim(par=1, fn=fnSubset, method="BFGS",
fnFull=fn, xFixed=c(a=4),
xFull=c(a=1, b=2))
est4.$par
#> [1] 8
# At optimum: xFull=c(a=4, b=8),
# so fn = (8 - 2*4)^2 = 0
##
## Example with 'maxLik'
##
fn2max <- function(x) -(x[2]-2*x[1])^2
# -> need to have a maximum
max4 <- maxLik(fnSubset, start=1, fnFull=fn2max, xFixed=4)
summary(max4)
#> --------------------------------------------
#> Maximum Likelihood estimation
#> Newton-Raphson maximisation, 2 iterations
#> Return code 1: gradient close to zero (gradtol)
#> Log-Likelihood: -4.173074e-28
#> 1 free parameters
#> Estimates:
#> Estimate Std. error t value Pr(> t)
#> [1,] 2.0000 0.3536 5.657 1.54e-08 ***
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> --------------------------------------------
# Similar result using fixed parameters in maxNR, called by maxLik
max4. <- maxLik(fn2max, start=c(1, 4), fixed=2)
summary(max4.)
#> --------------------------------------------
#> Maximum Likelihood estimation
#> Newton-Raphson maximisation, 2 iterations
#> Return code 1: gradient close to zero (gradtol)
#> Log-Likelihood: -4.173074e-28
#> 1 free parameters
#> Estimates:
#> Estimate Std. error t value Pr(> t)
#> [1,] 2.0000 0.3536 5.657 1.54e-08 ***
#> [2,] 4.0000 0.0000 NA NA
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> --------------------------------------------