我想在我自己的功能上按群组应用优化:
这是一个可重复的数据集:
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函数我收到了所有组的相同解决方案,尽管子组存在差异。
感谢。
答案 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