我使用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)
}
}
答案 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
查看文档。