2015-06-09 5 views
1

Я пытаюсь сделать глобальный анализ чувствительности, используя fast99() в пакете чувствительности в R. Просто, чтобы дать вам представление о том, что я пытаюсь сделать, вот модель, которую я построил только для демонстрация: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 является ключевой переменной.

Мой вопрос: могу ли я реализовать fast99() на модели черного ящика, которая считывает txt-файл в качестве входных параметров? Например:

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

Хорошо. Я понял, как передать параметры образца в txt, используя sobol() вместо fast99().

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 исчезает после нескольких итераций. Это проблема с дизайном модели, и я не знаю, что исправить.

Учитывая мою ситуацию, есть ли способ просто заключить в таблицу результаты и входные параметры в одном кадре данных и провести на нем какой-то анализ чувствительности? По крайней мере, таким образом, я могу вручную запустить модель черного ящика и построить таблицу.

Смежные вопросы