<font face="trebuchet ms,sans-serif">Ivan,<br><br>O modelo que você passou não é contínuo nos "cotovelos". Pelos dados que passou, penso que você queira um modelo contínuo nas trocas de taxa. Eu fiz uns ajustes quanto à isso<br>
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"># modelo não contínuo</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">curve(segment_lpl(x, b0=7.8, b1=-0.02, b2=-0.01, K=7.5, X0=10, X1=20), -1, 30)</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"># modelo tri-linear segmentado contínuo</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">tri.lin <- function(x, x0, b0, x1, b1, x2, b2){</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> ## x0: intercepto</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> ## b0: inclinação/taxa do primeiro segmento</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> ## x1: primeiro "cotovelo", mudança de taxa</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> ## b1: inclinação/taxa do segundo segmento</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> ## x2: segundo "cotovelo", mudança de taxa</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> ## b2: inclinação/taxa do terceiro segmento</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> (x0+b0*x)*(x<x1)+</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> (x0+b0*x1+b1*(x-x1))*(x>x1)*(x<x2)+</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> (x0+b0*x1+b1*(x2-x1)+b2*(x-x2))*(x>x2)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">curve(tri.lin(x, x0=0, b0=1, x1=2, b1=-1, x2=4, b2=1), -1, 6)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">abline(v=c(0,2,4), lty=2)</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">x <- c(0,0,0,10,10,10,20,20,20,35,35,35)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">y <- c(7.77, 7.81, 7.81, 7.60, 7.67, 7.65, 7.60, NA, 7.66, 7.60, 7.42, 7.50)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">plot(y~x)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">curve(tri.lin(x, x0=7.8, b0=-0.017, x1=10, b1=0, x2=20, b2=-0.01), add=TRUE)</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">da <- data.frame(x=x, y=y)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">da <- da[complete.cases(da),]</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">> n0 <- nls(y~tri.lin(x, x0, b0, x1, b1, x2, b2), data=da, trace=TRUE,</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">+ start=list(x0=7.8, b0=-0.017, x1=10, b1=0.001, x2=20, b2=-0.01)) </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Erro em nlsModel(formula, mf, start, wts) : </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> matriz gradiente singular com estimativas de parâmetros iniciais</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">> </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">> tri.lin.model <- deriv3(~(x0+b0*x)*(x<x1)+</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+ (x0+b0*x1+b1*(x-x1))*(x>x1)*(x<x2)+</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">+ (x0+b0*x1+b1*(x2-x1)+b2*(x-x2))*(x>x2),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+ c("x0","b0","x1","b1","x2","b2"),</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">+ function(x, x0, b0, x1, b1, x2, b2){NULL})</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Erro em deriv3.formula(~(x0 + b0 * x) * (x < x1) + (x0 + b0 * x1 + b1 * : </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> Função '`>`' não está na tabela de derivadas</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">> </span><br>
<br>Porém, o problema da não convergência não é qualidade do chute mas a função do modelo em si. Ao usar o o operador lógico "<" (e outros) a nls() não consegue interpretar para criar a matriz gradiente. O curioso que o modelo bi-segmentado ela faz, não sei como, mas. O mais apropriado, dado que se os valores de x0, x1 e x2 fossem conhecidos isso seria um problema de modelo linear, seria escrever o modelo não linear tirando vantagem disso, dessa linearidade parcial, e usar o algorithm="plinear" na nls(). No livro MASS tem usa seção curta, embora suficiente, para entender como fazer isso. Não sei se os dados que você me mandou são reais ou não, mas entre ficar com uma trilinear (6 parâmetros) passando por 4 pontos no domínio da covariável, eu prefiro ajustar uma cúbica (pelo menos usa menos parâmetros, é contínua). Esse trilinear é ligar com segmentos as médias, e as inclinações são como se fossem contrastes entre essas médias (delta_y/delta_x). Note que trilinear requer mais parâmetros do o temos em grau de liberdade para oferecer!! Outra maneira seria usar a optim() para fazer o ajuste.<br>
<br>À disposição.<br>Walmes.<br><br clear="all"></font><span style="font-family:trebuchet ms,sans-serif">==========================================================================</span><br style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">Walmes Marques Zeviani</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W)</span><br style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">Departamento de Estatística - Universidade Federal do Paraná</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">fone: (+55) 41 3361 3573</span><br style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">VoIP: (3361 3600) 1053 1173</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">e-mail: <a href="mailto:walmes@ufpr.br" target="_blank">walmes@ufpr.br</a></span><br style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">twitter: @walmeszeviani</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">homepage: <a href="http://www.leg.ufpr.br/%7Ewalmes" target="_blank">http://www.leg.ufpr.br/~walmes</a></span><br style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">linux user number: 531218</span><br style="font-family:trebuchet ms,sans-serif"><span style="font-family:trebuchet ms,sans-serif">==========================================================================</span><br>