Eu tenho dados que tem a forma . Para a estimativa deβ1aβ3, utilizo as fórmulas deste artigo:John Fox - Regressão não linear e mínimos quadrados não lineares Neste artigo, oβ1é estimado observando os dados. Se eu fizer isso, funciona bem, mesmo que eu tenha apenas três pontos. A partir disso, eu posso calcular os outros dois. Testei meus parâmetros com nls () em R e LevenbergMarquardt em C #. Os modelos retornados por eles são satisfatórios.
O problema é que eu não quero olhar para os dados para obter um bom estimador para , quero que meu programa calcule. Por algum tempo eu costumava valores que eram um pouco maior do que o máximo dos meus valores (algo entre max * 1.1 e max * 1.5 . Isto funcionou bem, desde que os pontos cobria a maior parte da função. Ele também trabalhou muito bem se os pontos de dados estavam em algum lugar do "topo" da curva, mas quando todos vieram da área "abaixo" do ponto de inflexão, esse estimador estava definitivamente mais baixo do que deveria e não consegui encaixar no modelo. Definitivamente mais alto que o ponto máximo (multiplicando-o por valores ridiculamente altos), o modelo não se encaixa de maneira útil.
As medições podem ficar assim:
x = (40, 50, 60, 70), y = (1000, 950, 400, 200) -> fácil de estimar
x = (40, 50, 60, 70), y = (1000, 950, 800, 100) -> fácil de estimar
x = (40, 50, 60, 70), y = (500, 200, 100, 50) -> não é tão fácil de estimar
Acho que poderia descobrir onde estou na função (no "fundo", no "topo", na inclinação) calculando os deltas nos pontos indicados e calculando um limite superior, dependendo disso. Alguém tem uma dica para uma solução melhor? Informações adicionais: se não puder ser feito, é mais importante para mim que as medidas que podem ser ajustadas sejam as melhores possíveis e eu aceito que algumas medidas não sejam adequadas.
(embora eu queira uma implementação em C #, eu a publiquei aqui, acho que o problema não depende do idioma)
atualização (aplicação deste):
x são valores de temperatura e as medidas correspondentes. Por natureza, é dado que deve parecer uma curva logística com valores y mais altos em temperaturas mais baixas e vice-versa. O ponto de fusão é igual ao ponto de inflexão da curva, que muda muito com pequenas alterações nos parâmetros do modelo.
update (alguns dados compostos com 7 pontos de dados e ponto de inflexão conhecido em 60):
//first I made up some data without any noise and enough (13) points
double[] x17 = { 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90 };
double[] y17 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 59.642....
//Then I took three different parts of that data
(to simulate how much data I will have in the real world)
double[] x18 = { 30, 35, 40, 45, 50, 55, 60 };
double[] y18 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000 };
//calculated inflection point: 59.263.... is ok!
double[] x19 = { 60, 65, 70, 75, 80, 85, 90 };
double[] y19 = { 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 53.447.... to small!
double[] x20 = { 45, 50, 55, 60, 65, 70, 75 };
double[] y20 = { 1700, 1500, 1280, 1000, 720, 500, 300 };
//calculated inflection point: 59.868... almost perfect!
Minha abordagem atual para uma estimativa do limite superior é y0 * y0 / y1. Dessa forma, espero levar em consideração que nem sempre posso ter um valor próximo ao máximo.
atualização: os valores xey nunca serão negativos. x sempre será {40, 45, 50, 55, 60, 65, 70}, a menos que um ponto de dados seja perdido.
update: fiz muitos, muitos testes com dados simulados que deveriam ser fáceis de ajustar (escolho pontos de dados que estavam exatamente na curva = sem ruído) e vejo que funciona bem, a menos que o primeiro ou o segundo ponto de dados (onde x = 40 ou x = 45) está ausente. Acho que vou ter que descartar essas medidas e o usuário terá que conviver com isso.