在r中通过组自己的功能进行优化

时间:2013-03-01 23:20:47

标签: r optimization plyr

我想在我自己的功能上按群组应用优化:

这是一个可重复的数据集:

data <- data.frame(ID=c(1,1,1,2,2,3,3),C=c(1,1,1,2,2,3,4),
                   Lambda=c(0.5),s=c(1:7),   
                   sigma_S=c(0.5,0.4,0.3,0.7,0.4,0.5,0.8),
                   d=c(20,30,40,50,60,70,80), 
                   sigma_B=0.3,t=5,Rec=0.5,r=0.05)

我的功能定义如下(功能很简单,我只想了解方法):

  TestMSE <- function(LR)
  {
    d <- data
    D <- LR + d$s
    mse(d$C, D)   # mse is from the Metrics Package
   }

optimize(TestMSE,lower = 0.1, upper =1.5)

我尝试使用ddply函数:

test <-  ddply(data,"ID",summarise, optimize(TestMSE,lower = 0.1, upper =1.5))

但是应用ddply函数我收到了所有组的相同解决方案,尽管子组存在差异。

感谢。

1 个答案:

答案 0 :(得分:5)

问题正如@Joran所指出的那样,你的函数TestMSE无法从ddply获取拆分数据。因此,您应该为输入数据提供参数,以便为每个组提供数据。试试这样的事,也许吧?

TestMSE <- function(LR, d) {
    D <- LR + d$s
    mse(d$C, D)
}

require(plyr)
require(Metrics)
test <-  ddply(data,"ID", function(x) {
    unlist(optimize(TestMSE, 0.7, x, lower = 0.1, upper =1.5))
})

#   ID   minimum objective
# 1  1 0.1000519  1.876781
# 2  2 0.1000519  7.010270
# 3  3 0.1000519  9.610322
啊哈,现在我明白了你的需求。可以使用merge

完成
merge(data, test, by="ID")

#   ID C Lambda s sigma_S  d sigma_B t Rec    r   minimum objective
# 1  1 1    0.5 1     0.5 20     0.3 5 0.5 0.05 0.1000519  1.876781
# 2  1 1    0.5 2     0.4 30     0.3 5 0.5 0.05 0.1000519  1.876781
# 3  1 1    0.5 3     0.3 40     0.3 5 0.5 0.05 0.1000519  1.876781
# 4  2 2    0.5 4     0.7 50     0.3 5 0.5 0.05 0.1000519  7.010270
# 5  2 2    0.5 5     0.4 60     0.3 5 0.5 0.05 0.1000519  7.010270
# 6  3 3    0.5 6     0.5 70     0.3 5 0.5 0.05 0.1000519  9.610322
# 7  3 4    0.5 7     0.8 80     0.3 5 0.5 0.05 0.1000519  9.610322