Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R nls():“;初始参数估计的误差奇异梯度矩阵”;_R_Nonlinear Optimization_Nls - Fatal编程技术网

R nls():“;初始参数估计的误差奇异梯度矩阵”;

R nls():“;初始参数估计的误差奇异梯度矩阵”;,r,nonlinear-optimization,nls,R,Nonlinear Optimization,Nls,我读过很多类似的问题,但仍然找不到答案。 以下是我用来校准以下方程式的一些数据: set.seed(100) i <- sort(rexp(n = 100,rate = 0.01)) Tr <- sort(runif(n = 100,min = 5,max = 100)) k_start <- 3259 u_start <- 0.464 t0_start <- 38 n_start <- -1 i_test <- k_start*Tr^u_start

我读过很多类似的问题,但仍然找不到答案。 以下是我用来校准以下方程式的一些数据:

set.seed(100)
i <- sort(rexp(n = 100,rate = 0.01))
Tr <- sort(runif(n = 100,min = 5,max = 100))

k_start <- 3259
u_start <- 0.464
t0_start <- 38
n_start <- -1

i_test <- k_start*Tr^u_start * (5 + t0_start)^n_start

m <- nls(i~(k * Tr^u / (5+t0)^n), start = list(k = k_start, u = u_start,
                                               t0 = t0_start, n = n_start))
当我只使用分子时,它起作用,但这不是我需要的。
非常感谢您的帮助。

在第一个nls中,右侧仅通过 k/(5+t0)^n因此它被过度参数化,因为一个参数可以表示 它们的综合效应。在第二个nls中,右侧仅取决于 在k和d到k/d上,问题再次被过度参数化,并且 一个参数可以表示它们的组合效应

去掉多余的参数,使用线性模型获得起始值,它会收敛

fit.lm <- lm(log(i) ~ log(Tr))
co <- coef(fit.lm)
fit <- nls(i ~ k * Tr ^ u, start = list(k = exp(co[[1]]), u = co[[2]]))
fit
## Nonlinear regression model
##   model: i ~ k * Tr^u
##    data: parent.frame()
##         k         u 
## 0.0002139 3.0941602 
##  residual sum-of-squares: 79402
##
## Number of iterations to convergence: 43 
## Achieved convergence tolerance: 5.354e-06
(图后续)

柱脚 请注意,
plinear
算法可用作拟合上述
fit
模型的替代算法,以避免为k提供起始值。它还有一个额外的好处,在这种情况下,它需要更少的迭代(14对45)。使用
plinear
时,公式应省略线性参数k,因为该参数由算法暗示,并将报告为
.lin

nls(i ~ Tr ^ u, start = list(u = co[[2]]), algorithm = "plinear")
## Nonlinear regression model
##   model: i ~ Tr^u
##    data: parent.frame()
##         u      .lin 
## 3.0941725 0.0002139 
##  residual sum-of-squares: 79402
##
## Number of iterations to convergence: 14 
## Achieved convergence tolerance: 3.848e-06

在第一个nls中,右侧仅依赖于k、t0和n k/(5+t0)^n因此它被过度参数化,因为一个参数可以表示 它们的综合效应。在第二个nls中,右侧仅取决于 在k和d到k/d上,问题再次被过度参数化,并且 一个参数可以表示它们的组合效应

去掉多余的参数,使用线性模型获得起始值,它会收敛

fit.lm <- lm(log(i) ~ log(Tr))
co <- coef(fit.lm)
fit <- nls(i ~ k * Tr ^ u, start = list(k = exp(co[[1]]), u = co[[2]]))
fit
## Nonlinear regression model
##   model: i ~ k * Tr^u
##    data: parent.frame()
##         k         u 
## 0.0002139 3.0941602 
##  residual sum-of-squares: 79402
##
## Number of iterations to convergence: 43 
## Achieved convergence tolerance: 5.354e-06
(图后续)

柱脚 请注意,
plinear
算法可用作拟合上述
fit
模型的替代算法,以避免为k提供起始值。它还有一个额外的好处,在这种情况下,它需要更少的迭代(14对45)。使用
plinear
时,公式应省略线性参数k,因为该参数由算法暗示,并将报告为
.lin

nls(i ~ Tr ^ u, start = list(u = co[[2]]), algorithm = "plinear")
## Nonlinear regression model
##   model: i ~ Tr^u
##    data: parent.frame()
##         u      .lin 
## 3.0941725 0.0002139 
##  residual sum-of-squares: 79402
##
## Number of iterations to convergence: 14 
## Achieved convergence tolerance: 3.848e-06

伟大的非常感谢。我想它解决了我的问题。但是,如果我想使用所有原始参数(即使太多),您不会认为有办法运行
nls
?有无限多的解决方案。您可以为t0和n选择任意值,然后求解k和u。但这似乎毫无意义。我们还添加了另一个模型(图中的蓝线),该模型具有更低的剩余平方和,视觉上也更适合。太棒了!非常感谢。我想它解决了我的问题。但是,如果我想使用所有原始参数(即使太多),您不会认为有办法运行
nls
?有无限多的解决方案。您可以为t0和n选择任意值,然后求解k和u。但这似乎毫无意义。还添加了另一个模型(图中的蓝线),该模型的剩余平方和较低,视觉上也更适合。
nls(i ~ Tr ^ u, start = list(u = co[[2]]), algorithm = "plinear")
## Nonlinear regression model
##   model: i ~ Tr^u
##    data: parent.frame()
##         u      .lin 
## 3.0941725 0.0002139 
##  residual sum-of-squares: 79402
##
## Number of iterations to convergence: 14 
## Achieved convergence tolerance: 3.848e-06