【问题标题】:storing output vector from r loop which optimizes a function存储来自优化函数的 r 循环的输出向量
【发布时间】:2018-10-20 00:12:20
【问题描述】:

我编写了一个包含两个变量的函数,我想在其中优化 Z:

fr<-function(Z) {
delta<-pnorm((Matrix81fulld$CumZavg-sqrt(rho)*Z)/sqrt(1-rho)) - pnorm((Matrix81fulld$CumZavgLow-sqrt(rho)*Z)/sqrt(1-rho))

sum((Matrix81fulld$n*(Matrix81fulld$Prob1981 - delta)^2)/((delta*(1-delta))))
}

上述功能有效。我传递一个 rho 值,然后求解 Z。我编写了一个循环,将多个 rho 值传递给 fr 函数,以优化不同 rho 值的 Z:

for (rho in c(0.01, 0.025, 0.05, 0.1, 0.15, 0.2, 0.3)){
     o=optimize(fr,interval=c(-2,2))
     n=nlm(fr,p=0)
}

当然,当我打印 'o' 时,只返回 rho=0.3 的优化值,因为所有其他值都被覆盖了。我想将 o 和 n 都存储在 2 个单独的向量中,这些向量包含跨 rho 值的结果。我知道有人问过类似的问题,但它们似乎都容易得多,因为循环通常在 1:10 为 i 运行,例如。在这种情况下,我有 7 个特定的 rho 值,我在每种情况下交换然后优化 fr..不确定我是在假装这更复杂还是真的更复杂,但我似乎无法让它工作。

【问题讨论】:

  • 这不是res &lt;- lapply(c(0.01, 0.025, 0.05, 0.1, 0.15, 0.2, 0.3), function(rho){ c(o=optimize(fr,interval=c(-2,2)), n=nlm(fr,p=0)) })那么简单吗?
  • 不幸的是,我的问题本可以措辞更好。 Rho 不是数据集中的变量;它仅被定义为函数 'fr' 下的数学表达式中的一个术语。因此,当您创建函数(rho)时,它没有值,并且 r 返回错误'找不到对象“rho”'.....当我手动解决这个问题时,我必须定义 rho = 0.01; rho=0.025,每次优化。这就是我尝试循环方法的原因——主要是为了整合我的代码并消除潜在的错误。我可以打印函数中的值以确认它正在工作......我只是还没弄清楚如何存储它们。

标签: r


【解决方案1】:

您似乎只需要在每次循环迭代中存储值

o = list()
n = list()
i = 1
for (rho in c(0.01, 0.025, 0.05, 0.1, 0.15, 0.2, 0.3)){
  o[i]=optimize(fr,interval=c(-2,2))
  n[i]=nlm(fr,p=0)
  i=i+1
}

或者(回答您的评论):

o = list()
n = list()
all_rhos = c(0.01, 0.025, 0.05, 0.1, 0.15, 0.2, 0.3)

for (i in 1:7)){
  rho = all_rhos[i]
  o[i]=optimize(fr,interval=c(-2,2))
  n[i]=nlm(fr,p=0)
}

【讨论】:

  • 是的,这行得通,谢谢。这个解决方案可以从这里的另一个问题推导出来:stackoverflow.com/questions/19057628/…(当你回复时我正在看它)......你的解决方案很有帮助。另一个需要充分理解的问题:为什么需要 i = i + 1?我在想,因为在第二次迭代中,这会给我们 o[2]、n[2],而在第三次迭代中,它会给我们 o[3]、n[3]...等等?
  • i = i + 1 是必需的,因为您不是在 i 上循环,而是在 rho 上循环。我编辑了我的答案以指出这一点。
  • 谢谢-编辑很有帮助。当我自己尝试时,需要“i+1”的“i”部分一直让我感到困惑,但你的例子显示了我实际上是如何做到的……现在很容易,因为我在前面看到了它我
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多