2015-08-19 6 views
2

У меня есть сценарий R с сотнями строк. Этот сценарий в конце концов дает мне один цифровой ответ в конце. Теперь я хочу создать доверительный интервал и, следовательно, многократно запускать весь этот сценарий, чтобы иметь возможность рассчитать среднее и стандартное отклонение. Но я не хочу, чтобы создать «для» перебрать все это потому, что становится очень сложнымПовторяю R-скрипт несколько раз

После некоторых исследований, я наткнулся на этот метод:

Мой окончательный ответ назван как «результат», а затем в новом файле сценария,

result_list<-lapply(1:10, function(n)source("my_script_file.R")) 
result_list 

(повторение 10 раз, например)

Однако окончательные результаты выглядит так,

[[1]] 
[[1]]$value 
[1] 136.9876 

[[1]]$visible 
[1] TRUE 

[[2]] 
[[2]]$value 
[1] 138.4969 

[[2]]$visible 
[1] TRUE 

[[3]] 
[[3]]$value 
[1] 0.2356484 

[[3]]$visible 
[1] TRUE 

. 
. 

Теперь я понятия не имею, что означает вторая строка в каждой итерации? И как мне получить список значений, result_list$values не работает, а также игнорирует слишком малые значения, которые могут быть ошибкой моделирования, как и третья, здесь, чтобы иметь возможность вычислять среднее значение и sd.

Также есть ли способ повторить этот процесс, кроме этого метода?

ответ

0

Мы можем использовать $value, чтобы получить «значение» от каждой итерации

lapply(1:10, function(n)source("my_script_file.R")$value) 

Поскольку это единственный элемент, он может быть также полезно использовать sapply, чтобы получить vector OUTPUT

v1 <- sapply(1:10, function(n)source("my_script_file.R")$value) 

Мы можем подмножить vector для значений, превышающих определенный порог, например 0,5,

v1[v1 > 0.5] 
+0

Спасибо :) Это помогает – mac

+1

Да, конечно ... сделано! – mac

1

Я бы рекомендовал сделать ваш скрипт как функцию, загрузив функцию один раз, а затем используя replicate вместо lapply(1:n, ...).

Вот очень простой пример:

Представьте, что вы работали с простым файлом R сценария, который имел следующее содержание:

## saved in working directory as "testfun.R" 
myFun <- function(x, y, z) { 
    mean(rnorm(x)) + mean(rnorm(y)) + mean(rnorm(z)) 
} 

myFun(10, 12, 14) 
## End of "testfun.R" file 

Теперь, сравните хронометраж того, чтобы source 100 раз с наличием просто запустить функцию 100 раз:

fun1 <- function(n = 10) replicate(n, myFun(10, 12, 14)) 
fun2 <- function(n = 10) lapply(1:n, function(x) source("testfun.R")$value) 

library(microbenchmark) 
microbenchmark(fun1(100), fun2(100), unlist(fun2(100)), times = 1) 
## Unit: milliseconds 
##    expr  min  lq  mean median  uq  max neval 
##   fun1(100) 3.064384 3.064384 3.064384 3.064384 3.064384 3.064384  1 
##   fun2(100) 59.635228 59.635228 59.635228 59.635228 59.635228 59.635228  1 
## unlist(fun2(100)) 61.349713 61.349713 61.349713 61.349713 61.349713 61.349713  1 

Я не знаю, сколько разницы было бы в долгосрочной перспективе, если больше тим e обрабатывается (а не считывает исходный файл), но я бы по-прежнему рассматривал функцию + replicate как более чистую и удобную для чтения альтернативу.

+0

Благодарим вас за советы. Но проблема здесь в том, что у меня уже есть несколько циклов и функций в моем R-скрипте, поэтому включение всего этого в одну новую функцию потребует много изменений и редактирования и сделает ее более сложной. – mac

+0

@mac, я не понимаю, почему это было бы проблемой. Просто заверните все в функцию. Это не должно требовать больше сложностей, чем это .... – A5C1D2H2I1M1N2O1R2T1

+0

Хмм, дайте мне попробовать. Но есть так много переменных во всем, мне нужно будет включить их все в мою новую функцию (правильно?). И я понимаю, что ваш предложенный метод довольно быстр, как видно выше, но это не проблема в моем случае. Но, тем не менее, я все еще хочу попробовать. Я все еще нахожусь на этапе обучения Р. Так что спасибо снова. Цените это :) – mac

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