Итерация/максимизация Решатель Excel в R

Я пытаюсь сделать максимизацию в R, которую я сделал ранее в Excel с помощью решателя. Проблема в том, что я не знаю, как с этим бороться (у меня нет хорошего уровня в R).

давайте немного поговорим о моих данных. У меня есть 26 швейцарских кантонов и швейцарское правительство (которое представляет собой сумму стоимости 26 кантонов) с их населением и их «богатством». Итак, у меня есть 27 наблюдений по переменной. Я не уверен, что следующие описания полезны, но я их все же привожу. Исходя из этого, я вычисляю некоторые переменные с помощью циклов while. Для каждого кантона [i]:

  • ресурсный потенциал = среднее (богатство 2011 [i], богатство 2012 [i], богатство 2013 [i])
  • Среднее значение населения = среднее (население 2011 [i], население 2012 [i], население 2013 [i])
  • ресурсный потенциал на душу населения = 1000*ресурсный потенциал [i]/население [i]
  • ресурсный индекс = 100 * ресурсный потенциал на душу населения [i] / ресурсный потенциал на душу населения [правительство Швейцарии]

Вот небольшой пример того, какие циклы я использовал:

    RI=0
    i = 1
    while(i<28){
      RI[i]=resource potential capita [i]/resource potential capita [27]*100
      i = i+1
    }

Индекс ресурсов (RI) для швейцарского правительства (i = 27) равен 100, потому что мы делим ресурсный потенциал на душу населения швейцарского правительства (когда i = 27) сам по себе и умножаем на 100. Следовательно, все кантоны с RI>100 являются богатыми кантонами, а остальные (IR‹100) – бедными кантонами. До этого момента проблем не было. Я только что объяснил, как я построил свой набор данных.

Теперь проблема, с которой я столкнулся: мне нужно создать переменную взвешенная разница (wd). Он принимает значение:

  • 0, если RI>100 (богатый кантон)
  • (100-RI[i])^(1+P)*Pop[i], если RI‹100 (бедный кантон)

Я создаю эту переменную так: (извините за слабость кода, я старался).

wd=-1
i = 1
a = 0
c = 0
tot = 0
while(i<28){
  if(i == 27) {
    wd[i] = a
  } else if (RI[i] < 100) {
    wd[i] = (100-RI[i])^(1+P)*Pop[i]
    c = wd[i]
    a = a+c
  } else {
    wd[i]= 0
  }
  i = i+1
}

Тем не менее, я не знаю значение "p". Это значение от 0 до 1. Чтобы найти значение p, я должен выполнить максимизацию, используя следующие функции:

  • RI_26 = 65,9, это минимум RI в моих данных
  • RI_min = 100-((x*wd [27])/((1+p)*z*100))^(1/p), где x и z — фиксированные значения (x = 8'677, z = 4'075'977'077) и wd [27] сумма wd для каждого кантона.

У нас есть p в двух уравнениях: RI_min и wd. Чтобы решить ее в Excel, я использовал решатель Excel со следующими функциями:

  • p_dot = RI_26/RI_min* p ==> p_dot = [65,9/100-((x* wd [27])/((1+p)*z*100))^(1/ р)]*р
  • RI_26 = RI_min ==>65,9 =100-((x*wd [27])/((1+p)*z*100))^(1/p)

В Excel p — это моя ячейка переменной (единственное значение, которое можно изменить), p_dot — это моя цель для определения, а RI_26 = RI_min — это моя ограничение.

Поэтому я хотел бы максимизировать p и я не знаю, как это сделать в R. Моя главная проблема — наличие p в RI_min и wd. Нам нужно сделать итерацию, чтобы решить ее, но это слишком далеко от моих навыков.

Может ли кто-нибудь помочь мне с информацией, которую я предоставил?


person S.Tripod    schedule 21.02.2018    source источник


Ответы (2)


вы должны изучить оптимальную функцию. Здесь я попытаюсь дать вам действительно простое объяснение, поскольку вы сказали, что у вас не очень хороший уровень в R.

Предположим, у меня есть функция f(x), которую я хочу максимизировать, и поэтому я хочу найти параметр x, который дает мне максимальное значение f(x).

Первое, что нужно сделать, это определить функцию, в R вы можете сделать это с помощью:

myfunction<- function(x) {...}

Определив функцию, я могу оптимизировать ее с помощью команды:

optim(par,myfunction)

где par — вектор начальных параметров функции, а myfunction — функция, которую необходимо оптимизировать. Имейте в виду, что optim выполняет минимизацию, однако она максимизируется, если значение control$fnscale отрицательно. Другой стратегией будет изменение функции (т. е. изменение знака) в соответствии с проблемой.

Надеюсь, что это поможет, Марко

person Marco De Virgilis    schedule 21.02.2018
comment
Спасибо за ответ Марко. Я попытаюсь сделать это, но я не уверен, что и как я должен добавить в свою функцию. Если кто-то хочет помочь мне больше с примером или более прикладным ответом, я с удовольствием принимаю. Но спасибо за совет, буду работать над этим - person S.Tripod; 21.02.2018

Из предоставленного вами описания, если я не ошибаюсь, похоже, что все, что вам нужно сделать, это просто уравнение. В частности, у вас есть следующие два выражения:

RI_min = 100-((x*y)/((1+p)*z*100))^(1/p)

и, поскольку x, y, z фиксированы, единственной переменной является p. Более того, имея RI_26 = RI_min, это дает:

65.9 =100-((x*y)/((1+p)*z*100))^(1/p)

Подставляя значения x, y и z, которые вы предоставили, это дает

p=0.526639915936052

Я не понимаю, что именно вы пытаетесь максимизировать.

person Marco De Virgilis    schedule 21.02.2018
comment
Я только что отредактировал свой пост, потому что я сделал ошибку в первом. Это сильно меняет дело - person S.Tripod; 22.02.2018