1

我想对我自己的函数按组应用优化:

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

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 函数,我的所有组都收到了相同的解决方案,尽管子组有所不同。

谢谢。

4

1 回答 1

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    
于 2013-03-01T23:49:14.297 回答