使用 optimize() 找到一个百分位数,给定一个特定的值
Using optimize() to find a percentile, given a certain value
我有一个工作项目分配给了我,但我完全搞不懂。背景:
目前我们有一个脚本可以告诉公司将工资差距提高到某个百分位数需要花费多少。这称为 pcost(p),您在其中输入一个介于 0 和 1 之间的数字,然后返回一个预算值(以千为单位),例如(编造的数字):
> x = pcost(.2)
print(x)
1 451.002
在这种情况下,如果我们将最低工资提高到第 20 个百分位数,那么公司将花费大约 45 万美元。
我的任务是创建一些相反的东西,这样我们就可以输入公司必须花费的所需预算,输出将是我们可以将最低工资提高到的百分位数。我被告知应该通过对以下函数使用优化器来完成此操作:
pobj = function(p, budget){
return((budget - pcost(p)^2))
}
在我们插入预算的地方,优化器会找到 p 的值。
我使用优化包创建了以下命令,我的想法是在下面的示例中 .2(或接近它)将是结果
xmin = optimize(pobj, interval = c(0,1), budget = 451.002, tol = .00001)
但是,我总是得到以下错误:
Error in optimize(pobj, interval = c(0, 1), budget = 500, tol = 1e-05) :
invalid function value in 'optimize'
我已经阅读了帮助文件,在此处以及其他站点进行了搜索,但似乎无法清楚地解释导致此错误的原因。显然我做错了什么,但我一般没有太多使用优化器或非线性回归的经验,所以我自己解决问题非常困难。
任何指导或专业知识将不胜感激。
编辑:根据 PeterK 的要求,pobj 在 0 和 1 处的结果
> pobj(0, 455.002)
[1] 207026.8
> pobj(.2, 455.002)
[1] 0
> pobj(1, 455.002)
[1] 18171830
编辑 2:正如@AkselA 评论的那样,在将 pobj 更改为以下内容后,我也尝试了 运行 它:
pobj = function(p, budget){
(budget - pcost(p))^2
}
仍然产生以下错误:
> xmin <- optimize(pobj, c(0, 1), tol=0.01, budget=450)
Error in optimize(pobj, c(0, 1), tol = 0.01, budget = 450) :
invalid function value in 'optimize'
编辑 3:根据@AkselA,顺序图 pobj。尽管在索引 0-10 之间确实出现了轻微下降,但我检查了确切的数字,并且输出确实在每个百分位数都增加了。
最终编辑:虽然 none 的答案直接解决了我的问题,但 AkselA 提供了最佳方向。 运行优化器的问题不在优化器本身,而是pcost(p)。通过显着减少此函数中的代码,优化器能够正常工作并解决问题。感谢您的帮助!
你是不是放错了括号?您的 pobj()
没有最低要求。
假设一个简单的 pcost()
:
pcost <- function(x) exp(x*2)*100 - 90
pobj <- function(p, budget){
(budget - pcost(p))^2
}
xmin <- optimize(pobj, c(0, 1), tol=0.01, budget=450)
xmin
# $minimum
# [1] 0.8443315
#
# $objective
# [1] 1.498106
我有一个工作项目分配给了我,但我完全搞不懂。背景:
目前我们有一个脚本可以告诉公司将工资差距提高到某个百分位数需要花费多少。这称为 pcost(p),您在其中输入一个介于 0 和 1 之间的数字,然后返回一个预算值(以千为单位),例如(编造的数字):
> x = pcost(.2)
print(x) 1 451.002
在这种情况下,如果我们将最低工资提高到第 20 个百分位数,那么公司将花费大约 45 万美元。
我的任务是创建一些相反的东西,这样我们就可以输入公司必须花费的所需预算,输出将是我们可以将最低工资提高到的百分位数。我被告知应该通过对以下函数使用优化器来完成此操作:
pobj = function(p, budget){
return((budget - pcost(p)^2))
}
在我们插入预算的地方,优化器会找到 p 的值。
我使用优化包创建了以下命令,我的想法是在下面的示例中 .2(或接近它)将是结果
xmin = optimize(pobj, interval = c(0,1), budget = 451.002, tol = .00001)
但是,我总是得到以下错误:
Error in optimize(pobj, interval = c(0, 1), budget = 500, tol = 1e-05) :
invalid function value in 'optimize'
我已经阅读了帮助文件,在此处以及其他站点进行了搜索,但似乎无法清楚地解释导致此错误的原因。显然我做错了什么,但我一般没有太多使用优化器或非线性回归的经验,所以我自己解决问题非常困难。
任何指导或专业知识将不胜感激。
编辑:根据 PeterK 的要求,pobj 在 0 和 1 处的结果
> pobj(0, 455.002)
[1] 207026.8
> pobj(.2, 455.002)
[1] 0
> pobj(1, 455.002)
[1] 18171830
编辑 2:正如@AkselA 评论的那样,在将 pobj 更改为以下内容后,我也尝试了 运行 它:
pobj = function(p, budget){
(budget - pcost(p))^2
}
仍然产生以下错误:
> xmin <- optimize(pobj, c(0, 1), tol=0.01, budget=450)
Error in optimize(pobj, c(0, 1), tol = 0.01, budget = 450) :
invalid function value in 'optimize'
编辑 3:根据@AkselA,顺序图 pobj。尽管在索引 0-10 之间确实出现了轻微下降,但我检查了确切的数字,并且输出确实在每个百分位数都增加了。
最终编辑:虽然 none 的答案直接解决了我的问题,但 AkselA 提供了最佳方向。 运行优化器的问题不在优化器本身,而是pcost(p)。通过显着减少此函数中的代码,优化器能够正常工作并解决问题。感谢您的帮助!
你是不是放错了括号?您的 pobj()
没有最低要求。
假设一个简单的 pcost()
:
pcost <- function(x) exp(x*2)*100 - 90
pobj <- function(p, budget){
(budget - pcost(p))^2
}
xmin <- optimize(pobj, c(0, 1), tol=0.01, budget=450)
xmin
# $minimum
# [1] 0.8443315
#
# $objective
# [1] 1.498106