Estratégia para ajustar funções altamente não lineares


12

Para analisar dados de um experimento de biofísica, atualmente estou tentando fazer o ajuste de curvas com um modelo altamente não linear. A função model se parece basicamente com:

y=ax+bx1/2

Aqui, especialmente o valor de b é de grande interesse.

Uma plotagem para esta função:

Gráfico de funções

(Observe que a função de modelo é baseada em uma descrição matemática completa do sistema e parece funcionar muito bem - é apenas que ajustes automáticos são complicados).

Obviamente, a função do modelo é problemática: as estratégias de ajuste que eu tentei até agora falham devido à acentuada assíntota em x=0 , especialmente com dados barulhentos.

Meu entendimento da questão aqui é que o ajuste simples de mínimos quadrados (eu joguei com regressão linear e não linear no MATLAB; principalmente Levenberg-Marquardt) é muito sensível à assíntota vertical, porque pequenos erros em x são enormemente amplificados .

Alguém poderia me indicar uma estratégia adequada que pudesse contornar isso?

Eu tenho algum conhecimento básico de estatística, mas isso ainda é bastante limitado. Eu ficaria ansioso para aprender, se ao menos soubesse por onde começar a procurar :)

Agradeço muito pelo seu conselho!

Editar Pedindo perdão por esquecer de mencionar os erros. O único ruído significativo está em e é aditivo.x

Editar 2 Algumas informações adicionais sobre o plano de fundo desta pergunta. O gráfico acima modela o comportamento de estiramento de um polímero. Como o @whuber apontou nos comentários, você precisa de para obter um gráfico como acima.b200a

Quanto à forma como as pessoas ajustaram essa curva até esse ponto: parece que as pessoas geralmente cortam a assíntota vertical até encontrar um bom ajuste. A escolha do corte ainda é arbitrária, tornando o procedimento de ajuste não confiável e improdutível.

Editar 3 e 4 Gráfico fixo.


3
Os erros vêm em ou em y ou em ambos? De que forma você espera que o ruído entre (multiplicativo, aditivo etc.)? xy
probabilityislogic

2
@onnodb: Minha preocupação é: isso não pode questionar fundamentalmente quão robusto é o seu modelo? Não importa o encaixe estratégia que você usa não vai permanecem altamente sensível? Você pode ter uma alta confiança nessa estimativa de b ? bb
23133 curious_cat

1
Infelizmente, isso ainda não funcionará. Não há simplesmente nenhuma combinação possível de e b que vai mesmo qualitativamente reproduzir o gráfico que você desenhou. (Obviamente b é negativo. Um deve ser menor que o mínimo inclinação no gráfico, mas positiva, o que coloca-lo em um intervalo estreito. Mas quando um é nesse intervalo, ele simplesmente não é grande o suficiente para superar o enorme pico negativo em a origem introduzido pelo b x 1 / 2 prazo.) o que você tem atraído? Dados? Alguma outra função? abbaabx1/2
whuber

1
Obrigado, mas ainda está errado. Estendendo-se a tangente a este para trás gráfico de qualquer ponto em que x > 0 , irá interceptar o eixo y em ( 0 , 3 b / ( 2 x 1 / 2 ) ) . Como o pico descendente em 0 é negativo, esse intercepto em y também deve ser negativo. Mas, na sua figura, é bastante claro que a maioria dessas interceptações é positiva, chegando a 15,5(x,ax+bx1/2)x>0(0,3b/(2x1/2))0 mostra b15.5 . Assim é matematicamente impossível que uma equação como pode descrever a sua curvay=ax+bx1/2 , nem mesmo aproximadamente. No mínimo você precisa para caber algo como . y=ax+bx1/2+c
whuber

1
Antes de fazer qualquer trabalho sobre isso, queria ter certeza da afirmação da pergunta: é por isso que é importante corrigir a função. Não tenho tempo para dar uma resposta completa agora, mas gostaria de comentar que "outras pessoas" podem estar erradas - mas isso depende de mais detalhes, infelizmente. Se o seu erro é realmente aditivo , parece-me que ainda deve ser fortemente heterocedástico, pois, caso contrário, sua variação em pequenos valores de x seria realmente minúscula. O que você pode nos dizer, quantitativamente, sobre esse erro? xx
whuber

Respostas:


10

Os métodos que usaríamos para ajustar isso manualmente (ou seja, da Análise de dados exploratórios) podem funcionar notavelmente bem com esses dados.

Desejo reparameterizar ligeiramente o modelo para tornar seus parâmetros positivos:

y=axb/x.

Para um dado , vamos supor que haja um único x real que satisfaça essa equação; chame isso de f ( y ; a , b ) ou, por uma questão de brevidade, f ( y ) quando ( a , b ) forem compreendidos.yxf(y;a,b)f(y)(a,b)

Observamos uma coleção de pares ordenados onde x i se desvia de f ( y i ; a , b ) por variáveis ​​aleatórias independentes com média zero. Nesta discussão, assumirei que todos eles têm uma variação comum, mas uma extensão desses resultados (usando mínimos quadrados ponderados) é possível, óbvia e fácil de implementar. Aqui está um exemplo simulado de uma coleção de 100 valores, com a = 0,0001 , b = 0,1 e uma variação comum de 2(xi,yi)xif(yi;a,b)100a=0.0001b=0.1 .σ2=4

Data plot

Este é um (deliberadamente) resistente exemplo, como pode ser apreciado pelo não-físico (negativo) valores e a sua propagação extraordinário (que é tipicamente de ± 2 horizontais unidades, mas pode variar até 5 ou 6 no x eixo). Se pudermos obter um ajuste razoável a estes dados que vem em qualquer lugar perto de estimar a um , b , e σ 2 usado, teremos feito bem.x±2 56xabσ2

Um ajuste exploratório é iterativo. Cada etapa consiste de dois passos: estimar (com base nas estimativas de dados e anteriores um e b de um e b , a partir do qual os valores previstos anteriores x i pode ser obtida para o x i ) e, em seguida, estimar b . Como os erros estão em x , os ajustes estimam x i a partir de ( y i ) , e não o contrário. Para a primeira ordem dos erros em x , quando xaa^b^abx^ixibxi(yi)xx é suficientemente grande,

xi1a(yi+b^x^i).

Portanto, podemos atualizar a ajustando este modelo por mínimos quadrados (aviso de que tem apenas um parâmetro - uma ladeira, a --e não de interceptação) e tomando o inverso do coeficiente de como a estimativa atualizada de um .a^aa

Em seguida, quando é suficientemente pequeno, o termo quadrático inverso domina e encontramos (novamente na primeira ordem nos erros) quex

xib212a^b^x^3/2yi2.

Mais uma vez usando mínimos quadrados (com apenas um termo de inclinação ) obtemos uma atualizadas estimativa bbb^ através da raiz quadrada do inclinação equipada.

Para ver por que isso funciona, uma aproximação exploratória grosseira a esse ajuste pode ser obtida plotando contra 1 / y 2 i para o menor x i . Melhor ainda, porque o x i são medidos com erro eo y i mudar monotonamente com o x i , devemos concentrar-nos os dados com os maiores valores de 1 / y 2 i . Aqui está um exemplo de nosso conjunto de dados simulados, mostrando a maior metade do y ixi1/yi2xixiyixi1/yi2yi em vermelho, a menor metade em azul e uma linha através da origem ajustada aos pontos vermelhos.

Figure

Os pontos se alinham aproximadamente, embora exista um pouco de curvatura nos pequenos valores de e y . (Observe a escolha dos eixos: como x é a medida, é convencional plotá-la no eixo vertical .) Ao focar o ajuste nos pontos vermelhos, onde a curvatura deve ser mínima, devemos obter uma estimativa razoável de b . O valor de 0,096 mostrado no título é a raiz quadrada da inclinação desta linha: é apenas 4 % menor que o valor real!xyxb0.0964

Nesse ponto, os valores previstos podem ser atualizados via

x^i=f(yi;a^,b^).

Itere até que as estimativas estabilizem (o que não é garantido) ou alternem entre pequenos intervalos de valores (que ainda não podem ser garantidos).

Acontece que é difícil de estimar, a menos que tenhamos um bom conjunto de valores muito grandes de x , mas que b --que determina a assíntota vertical no gráfico original (na pergunta) e é o foco da pergunta-- pode ser fixado com muita precisão, desde que existam alguns dados na assíntota vertical. No nosso exemplo de execução, as iterações fazer convergir para um = 0.000196 (que é quase o dobro do valor correcto de 0,0001 ) e b = 0,1073 (que é próximo do valor correto de 0.1axba^=0.0001960.0001b^=0.10730.1) Este gráfico mostra os dados mais uma vez, sobre os quais se sobrepõem (a) a curva real em cinza (tracejada) e (b) a curva estimada em vermelho (sólido):

Fits

Esse ajuste é tão bom que é difícil distinguir a curva verdadeira da curva ajustada: elas se sobrepõem quase em todos os lugares. Aliás, a variação estimada de erro de está muito próxima do valor real de 43.734 .

Existem alguns problemas com essa abordagem:

  • As estimativas são tendenciosas. O viés se torna aparente quando o conjunto de dados é pequeno e relativamente poucos valores estão próximos do eixo x. O ajuste é sistematicamente um pouco baixo.

  • O procedimento de estimativa requer um método para diferenciar valores "grandes" de "pequenos" de . Eu poderia propor maneiras exploratórias para identificar definições ótimas, mas como uma questão prática, você pode deixá-las como constantes de "ajuste" e alterá-las para verificar a sensibilidade dos resultados. I se defini-los arbitrariamente dividindo os dados em três grupos iguais de acordo com o valor de y i e utilizando os dois grupos exteriores.yiyi

  • O procedimento não irá funcionar para todas as combinações possíveis de e b ou todas as gamas possíveis de dados. No entanto, deve funcionar bem sempre que uma curva suficiente estiver representada no conjunto de dados para refletir as duas assíntotas: a vertical em uma extremidade e a inclinada na outra extremidade.ab


Código

O seguinte está escrito em Mathematica .

estimate[{a_, b_, xHat_}, {x_, y_}] := 
  Module[{n = Length[x], k0, k1, yLarge, xLarge, xHatLarge, ySmall, 
    xSmall, xHatSmall, a1, b1, xHat1, u, fr},
   fr[y_, {a_, b_}] := Root[-b^2 + y^2 #1 - 2 a y #1^2 + a^2 #1^3 &, 1];
   k0 = Floor[1 n/3]; k1 = Ceiling[2 n/3];(* The tuning constants *)
   yLarge = y[[k1 + 1 ;;]]; xLarge = x[[k1 + 1 ;;]]; xHatLarge = xHat[[k1 + 1 ;;]];
   ySmall = y[[;; k0]]; xSmall = x[[;; k0]]; xHatSmall = xHat[[;; k0]];
   a1 = 1/
     Last[LinearModelFit[{yLarge + b/Sqrt[xHatLarge], 
          xLarge}\[Transpose], u, u]["BestFitParameters"]];
   b1 = Sqrt[
     Last[LinearModelFit[{(1 - 2 a1 b  xHatSmall^(3/2)) / ySmall^2, 
          xSmall}\[Transpose], u, u]["BestFitParameters"]]];
   xHat1 = fr[#, {a1, b1}] & /@ y;
   {a1, b1, xHat1}
   ];

Aplique isso aos dados (dados por vetores paralelos xe yformados em uma matriz de duas colunas data = {x,y}) até a convergência, começando com estimativas de :a=b=0

{a, b, xHat} = NestWhile[estimate[##, data] &, {0, 0, data[[1]]}, 
                Norm[Most[#1] - Most[#2]] >= 0.001 &,  2, 100]

3
Esta é uma resposta incrível; Sou muito grato! Eu tenho brincado com isso, e os resultados parecem muito promissores. No entanto, vou precisar de um pouco mais de tempo para entender completamente o raciocínio :) Além disso: posso entrar em contato com você pelo seu site para uma pergunta adicional (privada), sobre agradecimentos?
onnodb

3

Veja as perguntas importantes postadas por @probabilityislogic

Se você tiver apenas erros em y, e eles forem aditivos e você tiver variação constante (ou seja, suas suposições se ajustam ao que parece), então se você deixar , que poderia talvez tentar um ajuste linear ponderada dosy*emx*=x 3 / 2 , em que os pesos irá então ser proporcional a1/xy=yxyx=x3/21/x ... (e sim, isso pode ser simplesmente mudando o problema ao redor, assim ainda pode ser problemático - mas você deve pelo menos achar mais fácil se regularizar com essa transformação do problema).

Observe que, com esta manipulação, seu b se torna o intercepto da nova equação

Se suas variações já não são constantes ou seus erros não são aditivos ou você possui erros no x , isso mudará as coisas.

-

Edite para considerar as informações adicionais:

Chegamos a um modelo da forma: y=b+ax

Agora temos que os erros estão em xe aditivos. Ainda não sabemos se a variação é constante nessa escala.

Reescreva como x=y/ab/a=my+c

Deixe , onde este termo de erro pode ser heterocedásticos (se o original x tem propagação constante, será heterocedásticos, mas de forma conhecida)xo=x+ηx

(onde o em x o significa 'observado')oxo

Então onde ε = - ζ parece bom, mas agora já correlacionou erros no x e y variáveis; portanto, é um modelo linear de erros nas variáveis, com heterocedasticidade e forma conhecida de dependência nos erros. xo=c+my+ϵϵ=ζxy

Não tenho certeza de que isso melhore as coisas! Acredito que existem métodos para esse tipo de coisa, mas não é realmente minha área.

Mencionei nos comentários que você gostaria de analisar a regressão inversa, mas a forma específica de sua função pode impedir que isso aconteça.

Você pode até ficar preso em tentar métodos bastante robustos para erros em x nessa forma linear.

-

Agora, uma grande pergunta: se os erros estão em x , como diabos você estava se ajustando ao modelo não-linear? Você estava apenas minimizando cegamente a soma dos erros ao quadrado em ? Esse pode ser o seu problema.y

Suponho que alguém possa tentar reescrever a coisa original como um modelo com erros no tentar otimizar o ajuste, mas não tenho certeza se vejo como configurá-la corretamente.x


x

2
" mesmo que os erros estejam em x " - caramba, isso é meio importante. Você pode querer verificar a regressão inversa.
Glen_b -Reinstala Monica 13/03

3
x=13(2ya+21/3y2(27a4b22a3y3+3327a8b44a7b2y3)1/3+(27a4b22a3y3+3327a8b44a7b2y3)1/321/3a2) :-).
whuber

@whuber Hmm. Solving for the cubic, clever. If we write the original in terms of xo where xo is x+ζ, this would leave us with x=(thatmonster)+ϵ, (again with ϵ=ζ) which at least notionally can be done with nonlinear least squares. So that looks like it takes care of the error propagation properly. It might actually work if the OP was to use the linear form I was playing with (using some robust-to-errors-in-the-IV-and-hetero estimation) to get good starting values for the parameters and then try to use this nonlinear LS form to polish it.
Glen_b -Reinstate Monica

I believe linearizing the function x(y) and (ironically) applying nonlinear (weighted) least squares would work, especially if the data were restricted to relatively small values of y where the curve is primarily determined by b.
whuber

0

After some more weeks of experimenting, a different technique seems to work the best in this particular case: Total Least Squares fitting. It's a variant of the usual (nonlinear) Least Squares fitting, but instead of measuring fit errors along just one of the axes (which causes problems in highly nonlinear cases such as this one), it takes both axes into account.

There's a plethora of articles, tutorials and books avaiable on the subject, although the nonlinear case is more elusive. There's even some MATLAB code available.


Thanks for sharing this. I accept that it it might produce good-looking results in your case, but I have two concerns. The first you mention: how exactly does one apply total least squares/errors-in-variables regression/orthogonal regression/Deming regression to nonlinear fits? The second is that this approach does not seem appropriate for your data, in which y is measured essentially without error. When that's the case, you should not be allowing for residuals in the y variable and doing so ought to produce unreliable, biased results.
whuber

@whuber Thanks for expressing your concerns! Right now, I'm still working on running simulations to probe the reliability of TLS fitting for this problem. What I've seen thus far, though, is that TLS' consideration of both variables helps greatly in overcoming the high non-linearity of the model. Fits of simulated data are reliable and converge very well. More work needs to be done though, and I'll definitely have to stack your method up to this one, once we have more actual data available --- and look in detail into your concerns.
onnodb

OK--don't forget I have comparable concerns about the method I proposed!
whuber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.