【问题标题】:How to run a function to EACH of my observations in R?如何对我在 R 中的每个观察结果运行一个函数?
【发布时间】:2016-09-10 04:19:00
【问题描述】:

我的问题如下:

我有一个包含 6000 个观察的数据集,其中包含来自客户的信息(每个观察都是一个客户的信息)。

我正在优化一个给定的函数(在我的例子中是一个利润函数),以便为我感兴趣的变量找到一个最优值。特别是我正在寻找我应该提供的最佳利率,以最大限度地提高我的预期利润。

我对自己的职能没有任何疑问。问题是我不知道我应该如何进行才能将此功能应用于每个观察,以便为我的 6000 个客户(或您喜欢的观察)中的每个客户获得最佳利率。

到目前为止,很容易找到这个变量的唯一最优值(对所有客户都一样),这将使我的利润最大化(这是我猜的全局最大值)。但我需要知道的是,我应该如何进行,以便将我的优化问题分别应用于我的 6000 个观察结果中的每一个,以便为每个客户提供最佳利率(即 6000 个最佳利率,一个每个人)。

我想我应该做一些类似于 for 循环的事情,但是我在这方面的经验是有限的,我已经很沮丧了。更重要的是,我尝试像往常一样使用 mapply(myfunction, mydata) ,但我只收到错误消息。

这就是我的(真正)简单代码现在的样子:

profits<- function(Rate)
  sum((Amount*(Rate-1.2)/100)*
        (1/(1+exp(0.600002438-0.140799335888812*
                    ((Previous.Rate - Rate)+(Competition.Rate - Rate))))))

对于整个样本来说,ONE 的结果是最优的:

> optimise(profits, lower = 0, upper = 100, maximum = TRUE)
$maximum
[1] 6.644821

$objective
[1] 1347291

所以问题是,我如何重写我的代码以最大化这一点并为我的每一行获得我感兴趣的变量的最佳值?

希望我已经清楚了!提前谢谢大家!

【问题讨论】:

  • 包含reproducible example 总是好的。这让其他人更容易帮助您。
  • 你可以使用apply(dataset, 1, FUN=function(obs) ...)如果dataset是一个数据框,那么函数中的参数obs是一个命名向量。检查您是否可以使用with()transform()

标签: r for-loop optimization mathematical-optimization


【解决方案1】:

您的每个客户似乎都是独立的。所以你只需将lapply() 放在optimize() 调用周围:

lapply(customer_list, function(one_customer){
 optimise(profits, lower = 0, upper = 100, maximum = TRUE)
 })

这将返回一个非常大的列表,其中每个列表元素都有一个$maximum 和一个$objective。然后你可以运行 lapply 来计算$maximums 的总数,看看你到底有多富有!

【讨论】:

  • 或者您可以使用for 循环(可能会更慢,但您可以使用&lt;- 分配将最大值存储在观察行的数据框中,并紧密保存所有数据有 6000 个变量,时间损失可能很小,但在保持结果与数据相关方面有一些附加价值。
猜你喜欢
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多