我正在尝试优化我用R编写的模型。
我可以使用以下命令运行模型:
mod <- run_model(data,md,s1,s2,s3)
其中md,s1,s2,s3是用于定义模型中特定参数的数值。我的问题是:在R中是否可以选择md,s1,s2和s3的最佳组合来驱动模型。具体来说,我知道这些变量应该是以下之一
md <- c(1, 0.75, 0.5, 1.5, 0.3, 2.5)
s1 <- c(0.6,0.8)
s2 <- c(0.3,0.4,0.6)
s3 <- c(0.17336, 0.18246, 0.1921, 0.22624, 0.28704, 0.33518,
0.5534, 0.7442, 1.019, 1.5122)
但我想知道如何通过选择这些值的最佳组合来减少模型错误。
因此,如果错误是由
定义的err = observed - mod
如何选择这些输入参数的最佳组合以获得最低的误差?
我在想这可能是一个循环(即4个不同的循环),但这个想法听起来不是很有效。我想知道是否有其他人对我该做什么有一些建议?请注意,我不能在这里使用optim,因为我不想被告知输入值是什么,而是从提供的向量中选择最佳值。任何意见,将不胜感激。
答案 0 :(得分:4)
使用特定的run_model
函数可以更容易地回答这个问题。但是,由于您想要测试任意函数的一组离散参数值而不假设其形式,您确实需要测试每个组合以找到最大值。
您可以使用
创建所有可能输入参数的data.framepp <- expand.grid(md=md, s1=s1, s2=s2, s3=s3)
如果run_model
在其所有参数上进行矢量化,也是最佳选择。如果它不是当前格式,您可以使用Vectorize()
来提供帮助。我将假设run_model
返回给定参数组合的总体错误。然后就可以了
# make all parameters vectorized (except for the first "data" parameter)
V_run_model <- Vectorize(run_model, vectorize.args = names(formals(run_model))[-1])
# get error values
err <- with(pp, V_run_model(data, md, s1, s2, s3))
# find best parameters (minimal error)
pp[which.min(err), ]