英文:
Unexpected end of input error when trying to mimic lsqnonlin of MATLAB with nlsLM in R
问题
我正在尝试解决一个非常直接的非线性最小二乘问题,其公式中以零向量作为因变量,因为我只对最小化的参数感兴趣。但是,无论我对这个算法做什么,代码都会给出以下错误:Error in str2lang(x) : <text>:2:0: unexpected end of input 1: ~ ^
*
编辑:用指定变量替换方程的左侧似乎解决了解析器问题。然而,现在我收到了以下错误:
在'data'中没有初始值的参数:params
有人知道我应该在哪里寻找解决这个问题的方法吗?
这是我使用的代码的重要部分:
fit <- function(params, T_k_IV_matrix) {
T <- T_k_IV_matrix[, "tenor"]
k <- T_k_IV_matrix[, "k"]
IV <- T_k_IV_matrix[, "impl_volatility"]
vt <- params[1]
mt <- params[2]
wt <- params[3]
nt <- params[4]
rhot <- params[5]
(1/4) * exp(-2 * nt * T) * (wt^2) * (T^2) * (IV^4) +
(1 - 2 * exp(-nt * T) * mt * T - exp(-nt * T) * wt * rhot *
sqrt(vt) * T) * (IV^2) -(vt + 2 * exp(-nt * T) * wt * rhot *
sqrt(vt) * k + exp(-2 * nt * T) * (wt^2) * (k^2))
}
对于(i in 1:length(grouped_data)) {
T_k_IV_matrix <- data.table(
tenor = c(110, 110, 82, 138, 82, 173, 138, 173, 173, 47),
k = c(0.1629164648, 0.4307829161, -0.3811180797, 0.0009384402,
-0.1823215568, -0.0219789067, -0.0988005847, -0.4187103349,
-0.0737730947, -0.0527505654),
impl_volatility = c(0.950298, 1.106709, 0.732060, 0.740338,
0.638142, 0.525060, 0.689398, 0.652785, 0.955989, 0.962296)
)
y = rep(0, nrow(T_k_IV_matrix))
x0 = c(0.04, 0.1, 0.5, 0.3,-0.8)
lb = c(0.001,-Inf,0.001,0.001,-.999)
ub = c(Inf,Inf,Inf,Inf,.999)
result <- nlsLM(
formula = y ~ fit(params, T_k_IV_matrix),
start = x0,
lower = lb,
upper = ub
)
params[[i]] <- coef(result)
}
英文:
I am trying to solve a quite straight forward non linear least squares problem where the formulation takes 'so to say' a vector of zeroes as dependent variable because I am only interested in the parameters of the minimization for a prediction exercise. However, whatever I do with this algorithm, the code keeps giving me the following error: Error in str2lang(x) : <text>:2:0: unexpected end of input
1: ~
^
EDIT: The suggestion to replace the LHS of the equation with a specified variable seems to resolve the parser issue. However, I now get the following error:
Error in nlsLM(formula = y ~ fit(params, T_k_IV_matrix), start = x0, lower = lb, :
parameters without starting value in 'data': params
Does anyone know where I should be looking to solve this problem?
Here is the important part of the code I use:
fit <- function(params, T_k_IV_matrix) {
T <- T_k_IV_matrix[, "tenor"]
k <- T_k_IV_matrix[, "k"]
IV <- T_k_IV_matrix[, "impl_volatility"]
vt <- params[1]
mt <- params[2]
wt <- params[3]
nt <- params[4]
rhot <- params[5]
(1/4) * exp(-2 * nt * T) * (wt^2) * (T^2) * (IV^4) +
(1 - 2 * exp(-nt * T) * mt * T - exp(-nt * T) * wt * rhot *
sqrt(vt) * T) * (IV^2) -(vt + 2 * exp(-nt * T) * wt * rhot *
sqrt(vt) * k + exp(-2 * nt * T) * (wt^2) * (k^2))
}
for (i in 1:length(grouped_data)) {
T_k_IV_matrix <- data.table(
tenor = c(110, 110, 82, 138, 82, 173, 138, 173, 173, 47),
k = c(0.1629164648, 0.4307829161, -0.3811180797, 0.0009384402,
-0.1823215568, -0.0219789067, -0.0988005847, -0.4187103349,
-0.0737730947, -0.0527505654),
impl_volatility = c(0.950298, 1.106709, 0.732060, 0.740338,
0.638142, 0.525060, 0.689398, 0.652785, 0.955989, 0.962296)
)
y = rep(0, nrow(T_k_IV_matrix))
x0 = c(0.04, 0.1, 0.5, 0.3,-0.8)
lb = c(0.001,-Inf,0.001,0.001,-.999)
ub = c(Inf,Inf,Inf,Inf,.999)
result <- nlsLM(
formula = y ~ fit(params, T_k_IV_matrix),
start = x0,
lower = lb,
upper = ub
)
params[[i]] <- coef(result)
}
答案1
得分: 3
以下是要翻译的内容:
"fit <- function(vt,mt,nt,wt, rhot, T_k_IV_matrix) {
T <- T_k_IV_matrix$tenor
k <- T_k_IV_matrix$k
IV <- T_k_IV_matrix$impl_volatility
(1/4) * exp(-2 * nt * T) * (wt^2) * (T^2) * (IV^4) +
(1 - 2 * exp(-nt * T) * mt * T - exp(-nt * T) * wt * rhot * sqrt(vt) * T) * (IV^2) -
(vt + 2 * exp(-nt * T) * wt * rhot * sqrt(vt) * k + exp(-2 * nt * T) * (wt^2) * (k^2))
}
params <- list()
for (i in 1:length(grouped_data)) {
group <- grouped_data[[i]]
T_k_IV_matrix <- data.table(
tenor = c(110, 110, 82, 138, 82, 173, 138, 173, 173, 47),
k = c(0.1629164648, 0.4307829161, -0.3811180797, 0.0009384402,
-0.1823215568, -0.0219789067, -0.0988005847, -0.4187103349,
-0.0737730947, -0.0527505654),
impl_volatility = c(0.950298, 1.106709, 0.732060, 0.740338,
0.638142, 0.525060, 0.689398, 0.652785, 0.955989, 0.962296)
)
y = rep(0, nrow(T_k_IV_matrix))
x0 = c(vt = 0.04, mt=0.1, nt=0.01, wt=0.3, rhot=-0.8)
lb = c(0.001,-Inf,0.001,0.001,-.999)
ub = c(Inf,Inf,Inf,Inf,.999)
result <- nlsLM(
formula = y ~ fit(vt,mt,nt,wt, rhot, T_k_IV_matrix),
start = x0,
lower = lb,
upper = ub
)
params[[i]] <- coef(result)
}"
英文:
The solution to the above problem consists of three parts. Firstly, the LHS of the nlsLM statement needed to be written as a variable itself to avoid the parsing problem. Secondly, the fit function required the parameter vector to be written out instead of being a list of parameters. Thirdly, to get the wished-for results, the allocation of the variables in the fit function needed to be accessed by '$x' instead of [,"x"].
fit <- function(vt,mt,nt,wt, rhot, T_k_IV_matrix) {
T <- T_k_IV_matrix$tenor
k <- T_k_IV_matrix$k
IV <- T_k_IV_matrix$impl_volatility
(1/4) * exp(-2 * nt * T) * (wt^2) * (T^2) * (IV^4) +
(1 - 2 * exp(-nt * T) * mt * T - exp(-nt * T) * wt * rhot * sqrt(vt) * T) * (IV^2) -
(vt + 2 * exp(-nt * T) * wt * rhot * sqrt(vt) * k + exp(-2 * nt * T) * (wt^2) * (k^2))
}
params <- list()
for (i in 1:length(grouped_data)) {
group <- grouped_data[[i]]
T_k_IV_matrix <- data.table(
tenor = c(110, 110, 82, 138, 82, 173, 138, 173, 173, 47),
k = c(0.1629164648, 0.4307829161, -0.3811180797, 0.0009384402,
-0.1823215568, -0.0219789067, -0.0988005847, -0.4187103349,
-0.0737730947, -0.0527505654),
impl_volatility = c(0.950298, 1.106709, 0.732060, 0.740338,
0.638142, 0.525060, 0.689398, 0.652785, 0.955989, 0.962296)
)
y = rep(0, nrow(T_k_IV_matrix))
x0 = c(vt = 0.04, mt=0.1, nt=0.01, wt=0.3, rhot=-0.8)
lb = c(0.001,-Inf,0.001,0.001,-.999)
ub = c(Inf,Inf,Inf,Inf,.999)
result <- nlsLM(
formula = y ~ fit(vt,mt,nt,wt, rhot, T_k_IV_matrix),
start = x0,
lower = lb,
upper = ub
)
params[[i]] <- coef(result)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论