R中的迭代方法代码可以提高效率吗?

时间:2014-05-08 20:06:25

标签: r for-loop

我使用Merton默认模型和复杂的迭代方法。

我已经准备好了我的 R 代码,但由于我是 R 的新手,因此它们似乎非常低效,从某种意义上来说它们运行了近7个小时。我的主要问题是我的循环部分。

我恳请您查看我的 R 代码并进行任何更正,以使我的 R 代码更有效,即他们运行的时间更少 我在这里下载了所有数据和 R 代码: https://www.dropbox.com/sh/jlqvao40e5nvkev/AACpPdAdG67juhX9HoHPpiC1a

修改 下面的循环运行很多,也许你知道我可以替换的一些函数while和for循环在这里,我想sappy可以工作,但我不知道如何应用它:

  errors<-ddply( df5, .(id, BSheetyearlag), function(x) sum((x$iterK-x$iterK1)^2))

  df5<-as.data.frame(df5)
  df5<-join(df5, errors, by=c("id", "BSheetyearlag"))
  df5<-as.data.table(df5)
  for ( i in 1:nrow(errors)){
  while(errors$V1[i] >= 10^(-10)) {
  df5<-as.data.table(df5)
  df5[,iterK:= iterK1,by=c("id", "BSheetyearlag")] 
  df5[,assetreturn:=c(NA,diff(log(iterK))),by=c("id", "BSheetyearlag")] 
  df5[,rollsdasset:=rollapply(assetreturn, 249, sd, fill=NA, align='right')*sqrt(250), by=c("id", "BSheetyearlag")]
  df5[,iterK1:=(cap+LTD05*exp(-rfabsol)*pnorm(blackscholes(iterK,LTD05,rfabsol, 1,rollsdasset[250]))-rollsdasset[250])/pnorm(blackscholes(iterK,LTD05,rfabsol, 1,rollsdasset[250])),by=c("id", "BSheetyearlag")]
  df5<-as.data.frame(df5)
  errors$V1[i]<-sum((df5[df5$V1 %in% errors$V1[i],"iterK"]-df5[df5$V1 %in% errors$V1[i],"iterK1"])^2)
        }
        }

1 个答案:

答案 0 :(得分:2)

通常,R提供了许多执行循环的函数。它们被称为apply函数族。有关特定语法和详细信息,请在R控制台中键入:

?apply

此外,这里有一些链接可以帮助您熟悉这些功能。

此外,由于您是R的新手,因此您应该查看基本R附带的调试工具。

traceback() 
# - prints out the function call stack after an error occurs
# - does nothing if there's no error
# - only gives the most recent error- call right away

recover()   
# allows you to modify the error behavior so that you can
# browse the function call stack

debug()
# flags a function for "debug" mode which allows you to step
# through execution of a function one line at a time.

browser()
# suspends the execuction of a function wherever it is
# called and puts the function in debug mode.
# You can put this anywhere in the code and it will start there.

trace()
# allows you to insert debugging code into a function in
# in specific places

还有R Profiler可以通过Rprof()访问。使用?Rprof查看文档。