r - R中的nlminb有什么问题吗?
问题描述
我正在尝试使用 nlminb 作为统计问题的一部分来解决 R 中的最小化问题。但是,将 nlminb 提供的解决方案与我试图最小化的函数图进行比较时出现了问题。这是目标函数的 R 代码
library(cubature)
Objective_Function <- function(p0){
F2 <- function(x){
u.s2 <- x[1]
u.c0 <- x[2]
u.k0 <- x[3]
s2 <- u.s2^(-1) - 1
c0 <- u.c0^(-1) - 1
k0 <- u.k0/p0
L <- 1/2 * c0 * s2 - 1/c0 * log(1 - k0 * p0)
A <- 1 - pnorm(L, mean = 1, sd = 1)
A <- A * dgamma(k0, shape = 1, rate = 1)
A <- A * dgamma(c0, shape = 1, rate = 1)
A <- A * dgamma(s2, shape = 1, rate = 1)
A * u.s2^(-2) * u.c0^(-2) * 1/p0
}
Pr <- cubature::adaptIntegrate(f = F2,
lowerLimit = rep(0, 3),
upperLimit = rep(1, 3))$integral
A <- 30 * Pr * (p0 - 0.1)
B <- 30 * Pr * (1 - Pr) * (p0 - 0.1)^2
0.4 * B + (1 - 0.4) * (-A)
}
遵循 R 命令
curve(Objective_Function, 0.1, 4)
一个人观察到一个接近 2 的临界点。但是,当一个人执行
nlminb(start = runif(1, min = 0.1, max = 4),
objective = Objective_Function,
lower = 0.1, upper = 4)$par
函数的最小值发生在点 0.6755844。
我想知道你能否告诉我我的错误在哪里,拜托。是否有任何可靠的 R 命令来解决优化问题?
如果这是一个非常基本的问题,我很抱歉。
感谢您的帮助。
解决方案
问题不nlminb()
在于您没有在curve()
. 您可以使用以下代码获得正确的数字,从中您可以看到nlminb()
确实找到了最小值:
min_par <- nlminb(start = runif(1, min = 0.1, max = 4),
objective = Objective_Function,
lower = 0.1, upper = 4)$par
vec_Objective_Function <- function (x) sapply(x, Objective_Function)
curve(vec_Objective_Function, 0.1, 4)
abline(v = min_par, lty = 2, col = 2)
此外,对于单变量优化,您还可以使用 function optimize()
,即
optimize(Objective_Function, c(0.1, 4))
推荐阅读
- c# - Xamarin.Forms 流向中的外壳问题
- swift - 开发基于屏幕大小的 SwiftUI 算法
- sql - Where 子句语句中的动态 LIKE
- c++ - “没有这样的文件或目录”C++ 标头问题
- python - 你可以在 Rstudio 的 python 块中运行 R 命令(使用网状)吗?
- javascript - 如何在对象数组中找到最长的名称,然后在 javascript 中将整个对象返回到控制台?
- docker - OCI 镜像清单和 Docker V2.2 镜像清单的区别
- python - 是否有 Python 函数可以知道字符串是否包含特定值?文件大约有 400k 行
- python - 将数据框粘贴到单独的 excel 文件中,将所有现有数据保存在 python 中
- c# - 为什么 Visual Studio 将新创建的数组键入为 Nullable?