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=ax−b/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
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,
xi≈1a(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
xi≈b21−2a^b^x^3/2y2i.
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/y2ixixiyixi1/y2iyi em vermelho, a menor metade em azul e uma linha através da origem ajustada aos pontos vermelhos.
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):
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 x
e y
formados 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]