2015-06-09 110 views
1

我想在R的靈敏度包中使用fast99()進行全局靈敏度分析。只是爲了讓你知道我正在嘗試做什麼,這裏是我爲示範: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

好的。我想出瞭如何使用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在經過幾次迭代之後會出現問題。這是模型設計的一個問題,我無法知道需要解決什麼問題。

鑑於我的情況,是否有辦法在單個數據框中對結果和輸入參數進行製表並對其執行某種靈敏度分析?至少這樣,我可以手動運行黑盒模型並建立一個表格。