我正在写我的硕士论文,我在R代码中遇到了这个问题。在数学上,我想用R-package“nleqslv”解决这个非线性方程组:
fnewton <- function(x){
y <- numeric(2)
d1 = (log(x[1]/D1)+(R+x[2]^2/2)*T)/x[2]*sqrt(T)
d2 = d1-x[2]*sqrt(T)
y1 <- SO1 - (x[1]*pnorm(d1) - exp(-R*T)*D1*pnorm(d2))
y2 <- sigmaS*SO1 - pnorm(d1)*x[2]*x[1]
y}
xstart <- c(21623379, 0.526177094846878)
nleqslv(xstart, fnewton, control=list(btol=.01), method="Newton")
我已尝试过此代码的多个版本,现在我收到错误:
error: error in pnorm(q, mean, sd, lower.tail, log.p): not numerical.
Pnorm分别是d1和d2的累积标准正态分布。我真的不知道,当我在Teterevas幻灯片上定位我的模型时,我做错了什么(在5号幻灯片上是她的模型代码),谁的演示是googeling的第一个结果
与我一样,无论多么成功,她都会通过Black-Scholes-Merton方法计算违约距离风险度量。在这个模型中,权益的价值(通常由市值表示, - > SO1)可以写成欧洲看涨期权 - 我在上面的代码中标记为y2,但是,之前的等式设置为0! / p>
其他变量是:
x [1] - &gt;我想要得出的变量,总资产价值
x [2] - &gt;我想要得出的变量,总资产的波动性
D1 - &gt;债务的账面价值(1998-2009)
R - &gt;无风险利率
T - &gt;设置为1(时间)
谢谢!我很高兴,任何人都可以帮助我。 卡洛
答案 0 :(得分:10)
我是nleqslv的作者,我对你如何使用它感到非常惊讶。 正如其他人所说,你没有回归任何合理的事情。
y1应为y [1],y2应为y [2]。如果你想让我们说出明智的话,你必须提供D1,R,T,sigmaS和SO1的数值。我试过这个:
T <- 1; D1 <- 1000; R <- 0.01; sigmaS <- .1; SO1 <- 1000
这些已在函数定义之前输入。见这个
library(nleqslv)
T <- 1
D1 <- 1000
R <- 0.01
sigmaS <- .1
SO1 <- 1000
fnewton <- function(x){
y <- numeric(2)
d1 <- (log(x[1]/D1)+(R+x[2]^2/2)*T)/x[2]*sqrt(T)
d2 <- d1-x[2]*sqrt(T)
y[1] <- SO1 - (x[1]*pnorm(d1) - exp(-R*T)*D1*pnorm(d2))
y[2] <- sigmaS*SO1 - pnorm(d1)*x[2]*x[1]
y
}
xstart <- c(21623379, 0.526177094846878)
在这种情况下, nleqslv
在找到解决方案方面没有问题。找到的解决方案是:c(1990.04983,0.05025)
。似乎无需设置btol
参数,您可以使用方法Broyden
。