Используя optimize (), чтобы найти процентиль, учитывая определенное значение - PullRequest
0 голосов
/ 21 июня 2019

У меня есть проект для работы, который мне поручили, и я абсолютно не могу понять. Справочная информация:

В настоящее время у нас есть сценарий, который сообщает компании, сколько им будет стоить поднять разницу в заработной плате до определенного процентиля. Это называется pcost (p), где вы вводите число от 0 до 1, и возвращается значение бюджета (в тысячах), например (составленные числа):

> x = pcost(.2)

печать (х) 1 451,002

В этом случае, если мы повысим самую низкую заработную плату до 20-го процентиля, это будет стоить компании около 450 тыс. Долл. *

То, что мне было поручено сделать, - это создать что-то, что инвертирует это так, что мы будем вводить желаемый бюджет, который компания должна потратить, и результат будет в процентах, к которым мы могли бы поднять самую низкую заработную плату. Я был проинструктирован, что это должно быть сделано с помощью оптимизатора для следующей функции:

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 наблюдается небольшое падение, я проверил точные числа, и результат увеличивается с каждым процентилем.

plot(pobj(seq(0, 1, 0.01), 450), type=

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Хотя ни один из ответов напрямую не решил мою проблему, AkselA предоставил наилучшее направление. Проблема в запуске оптимизатора заключалась не в самом оптимизаторе, а в pcost (p). Значительно сократив код в этой функции, оптимизатор смог работать правильно, и проблема была решена. Спасибо за помощь!

1 Ответ

1 голос
/ 21 июня 2019

Вы просто ошиблись скобками?У вашего 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
...