Stack Overflow em Português Asked by George Lucas on September 27, 2021
Estou estimando parâmetros de modelos de regressão não linear sigmoidais, apenas o modelo Richards retorna o erro:
fator de passos 0.000488281 reduzido abaixo de 'minFactor' de 0.000976562
encontrei os chutes iniciais pelo método de análise gráfica, a curva ficou muito próxima dos pontos mas não foi o suficiente para o método convergir.
pesquisando alguns problemas parecidos, a solução aparente que encontrei é modificar o minFactor e maxiter para respectivamente 1/10^6 e 100000, mesmo assim o problema torna a repetir.
Banco de dados:
x<-c(60,90,120,150)
y<-c(1.14, 4.22, 19.3, 22.3)
dados<-data.frame(DAP=x, MSTP=y)
Gráfico com os chutes iniciais:
richar<-function(x){22.3/((1+exp(18.7-0.167*x))^(1/2.1))}
library(ggplot2)
ggplot(dados)+
geom_point(aes(x=DAP, y=MSTP))+
stat_function(fun=richar)
estimação:
richards<-nls(y~a/((1+exp(b-c*x))^(1/d)),start = list(a=22.3,b=18.7,c=0.165,d=2.1))
summary(richards)
Em linhas gerais, ao ajustar um modelo a um conjunto de dados, procuramos ajustar o modelo mais simples possível no maior conjunto de dados disponível. Lembre-se disso ao ler a minha resposta a seguir.
O problema do teu código está no comando richards<-nls(y~a/((1+exp(b-c*x))^(1/d)),start = list(a=22.3,b=18.7,c=0.165,d=2.1))
, que não informa ao R
qual é o conjunto de dados no qual a função nls
deve ajustar a curva.
x<-c(60,90,120,150)
y<-c(1.14, 4.22, 19.3, 22.3)
dados<-data.frame(DAP=x, MSTP=y)
richar<-function(x){22.3/((1+exp(18.7-0.167*x))^(1/2.1))}
library(ggplot2)
ggplot(dados)+
geom_point(aes(x=DAP, y=MSTP))+
stat_function(fun=richar)
richards<-nls(y~a/((1+exp(b-c*x))^(1/d)),
start = list(a=22.3,b=18.7,c=0.165,d=2.1),
data = dados)
#> Warning in min(x): no non-missing arguments to min; returning Inf
#> Warning in max(x): no non-missing arguments to max; returning -Inf
#> Error in nls(y ~ a/((1 + exp(b - c * x))^(1/d)), start = list(a = 22.3, : step factor 0.000488281 reduced below 'minFactor' of 0.000976562
summary(richards)
#> Error in summary(richards): object 'richards' not found
Created on 2020-07-16 by the reprex package (v0.3.0)
Veja que agora recebi outra mensagem de erro. Por definição, um modelo de regressão não-linear com m parâmetros pode ser ajustado a um conjunto com n observações, desde que m ≤ n. No teu caso, m = 4 = n. Isso pode acarretar vários problemas, como por exemplo, instabilidades numéricas. Veja como a solução para o teu problema é encontrado utilizando um conjunto de dados simulados com apenas três pontos a mais do que no problema original.
x <- seq(60, 150, length.out = 7)
y <- richar(x) + rnorm(7, sd = 1)
dados2<-data.frame(DAP=x, MSTP=y)
ggplot(dados2)+
geom_point(aes(x=DAP, y=MSTP))+
stat_function(fun=richar)
richards<-nls(y~a/((1+exp(b-c*DAP))^(1/d)),
start = list(a=22.3,b=18.7,c=0.165,d=2.1),
data = dados2)
summary(richards)
#>
#> Formula: y ~ a/((1 + exp(b - c * DAP))^(1/d))
#>
#> Parameters:
#> Estimate Std. Error t value Pr(>|t|)
#> a 20.9785 0.7074 29.655 8.42e-05 ***
#> b 28.3889 16.9568 1.674 0.193
#> c 0.2451 0.1407 1.742 0.180
#> d 4.0256 2.9087 1.384 0.260
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.9551 on 3 degrees of freedom
#>
#> Number of iterations to convergence: 6
#> Achieved convergence tolerance: 9.361e-06
Created on 2020-07-16 by the reprex package (v0.3.0)
Acho muito difícil que o teu problema tenha alguma solução numérica com um modelo tão complexo (4 parâmetros) e tão poucos pontos (4 observações). A partir daqui, há pelo menos duas abordagens possíveis:
Utilizar uma função mais simples, como a função logística, que possui apenas dois parâmetros para serem ajustados. O problema dessa abordagem, acredito eu, é que a função de Richards está sendo utilizada porque, no problema original, cada um dos seus quatro parâmetros deve ter um significado apropriado para o problema real que está sendo considerado aqui.
Utilizar mais dados. O problema dessa abordagem é justamente obter estes dados. Isto custa tempo e dinheiro e, em alguns casos, sequer é possível obter dados do mesmo experimento, seja porque não há dinheiro ou porque os corpos utilizados nos ensaios foram destruídos.
Answered by Marcus Nunes on September 27, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP