TransWikia.com

Por que a função "nls" do R não apresenta convergência mesmo com a curva inicial bem próxima dos pontos?

Stack Overflow em Português Asked by Leonardo Castro on September 26, 2021

Que ajustar os pontos a seguir com a função cujo chute inicial é representado pela linha:

Pontos com curva inicial para ajuste.

Mas recebo a seguinte mensagem:

Error in nls(y ~ A * (1 + erf(E * B * (x - C)/sqrt(2))) * dnorm(B * (x - : gradiente singular
Traceback:

1. nls(y ~ A * (1 + erf(E * B * (x - C)/sqrt(2))) * dnorm(B * (x - 
 .     C)) + D, data = fdata, start = list(A = A0, B = B0, C = C0, 
 .     D = D0, E = E0))

Este é o meu código:

erf <- function(x) 2 * pnorm(x * sqrt(2)) - 1

x = c(0.275, 0.325, 0.375, 0.425, 0.475, 0.525, 0.575, 0.625, 0.675, 0.725, 0.775, 0.825, 0.875, 0.925, 0.975)
y = c(33, 69, 48, 57, 51, 46, 36, 42, 26, 22, 22, 18, 16, 9, 5)

plot(x, y, xlim=c(0,1))

fdata = data.frame(x = x, y = y)

# Initial parameter values:
A0 = 1.3*max(y); B0 = 3.8*max(x); C0 = 1.0*x[which.max(y)]; D0 = 0.0; E0 = 4.0

# Plot curve with initial parameter values:
xfit0 = seq(from=0.0, to=1.0, length.out=100)
yfit0 = A0*(1+erf(E0*B0*(xfit0-C0)/sqrt(2)))*dnorm(B0*(xfit0-C0))+D0
lines(xfit0, yfit0, lwd=3)

# Do the fit:
fit <- nls(y~A*(1+erf(E*B*(x-C)/sqrt(2)))*dnorm(B*(x-C))+D, data = fdata, start = list(A = A0, B = B0, C = C0, D = D0, E = E0))
lines(fdata$x, predict(fit), col="red", lwd=2)

Por que o nls não mostra convergência? O algoritmo estaria pouco tolerante? É possível configurá-lo para aceitar um maior desvio como aceitável?

One Answer

O problema está no excesso de parâmetros para tão poucos pontos.

Se a função a ajustar está a usar uma translação do eixo dos x representada por x - C, pode-se eliminar um dos parâmetros, C, ajustando a função com valores de x1 = x - C0.

fdata$x1 <- fdata$x - C0

fit1 <- nls(y ~ A*(1 + erf(E*B*x1/sqrt(2)))*dnorm(B*x1) + D, 
           data = fdata, 
           start = list(A = A0, B = B0, D = D0, E = E0))


lines(fdata$x, predict(fit1), col="red", lwd=2)

inserir a descrição da imagem aqui

Correct answer by Rui Barradas on September 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP