我正在尝试使用R中的灵敏度包中的fast99()进行全局灵敏度分析。为了让您了解我尝试做什么,这里是我为演示而构建的模型:
library(sensitivity)
factors <- c("x1", "x2", "x3")
modelRun <- function (Input) {
(Input[,1]-0.5)*2 + (Input[,2]+1)*5 + (Input[,3]-0.2)*3
}
test <- fast99(modelRun, factors, n = 1000, q.arg=list(min=0, max=2) )
具有以下测试结果:
> test
Call:
fast99(model = modelRun, factors = factors, n = 1000, q.arg = list(min = 0, max = 2))
Model runs: 3000
Estimations of the indices:
first order total order
x1 0.1053816 0.1061664
x2 0.6572669 0.6593234
x3 0.2368125 0.2388793
我现在可以用它来说变量x2是关键变量。
我的问题是:我可以在一个读取txt文件作为输入参数的黑盒模型上实现fast99()吗?例如:
factors <- c("x1", "x2", "x3")
newModel <- function(Input) {
params <- readLines("inputtext.txt")
params[17] <- toString(Input[,1])
params[23] <- toString(Input[,2])
params[25] <- toString(Input[,3])
writeLine(params, "inputtext.txt")
source("blackboxmodel.R") # this model then reads inputtext.txt file as input parameters
y <- read.csv("output.csv")
return(y$results)
}
library(sensitivity)
test <- fast99(newModel, factors, n = 10, q.arg=list(min=0, max=2) )
我有更多参数,而且我的代码非常庞大,所以我在这篇文章中使用精简版。当我运行它时,模型会停止,因为我认为它会对所有10个样本进行矢量化并将它们传递给文本文件。
而不是像文本行那样我需要的东西:
"x1 = 1"
我得到了
"x1 = 1, 1.4, 1.8, 1.8, 1.4, 1, 0.6, 0.2, 0.2, 0.6, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN"
由于文本文件具有变量x1的多个值(以及其余变量),黑盒模型将停止运行。
我没有设计黑盒模型,所以我只能通过更改文本文件来遍历模型。如何通过首先将这些参数传递给纺织品来使用fast99()?
答案 0 :(得分:0)
确定。我想出了如何使用sobol()而不是fast99()将示例参数传递给txt。
newModel <- function(Input) {
for (i in 1:nrow(Input)) {
params <- readLines("inputtext.txt")
params[17] <- toString(Input[i,1])
params[23] <- toString(Input[i,2])
params[25] <- toString(Input[i,3])
writeLine(params, "inputtext.txt")
source("blackboxmodel.R") # this model then reads inputtext.txt file as input parameters
y <- read.csv("output.csv")
}
return(y$results)
}
library(sensitivity)
n <- 100
x1 <- data.frame(matrix(runif(3*n, min = 0.1, max = 2), nrow=n))
x2 <- data.frame(matrix(runif(3*n, min = 0.1, max = 2), nrow=n))
results <- sobol(model=newModel, X1=x1, X2=x2, order=2, nboot=100)
我现在遇到的问题是blackboxmodel.R经过几次迭代后就会崩溃。这是模型设计的一个问题,我无法知道要修复什么。
根据我的情况,有没有办法在单个数据框中将结果和输入参数制成表格并对其进行某种灵敏度分析?至少这样,我可以手动运行黑盒模型并构建一个表。