R 使用optimize()查找给定特定值的百分位数

R 使用optimize()查找给定特定值的百分位数,r,function,nonlinear-optimization,R,Function,Nonlinear Optimization,我有一个分配给我的工作项目,我完全搞不清楚。背景: 目前,我们有一个脚本,告诉一家公司将工资差距提高到某个百分位需要多少成本。这称为pcost(p),输入一个介于0和1之间的数字,并返回一个预算值(以千为单位),例如(组合数字): 打印(x) 451.002 在这种情况下,如果我们将最低工资提高到20%,那么公司将损失约45万美元 我的任务是创造一些与此相反的东西,这样我们就可以输入公司需要花费的预算,而产出将是我们可以提高最低工资的百分位。我接到指示,这应该通过在以下函数上使用优化器来完成:

我有一个分配给我的工作项目,我完全搞不清楚。背景:

目前,我们有一个脚本,告诉一家公司将工资差距提高到某个百分位需要多少成本。这称为pcost(p),输入一个介于0和1之间的数字,并返回一个预算值(以千为单位),例如(组合数字):

打印(x) 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'
> 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'
我已经阅读了帮助文件,在这里以及其他网站上搜索过,但似乎无法对导致此错误的原因做出明确解释。很明显,我做错了什么,但我没有太多使用优化器或非线性回归的经验,所以很难自己解决问题

任何指导或专业知识都将不胜感激

编辑:根据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
}
仍然会产生以下错误:

Error in optimize(pobj, interval = c(0, 1), budget = 500, tol = 1e-05) : 
  invalid function value in 'optimize'
> 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'

你刚才把括号放错地方了吗?您的
pobj()
没有最小值

假设一个简单的
pcost()


pcost要使这成为一个可重复的问题,您需要将您的
pobj
替换为一个可以与社区共享的函数。至少,请告诉我们,如果您调用
pobj(0,budget=budget)
pobj(1,budget=budget)
@PeterK,您会得到什么。我已经添加了调用pobj时在0和1处得到的结果。奇怪的是,绘图索引仅运行到60,它应该是1/0.01=100。是否缺少值?或者更可能的是
NULL
s?查看df输出,所有内容都在第67个百分位上保持平衡——值是相同的。据我所知,根据pcost的逻辑,这是为消除群体差异而提高工资所需的最高金额。我试着用这个间隔来约束pobj,即c(0,.6),但是产生了同样的错误。我恐怕不理解你关于括号的观点。据我所知,除了显式调用之外,您编写xmin的方式与我相同。我还尝试了使用您在R中编写它的方式,但仍然得到了无效的函数值。需要注意的一点是:我们使用的pcost函数比您编写的要复杂得多——它运行于多个数据集,并在到达终点之前清理/操作多个变量,在终点处它根据计算出的数据帧返回最终值。优化是否要求我只在pcost中包含相关计算?@Dr.Fishopolis:在您的代码中,您计算了
pcost(p)
,而不是
预算
pcost(p)
差异。
^2
应该移出一个括号。很抱歉没有澄清,我还根据您的更改更新了pobj--仍然得到“优化”中的无效函数值”。我也会更新问题主体。你的
pcost()
是否单调增加(任何局部极小值)?你看过
图(pobj(seq(0,1,0.01),450),type=“l”)