Aunque leí esta publicación, todavía no tengo idea de cómo aplicar esto a mis propios datos y espero que alguien pueda ayudarme.
Tengo los siguientes datos:
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
Y ahora simplemente quiero ajustar una onda sinusoidal
con las cuatro incógnitas , \ omega , \ phi y C a la misma.
El resto del aspecto de mi código es el siguiente
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")
Pero el resultado es realmente pobre.
Agradecería mucho cualquier ayuda.
Aclamaciones.
r
regression
fitting
Pascal
fuente
fuente
Respuestas:
Si solo desea una buena estimación de y no le importa mucho su error estándar:ω
(Un mejor ajuste aún podría explicar los valores atípicos en esa serie de alguna manera, reduciendo su influencia).
---
Si desea tener una idea de la incertidumbre en , puede utilizar la probabilidad de perfil ( pdf1 , pdf2 : referencias sobre cómo obtener CI o SE aproximados de la probabilidad de perfil o sus variantes no son difíciles de localizar)ω
(Alternativamente, puede alimentar estas estimaciones en nls ... y comenzar ya convergido).
fuente
lm(y~sin(2*pi*t)+cos(2*pi*t)
pero esto no funcionó (elcos
término siempre fue 1). Solo por curiosidad: ¿qué hacen las dos primeras líneas (sé quespectrum
estima la densidad espectral)?2*pi*t
spec
en TSA puede ser mejor (parece tener más opciones, una de las cuales puede ser importante a veces), pero en este caso el pico principal estaba exactamente en el mismo lugar que con,spectrum
así que no me molesté.reslm
areslm <- lm(y ~ cos(2*pi/per*t)+tan(2*pi/per*t))
, pero que no se ven bien. alguna pista?Cuando puse eso en
nls
lastart
lista, obtuve una curva que era mucho más razonable, aunque todavía tiene algunos sesgos sistemáticos.Dependiendo de cuál sea su objetivo con este conjunto de datos, podría intentar mejorar el ajuste agregando términos adicionales o utilizando un enfoque no paramétrico como un proceso gaussiano con un núcleo periódico.
Elegir un valor inicial automáticamente
Si desea elegir la frecuencia dominante, puede usar una transformación rápida de Fourier (FFT). Esto está fuera de mi área de especialización, por lo que dejaré que otras personas completen los detalles si lo desean (especialmente sobre los pasos 2 y 3), pero el
R
código a continuación debería funcionar.También puede trazar
abs(truncated.fft)
para ver si hay otras frecuencias importantes, pero tendrá que jugar un poco con la escala del eje x.Además, creo que @Glen_b tiene razón en que el problema es convexo una vez que conoce omega (¿o tal vez también necesita saber phi? No estoy seguro). En cualquier caso, conocer los valores iniciales para los otros parámetros no debería ser tan importante como para omega si están en el estadio correcto. Probablemente podría obtener estimaciones decentes de los otros parámetros de la FFT, pero no estoy seguro de cómo funcionaría.
fuente
foo.bar
. Esto se debe a cómo R especifica los métodos para las clases .Como alternativa a lo que ya se ha dicho, vale la pena señalar que un modelo AR (2) de la clase de modelos ARIMA se puede utilizar para generar pronósticos con un patrón de onda sinusoidal.
Panratz (1991) nos cuenta lo siguiente sobre los ciclos estocásticos:
Para ver si tal modelo podría ajustarse a los datos, utilicé la
auto.arima()
función del paquete de pronóstico para averiguar si sugeriría un modelo AR (2). Resulta que laauto.arima()
función sugiere un modelo ARMA (2,2); no es un modelo AR (2) puro, pero esto está bien. Está bien porque un modelo ARMA (2,2) contiene un componente AR (2), por lo que se aplica la misma regla (sobre ciclos estocásticos). Es decir, todavía podemos verificar la condición antes mencionada para ver si se producirán pronósticos de onda sinusoidal.Los resultados de
auto.arima(y)
se muestran a continuación.La siguiente gráfica muestra la serie original, y, el ajuste del modelo ARMA (2,2) y 14 pronósticos fuera de muestra. Como se puede ver, los pronósticos fuera de muestra siguen un patrón de onda sinusoidal.
Ten en cuenta dos cosas. 1) Este es solo un análisis muy rápido (usando una herramienta automatizada) y un tratamiento adecuado implicaría seguir la metodología de Box-Jenkins. 2) Los pronósticos ARIMA son buenos para el pronóstico a corto plazo, por lo que puede encontrar que los pronósticos a largo plazo de los modelos en las respuestas de @David J. Harris y @Glen_b son más confiables.
Por último, espero que esta sea una buena adición a algunas respuestas ya muy informativas.
Referencia : predicción con modelos de regresión dinámica: Alan Pankratz, 1991, (John Wiley and Sons, Nueva York), ISBN 0-471-61528-5
fuente
Los métodos actuales para ajustar una curva sin a un conjunto de datos determinado requieren una primera aproximación de los parámetros, seguido de un proceso interactivo. Este es un problema de regresión no lineal. Un método diferente consiste en transformar la regresión no lineal en una regresión lineal gracias a una ecuación integral conveniente. Entonces, no hay necesidad de conjeturas iniciales ni de procesos iterativos: el ajuste se obtiene directamente. En el caso de la función y = a + r * sin (w * x + phi) o y = a + b * sin (w * x) + c * cos (w * x), consulte las páginas 35-36 del documento "Régression sinusoidale" publicado en Scribd: http://www.scribd.com/JJacquelin/documents En el caso de la función y = a + p * x + r * sin (w * x + phi): páginas 49-51 del capítulo "Regresiones lineales y sinusoidales mixtas". En el caso de funciones más complicadas, el proceso general se explica en el capítulo "Regresión sinusoidal generalizada" páginas 54-61, seguido de un ejemplo numérico y = r * sin (w * x + phi) + (b / x) + c * ln (x), páginas 62-63
fuente
Si conoce el punto más bajo y más alto de sus datos de aspecto coseno, puede usar esta función simple para calcular todos los coeficientes coseno:
A continuación se utiliza para simular la variación de temperatura a lo largo del día con una función coseno, ingresando las horas y los valores de temperatura para la hora más baja y más cálida:
La salida está abajo:
fuente
Otra opción es utilizar la función genérica optim o nls. He intentado ambos ninguno de ellos es completamente robusto
Las siguientes funciones toman los datos en y y calculan los parámetros.
El uso es el siguiente:
El siguiente código compara los datos.
fuente