我有一个正在分配的工作项目,我绝对无法弄清楚。背景:
当前,我们有一个脚本来告诉公司,将工资差距提高到一定百分比会花费多少费用。这称为pcost(p),在其中输入0到1之间的数字,并返回预算值(以千为单位),例如(组成数字):
> x = pcost(.2)
打印(x) 1 451.002
在这种情况下,如果我们将最低工资提高到20%,则将使公司损失约45万美元。
我的任务是创建一些与此相反的东西,以便我们输入公司必须花费的所需预算,而输出将是我们可以提高最低工资的百分比。有人指示我应该通过对以下函数使用优化器来完成此操作:
pobj = function(p, budget){
return((budget - pcost(p)^2))
}
我们将在其中插入预算的位置,优化器将找到p的值。
我使用optimize包创建了以下命令,以为在下面的示例中(.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之间似乎确实有轻微的下降,但我检查了确切的数字,并且输出确实在每个百分点处都增加了。
最终编辑:尽管没有任何答案可以直接解决我的问题,但AkselA提供了最佳指导。运行优化器的问题并不在于优化器本身,而在于pcost(p)。通过大幅度削减该函数中的代码,优化器可以正常工作,并且问题已得到解决。感谢您的帮助!
答案 0 :(得分:1)
您只是放错了括号吗?您的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