Embora eu tenha lido este post, ainda não tenho idéia de como aplicar isso aos meus próprios dados e espero que alguém possa me ajudar.
Eu tenho os seguintes dados:
y <- c(11.622967, 12.006081, 11.760928, 12.246830, 12.052126, 12.346154, 12.039262, 12.362163, 12.009269, 11.260743, 10.950483, 10.522091, 9.346292, 7.014578, 6.981853, 7.197708, 7.035624, 6.785289, 7.134426, 8.338514, 8.723832, 10.276473, 10.602792, 11.031908, 11.364901, 11.687638, 11.947783, 12.228909, 11.918379, 12.343574, 12.046851, 12.316508, 12.147746, 12.136446, 11.744371, 8.317413, 8.790837, 10.139807, 7.019035, 7.541484, 7.199672, 9.090377, 7.532161, 8.156842, 9.329572, 9.991522, 10.036448, 10.797905)
t <- 18:65
E agora eu simplesmente quero encaixar uma onda senoidal
com as quatro incógnitas , Q , & Phi e a ele.
O restante do meu código é o seguinte
res <- nls(y ~ A*sin(omega*t+phi)+C, data=data.frame(t,y), start=list(A=1,omega=1,phi=1,C=1))
co <- coef(res)
fit <- function(x, a, b, c, d) {a*sin(b*x+c)+d}
# Plot result
plot(x=t, y=y)
curve(fit(x, a=co["A"], b=co["omega"], c=co["phi"], d=co["C"]), add=TRUE ,lwd=2, col="steelblue")
Mas o resultado é realmente ruim.
Eu apreciaria muito qualquer ajuda.
Felicidades.
r
regression
fitting
Pascal
fonte
fonte
Respostas:
Se você deseja apenas uma boa estimativa de e não se importa muito com o erro padrão:ω
(Um ajuste melhor ainda talvez explique de alguma forma os valores extremos dessa série, reduzindo sua influência.)
---
Se você quiser ter uma idéia da incerteza em , use a probabilidade do perfil ( pdf1 , pdf2 - referências sobre como obter CIs ou SEs aproximados da probabilidade do perfil ou suas variantes não são difíceis de localizar)ω
(Como alternativa, você pode alimentar essas estimativas em nls ... e iniciá-las já convergidas.)
fonte
lm(y~sin(2*pi*t)+cos(2*pi*t)
mas isso não funcionou (ocos
termo sempre foi 1). Apenas por curiosidade: o que as duas primeiras linhas fazem (eu sei quespectrum
estima a densidade espectral)?2*pi*t
spec
no TSA pode ser melhor (parece ter mais opções, uma das quais pode ser importante às vezes), mas nesse caso o pico principal estava exatamente no mesmo lugar que com ospectrum
que eu não me incomodei.reslm
parareslm <- lm(y ~ cos(2*pi/per*t)+tan(2*pi/per*t))
mas isso não parece certo. alguma dica?Quando eu colocar isso em
nls
'sstart
lista, eu tenho uma curva que era muito mais razoável, embora ainda tenha alguns desvios sistemáticos.Dependendo do seu objetivo com esse conjunto de dados, você pode tentar melhorar o ajuste adicionando termos adicionais ou usando uma abordagem não paramétrica como um processo gaussiano com um kernel periódico.
Escolhendo um valor inicial automaticamente
Se você deseja escolher a frequência dominante, pode usar uma transformada rápida de Fourier (FFT). Isso está fora da minha área de especialização, então deixarei que outras pessoas preencham os detalhes, se quiserem (especialmente as etapas 2 e 3), mas o
R
código abaixo deve funcionar.Você também pode plotar
abs(truncated.fft)
para ver se há outras frequências importantes, mas precisará mexer um pouco na escala do eixo x.Além disso, acredito que @Glen_b está correto que o problema é convexo depois que você conhece ômega (ou talvez você precise conhecer phi também? Não tenho certeza). De qualquer forma, conhecer os valores iniciais dos outros parâmetros não deve ser tão importante quanto o ômega se eles estiverem no estádio certo. Você provavelmente poderia obter estimativas decentes dos outros parâmetros da FFT, mas não tenho certeza de como isso funcionaria.
fonte
foo.bar
. Isso ocorre devido ao modo como R especifica métodos para classes .Como alternativa ao que já foi dito, pode ser interessante notar que um modelo AR (2) da classe de modelos ARIMA pode ser usado para gerar previsões com um padrão de ondas senoidais.
Panratz (1991) nos diz o seguinte sobre ciclos estocásticos:
Para verificar se esse modelo poderia ser ajustado aos dados, usei o
auto.arima()
função do pacote de previsão para descobrir se sugeriria um modelo AR (2). Acontece que aauto.arima()
função sugere um modelo ARMA (2,2); não é um modelo de AR (2) puro, mas tudo bem. Tudo bem porque um modelo ARMA (2,2) contém um componente AR (2), portanto, a mesma regra (sobre ciclos estocásticos) se aplica. Ou seja, ainda podemos verificar a condição mencionada acima para ver se serão produzidas previsões de ondas senoidais.Os resultados de
auto.arima(y)
são mostrados abaixo.O gráfico abaixo mostra a série original, y, o ajuste do modelo ARMA (2,2) e 14 previsões fora da amostra. Como pode ser visto, as previsões fora da amostra seguem um padrão de onda senoidal.
Lembre-se de duas coisas. 1) Esta é apenas uma análise muito rápida (usando uma ferramenta automatizada) e um tratamento adequado envolveria seguir a metodologia de Box-Jenkins. 2) As previsões do ARIMA são boas para previsões de curto prazo; portanto, você pode achar que as previsões de longo prazo dos modelos nas respostas de @David J. Harris e @Glen_b são mais confiáveis.
Por fim, espero que este seja um bom complemento para algumas respostas já muito informativas.
Referência : Previsão com modelos de regressão dinâmica: Alan Pankratz, 1991, (John Wiley and Sons, Nova York), ISBN 0-471-61528-5
fonte
Os métodos atuais para ajustar uma curva sin a um determinado conjunto de dados requerem uma primeira estimativa dos parâmetros, seguidos por um processo interativo. Este é um problema de regressão não linear. Um método diferente consiste em transformar a regressão não linear em regressão linear, graças a uma equação integral conveniente. Então, não há necessidade de estimativa inicial nem processo iterativo: o encaixe é obtido diretamente. No caso da função y = a + r * sin (w * x + phi) ou y = a + b * sin (w * x) + c * cos (w * x), consulte as páginas 35-36 do artigo "Régression sinusoidale" publicado no Scribd: http://www.scribd.com/JJacquelin/documents No caso da função y = a + p * x + r * sin (w * x + phi): páginas 49-51 do capítulo "Regressões lineares e sinusoidais mistas". No caso de funções mais complicadas, o processo geral é explicado no capítulo "Regressão sinusoidal generalizada", páginas 54-61, seguido de um exemplo numérico y = r * sin (w * x + phi) + (b / x) + c * ln (x), páginas 62-63
fonte
Se você conhece o ponto mais alto e mais baixo dos seus dados de aparência cosseno, pode usar esta função simples para calcular todos os coeficientes de cosseno:
Abaixo, é usado para simular a variação de temperatura ao longo do dia com uma função cosseno, inserindo as horas e os valores de temperatura para a hora mais baixa e mais quente:
A saída está abaixo:
fonte
Outra opção é usar a função genérica optim ou nls. Eu tentei ambos nenhum deles é completamente robusto
As seguintes funções pegam os dados em y e calculam os parâmetros.
o uso é o seguinte:
O código a seguir compara os dados
fonte