0

我正在尝试在 R 中进行最大化,这是我之前在 Excel 中使用求解器所做的。问题是我不知道如何处理它(我在 R 中没有很好的水平)。

让我们谈谈我的数据。我有 26 个瑞士州和瑞士政府(这是 26 个州的价值之和)及其人口和“财富”。所以我有 27 个变量观察值。我不确定以下描述是否有用,但我还是把它们放在了上面。由此,我用 while 循环计算了一些变量。对于每个州 [i]:

  • 资源潜力 = 平均值(wealth2011 [i],wealth2012 [i],wealth2013 [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
    }

瑞士政府 (i = 27)的资源指数 (RI)为 100,因为我们将瑞士政府的资源潜在资本(当 i = 27)除以自身并乘以 100。因此,所有具有 RI> ​​的州100 是富裕州,其他 (IR<100) 是贫穷州。到这里为止,没有任何问题。我刚刚解释了我是如何构建我的数据集的。

现在我面临的问题是:我必须创建变量加权差 (wd)。它取值:

  • 0如果 RI>100(富州)
  • (100-RI[i])^(1+P)*Pop[i] if 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/p)]*p
  • 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 中做到这一点。我的主要问题是RI_minwd中存在p。我们需要进行迭代来解决它,但这离我的技能太远了。

有人可以帮助我提供我提供的信息吗?

4

2 回答 2

0

从您提供的描述来看,如果我没记错的话,看起来您需要做的一切都只是一个方程式。特别是您有以下两个表达式:

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

我不明白你到底想最大化什么。

于 2018-02-21T13:29:27.867 回答
0

你应该看看 optim 函数。在这里,我将尝试给您一个非常简单的解释,因为您说您的 R 水平不是很高。

假设我有一个想要最大化的函数 f(x),因此我想找到给我 f(x) 最大值的参数 x。

首先要做的是定义函数,在 R 中你可以这样做:

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

定义函数后,我可以使用以下命令对其进行优化:

optim(par,myfunction)

其中par是函数初始参数的向量,myfunction是需要优化的函数。请记住 optim 执行最小化,但是如果 control$fnscale 为负数,它将最大化。另一种策略是改变功能(即改变符号)以适应问题。

希望这会有所帮助,马可

于 2018-02-21T11:13:42.103 回答