2013-11-23 2 views
0

Я пытаюсь написать функцию для оценки бюджета неопределенности на основе метода Монте-Карло. Здесь я расскажу только о том, какой код мне нужно ускорить.Ускорение rnorm in для цикла

inout<-function(var1,svar1,var2,svar2){ 
      M<-10^6 

      var1m<-matrix(nrow=length(var1),ncol=M) 
      var2m<-matrix(nrow=length(var2),ncol=M) 

      j<-1 
      for (j in 1:length(var1)) { 
      var1m[j,]<-var1[j]+rnorm(M,0,svar1[j]) 
      var2m[j,]<-var2[j]+rnorm(M,0,svar2[j]) 
      } 
      var1a<-apply(var1m,1,mean) 
      var2a<-apply(var2m,1,mean) 
      return(list(a=round(var1a,digits=1),b=round(var2a,digits=1))) 
     } 

fake1<-cbind(rnorm(200,10,1),rnorm(200,1,0.1),rnorm(200,15,2),rnorm(200,2,0.1)) 
fake2<-cbind(rnorm(200,5,1),rnorm(200,2,0.1),rnorm(200,150,2),rnorm(200,4,0.1)) 
inout(var1=fake[,1],svar1=fake[,2],var2=fake[,3],svar2=fake[,4]) 

Для моей цели это очень важно, чтобы каждый элемент j из var1 это связано с его rnorm(M,0,svar1[j]) срок.
Спасибо.

AB

+0

Просто просматривая свой код, аргумент 'svar2' не используется нигде (должен' svar2 <-vector (length = length (var1)) 'end in' var2'?). Кроме того, последний аргумент в вашей последней строке (пример использования): вы не определили 'svar2 [, 4]' в любом месте (R должен жаловаться, даже если ваша функция не использует его). –

ответ

2

Это должно сделать то же самое:

inout2<-function(var1,svar1,var2,svar2, M){ 
    var1m <- matrix(rnorm(M*length(var1), mean=0, sd=rep(svar1, each=M)), 
        ncol=length(var1)) 
    var2m <- matrix(rnorm(M*length(var2), mean=0, sd=rep(svar2, each=M)), 
        ncol=length(var2)) 

    var1a <- colMeans(var1m) + var1 
    var2a <- colMeans(var2m) + var2 

    return(list(a=round(var1a,digits=1),b=round(var2a,digits=1))) 
} 

Знаете ли вы, что (из-за округления) результат будет довольно часто зависит от svar1 и svar2 если M достаточно велико?

+0

Да, это произойдет именно в этом примере, а не с реальным набором данных и реальной функцией. Я попробовал ваше решение, но результат не совсем тот же (также с set.seed). Я не знаю почему. – Ndr

+0

Результат не может быть точно таким же, потому что вы чередуете создание случайных чисел для var1m и var2m, тогда как мой код создает сначала все случайные числа для var1m, а затем все случайные числа для var2m. Случайные последовательности должны быть разными. – Roland

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