Metodología Utilizada : Medición de la Performance Logística
Una de las cosas interesantes de uso del la Simulación de Sistemas de Manu- factura es la posibilidad de hacer Inteligencia de Negocios (BI por sus siglas en ingles – Business Intelligence) por la enorme cantidad de datos que nos genera. Este campo de la BI, requiere un dominio de técnicas como Machine Learning, Identificación de Patrones, operación de BigData o Minerı́a de Datos que en general dominan los expertos en informática, pero que cada dı́a son más acce- sibles a otros profesionales. Si bien serı́a posible poder hacer esto en excel, las limitaciones que tiene la hoja de cálculo nos imedirı́an trabajar con el volumen de datos que la simulación aportarı́a. Se quiere hacer notar que si bien no es imposible hacer el trabajo con hoja de cáculo, serı́a mejor utilizarla para apren- der y resignarse a trabajar con pocos datos. En esta serie de ejercicios, además de familiarizarnos con el lenguaje R-Cran que SI puede operar en entornos de BIGDATA, trataremos de ver como podemos valernos de las bondades del en- torno de trabajo y aprender de un sólo paso con las herramientas que se utilizan en la vida real. Hasta ahora tenemos claro temas referidos a los conceptos de Simulación, Modelo, Inferencia , y hemos insinuado algo sobre las estructuras y métodos de ajustes del modelo o del concepto de ingenierı́a inversa. Utilizaremos unas bases de datos ficticias (cualquier semejanza con la reali- dad es pura coincidencia). En ella se ha realizado un estudio sobre varias empresas que son contratistas o proveedores de servicios de alto valor agregado de grandes compañı́as manu- factureras. Se ha indagado el desempeño de unos 150 contratistas según cuadro dimensiones o indicadores. Comenzaremos estos ejercicios cargando los datos externos, que incluso po- drı́an venir de una hoja de cálculo.
Carga de datos desde archivos externos Si bien serı́a posible cargar datos a mano en R-CRAN, no serı́a práctico hacer lo ası́. Todos los datos que se utilizan en este entorno de trabajo se manejan
internamente como matrices. Estas matrices de datos (semejantes a bases de datos) se llaman data-frames. Un data frame podrı́a ser una matriz de una fila por una columna ası́ por ejemplo
Tanto X,Y y Z aparecen como variables, pero R-CRAN los trata como ma- trices de 1x1. Intente carga dos dataframes a y b con valores numéricos y realizamos la suma de ambos como se muestra en el código. Esto nos permitirı́a usar R-CRAN como si se tratase de una calculadora.
¿Desde dónde podemos cargar datos? Uno de los requisitos para poder cargar datos es que sepamos en que carpeta estamos trabajando. En este ejercicio veremos como hacer para saber donde estamos parados.
[1] "/media/rpalma/OS/AAA_Datos/2022/Posgrado/UCB/Apunte/Seleccion de proveedores"
Se puede cambiar la carpeta de trabajo con
setwd("C:/Apuntes")
Puedes cambiar tu carpeta (directorio) de trabajo con el comando setwd() Debes poner entre comillas lo que va dentro del paréntesis Prepare un archivo en excel y guardelo con formato csv ”comma separated values” para capturarlo desde R-CRAN. Asegúrate de usar punto ”.” para indicar fracciones y coma para separar los campos o columnas de la tabla.
Tarea: Crea una carpeta para tus datasets y descarga la base de proveedores desde https://themys.sid.uncu.edu.ar/r-cran/
Ejemplos
Con los siguientes comando importaremos una planilla generada con una hoja de cálculo que contiene las 150 respuestas de las encuestas que se realizaron
# Si aún no has cargado una biblioteca recuerda ejecutar
# install.packages("readr") o utiliza el menú de R-Studio
library(readr)
BSC_proveedores <- read_csv("~/BSC_proveedores.csv")
BSC_proveedores [c(1:5 ,70:73, 126:129) , ]| …1 | Tecnologia | Normas | Capital | Equipo | Empresa |
|---|---|---|---|---|---|
| 1 | 5.1 | 3.5 | 1.4 | 0.2 | Tenaris |
| 2 | 4.9 | 3.0 | 1.4 | 0.2 | Tenaris |
| 3 | 4.7 | 3.2 | 1.3 | 0.2 | Tenaris |
| 4 | 4.6 | 3.1 | 1.5 | 0.2 | Tenaris |
| 5 | 5.0 | 3.6 | 1.4 | 0.2 | Tenaris |
| 70 | 5.6 | 2.5 | 3.9 | 1.1 | Tenova |
| 71 | 5.9 | 3.2 | 4.8 | 1.8 | Tenova |
| 72 | 6.1 | 2.8 | 4.0 | 1.3 | Tenova |
| 73 | 6.3 | 2.5 | 4.9 | 1.5 | Tenova |
| 126 | 7.2 | 3.2 | 6.0 | 1.8 | Ternium |
| 127 | 6.2 | 2.8 | 4.8 | 1.8 | Ternium |
| 128 | 6.1 | 3.0 | 4.9 | 1.8 | Ternium |
| 129 | 6.4 | 2.8 | 5.6 | 2.1 | Ternium |
La biblioteca readr permite importar datos de excel en r-cran Podemos ver el contenido del dataframe BSC Proveedores que se llama igual que el archivo de texto separado por comas. Para ello ejecutamos el siguiente comando.
Si quisiésemos ver el desempeño respecto a la variable TECNNOLOGIA tendríamos que interponer entre el nombre del dataset el signo pesos y luego el nombre de la columna
BSC_proveedores$Tecnologia [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
[20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
[39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
[58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4
[ reached getOption("max.print") -- omitted 75 entries ]
Repita todo el proceso con el resto de la dimensiones NORMA, CAPITAL, EQUIPO, EMPRESA.
Veremos como se comportan las muestras (contratistar) utilizando el histograma
hist(BSC_proveedores$Tecnologia)El gráfico nos muestra que hay dos grupos de contratistas (casi 29 ocurrencias en cada uno) con un desempeño de 6 en la variable TECNOLOGÍA . La escala original era de 1 a 10. Utilizaremos el comando par() que permite dividir el área de ploteo en una matriz especificada por el comando Numero de Columna (nmfrow) Haga las interpretaciones de estos gráficos.
par(mfrow=c(2,2))
hist(BSC_proveedores$Tecnologia)
hist(BSC_proveedores$Normas)
hist(BSC_proveedores$Capital)
hist(BSC_proveedores$Equipo)Algunas personas prefieren utilizar la envolvente del histograma que es el gráfico de densidad
par(mfrow=c(1,1))
plot(density(BSC_proveedores$Equipo))Gráficos 4x4 de Densidad
par(mfrow=c(2,2))
plot(density(BSC_proveedores$Tecnologia))
plot(density(BSC_proveedores$Normas))
plot(density(BSC_proveedores$Capital))
plot(density(BSC_proveedores$Equipo))Gráficas Ralas
library(car)
BSC_Rawdata <- BSC_proveedores[ ,c(2,3,4,5)]
BSC_Rawdata| Tecnologia | Normas | Capital | Equipo |
|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 |
| 4.9 | 3.0 | 1.4 | 0.2 |
| 4.7 | 3.2 | 1.3 | 0.2 |
| 4.6 | 3.1 | 1.5 | 0.2 |
| 5.0 | 3.6 | 1.4 | 0.2 |
| 5.4 | 3.9 | 1.7 | 0.4 |
| 4.6 | 3.4 | 1.4 | 0.3 |
| 5.0 | 3.4 | 1.5 | 0.2 |
| 4.4 | 2.9 | 1.4 | 0.2 |
| 4.9 | 3.1 | 1.5 | 0.1 |
| 5.4 | 3.7 | 1.5 | 0.2 |
| 4.8 | 3.4 | 1.6 | 0.2 |
| 4.8 | 3.0 | 1.4 | 0.1 |
| 4.3 | 3.0 | 1.1 | 0.1 |
| 5.8 | 4.0 | 1.2 | 0.2 |
| 5.7 | 4.4 | 1.5 | 0.4 |
| 5.4 | 3.9 | 1.3 | 0.4 |
| 5.1 | 3.5 | 1.4 | 0.3 |
| 5.7 | 3.8 | 1.7 | 0.3 |
| 5.1 | 3.8 | 1.5 | 0.3 |
| 5.4 | 3.4 | 1.7 | 0.2 |
| 5.1 | 3.7 | 1.5 | 0.4 |
| 4.6 | 3.6 | 1.0 | 0.2 |
| 5.1 | 3.3 | 1.7 | 0.5 |
| 4.8 | 3.4 | 1.9 | 0.2 |
| 5.0 | 3.0 | 1.6 | 0.2 |
| 5.0 | 3.4 | 1.6 | 0.4 |
| 5.2 | 3.5 | 1.5 | 0.2 |
| 5.2 | 3.4 | 1.4 | 0.2 |
| 4.7 | 3.2 | 1.6 | 0.2 |
| 4.8 | 3.1 | 1.6 | 0.2 |
| 5.4 | 3.4 | 1.5 | 0.4 |
| 5.2 | 4.1 | 1.5 | 0.1 |
| 5.5 | 4.2 | 1.4 | 0.2 |
| 4.9 | 3.1 | 1.5 | 0.2 |
| 5.0 | 3.2 | 1.2 | 0.2 |
| 5.5 | 3.5 | 1.3 | 0.2 |
| 4.9 | 3.6 | 1.4 | 0.1 |
| 4.4 | 3.0 | 1.3 | 0.2 |
| 5.1 | 3.4 | 1.5 | 0.2 |
| 5.0 | 3.5 | 1.3 | 0.3 |
| 4.5 | 2.3 | 1.3 | 0.3 |
| 4.4 | 3.2 | 1.3 | 0.2 |
| 5.0 | 3.5 | 1.6 | 0.6 |
| 5.1 | 3.8 | 1.9 | 0.4 |
| 4.8 | 3.0 | 1.4 | 0.3 |
| 5.1 | 3.8 | 1.6 | 0.2 |
| 4.6 | 3.2 | 1.4 | 0.2 |
| 5.3 | 3.7 | 1.5 | 0.2 |
| 5.0 | 3.3 | 1.4 | 0.2 |
| 7.0 | 3.2 | 4.7 | 1.4 |
| 6.4 | 3.2 | 4.5 | 1.5 |
| 6.9 | 3.1 | 4.9 | 1.5 |
| 5.5 | 2.3 | 4.0 | 1.3 |
| 6.5 | 2.8 | 4.6 | 1.5 |
| 5.7 | 2.8 | 4.5 | 1.3 |
| 6.3 | 3.3 | 4.7 | 1.6 |
| 4.9 | 2.4 | 3.3 | 1.0 |
| 6.6 | 2.9 | 4.6 | 1.3 |
| 5.2 | 2.7 | 3.9 | 1.4 |
| 5.0 | 2.0 | 3.5 | 1.0 |
| 5.9 | 3.0 | 4.2 | 1.5 |
| 6.0 | 2.2 | 4.0 | 1.0 |
| 6.1 | 2.9 | 4.7 | 1.4 |
| 5.6 | 2.9 | 3.6 | 1.3 |
| 6.7 | 3.1 | 4.4 | 1.4 |
| 5.6 | 3.0 | 4.5 | 1.5 |
| 5.8 | 2.7 | 4.1 | 1.0 |
| 6.2 | 2.2 | 4.5 | 1.5 |
| 5.6 | 2.5 | 3.9 | 1.1 |
| 5.9 | 3.2 | 4.8 | 1.8 |
| 6.1 | 2.8 | 4.0 | 1.3 |
| 6.3 | 2.5 | 4.9 | 1.5 |
| 6.1 | 2.8 | 4.7 | 1.2 |
| 6.4 | 2.9 | 4.3 | 1.3 |
| 6.6 | 3.0 | 4.4 | 1.4 |
| 6.8 | 2.8 | 4.8 | 1.4 |
| 6.7 | 3.0 | 5.0 | 1.7 |
| 6.0 | 2.9 | 4.5 | 1.5 |
| 5.7 | 2.6 | 3.5 | 1.0 |
| 5.5 | 2.4 | 3.8 | 1.1 |
| 5.5 | 2.4 | 3.7 | 1.0 |
| 5.8 | 2.7 | 3.9 | 1.2 |
| 6.0 | 2.7 | 5.1 | 1.6 |
| 5.4 | 3.0 | 4.5 | 1.5 |
| 6.0 | 3.4 | 4.5 | 1.6 |
| 6.7 | 3.1 | 4.7 | 1.5 |
| 6.3 | 2.3 | 4.4 | 1.3 |
| 5.6 | 3.0 | 4.1 | 1.3 |
| 5.5 | 2.5 | 4.0 | 1.3 |
| 5.5 | 2.6 | 4.4 | 1.2 |
| 6.1 | 3.0 | 4.6 | 1.4 |
| 5.8 | 2.6 | 4.0 | 1.2 |
| 5.0 | 2.3 | 3.3 | 1.0 |
| 5.6 | 2.7 | 4.2 | 1.3 |
| 5.7 | 3.0 | 4.2 | 1.2 |
| 5.7 | 2.9 | 4.2 | 1.3 |
| 6.2 | 2.9 | 4.3 | 1.3 |
| 5.1 | 2.5 | 3.0 | 1.1 |
| 5.7 | 2.8 | 4.1 | 1.3 |
| 6.3 | 3.3 | 6.0 | 2.5 |
| 5.8 | 2.7 | 5.1 | 1.9 |
| 7.1 | 3.0 | 5.9 | 2.1 |
| 6.3 | 2.9 | 5.6 | 1.8 |
| 6.5 | 3.0 | 5.8 | 2.2 |
| 7.6 | 3.0 | 6.6 | 2.1 |
| 4.9 | 2.5 | 4.5 | 1.7 |
| 7.3 | 2.9 | 6.3 | 1.8 |
| 6.7 | 2.5 | 5.8 | 1.8 |
| 7.2 | 3.6 | 6.1 | 2.5 |
| 6.5 | 3.2 | 5.1 | 2.0 |
| 6.4 | 2.7 | 5.3 | 1.9 |
| 6.8 | 3.0 | 5.5 | 2.1 |
| 5.7 | 2.5 | 5.0 | 2.0 |
| 5.8 | 2.8 | 5.1 | 2.4 |
| 6.4 | 3.2 | 5.3 | 2.3 |
| 6.5 | 3.0 | 5.5 | 1.8 |
| 7.7 | 3.8 | 6.7 | 2.2 |
| 7.7 | 2.6 | 6.9 | 2.3 |
| 6.0 | 2.2 | 5.0 | 1.5 |
| 6.9 | 3.2 | 5.7 | 2.3 |
| 5.6 | 2.8 | 4.9 | 2.0 |
| 7.7 | 2.8 | 6.7 | 2.0 |
| 6.3 | 2.7 | 4.9 | 1.8 |
| 6.7 | 3.3 | 5.7 | 2.1 |
| 7.2 | 3.2 | 6.0 | 1.8 |
| 6.2 | 2.8 | 4.8 | 1.8 |
| 6.1 | 3.0 | 4.9 | 1.8 |
| 6.4 | 2.8 | 5.6 | 2.1 |
| 7.2 | 3.0 | 5.8 | 1.6 |
| 7.4 | 2.8 | 6.1 | 1.9 |
| 7.9 | 3.8 | 6.4 | 2.0 |
| 6.4 | 2.8 | 5.6 | 2.2 |
| 6.3 | 2.8 | 5.1 | 1.5 |
| 6.1 | 2.6 | 5.6 | 1.4 |
| 7.7 | 3.0 | 6.1 | 2.3 |
| 6.3 | 3.4 | 5.6 | 2.4 |
| 6.4 | 3.1 | 5.5 | 1.8 |
| 6.0 | 3.0 | 4.8 | 1.8 |
| 6.9 | 3.1 | 5.4 | 2.1 |
| 6.7 | 3.1 | 5.6 | 2.4 |
| 6.9 | 3.1 | 5.1 | 2.3 |
| 5.8 | 2.7 | 5.1 | 1.9 |
| 6.8 | 3.2 | 5.9 | 2.3 |
| 6.7 | 3.3 | 5.7 | 2.5 |
| 6.7 | 3.0 | 5.2 | 2.3 |
| 6.3 | 2.5 | 5.0 | 1.9 |
| 6.5 | 3.0 | 5.2 | 2.0 |
| 6.2 | 3.4 | 5.4 | 2.3 |
| 5.9 | 3.0 | 5.1 | 1.8 |
scatterplotMatrix(BSC_Rawdata)Gráficas de matriz de co-varianza
Circulos
library(corrplot)
M <- cor(BSC_Rawdata)
corrplot(M, method="circle")
Cuadrados
library(corrplot)
M <- cor(BSC_Rawdata)
corrplot(M, method="square") Tarea: probar los gráficos "circle", "square", "ellipse", "number", "shade", "color", "pie"
Transformaremos la columna Empresas en una variable categórica de tres niveles
BSC_proveedores[ ,7] <- factor(BSC_proveedores$Empresa) pairs(BSC_proveedores[2:5], main="Proveedores", pch=21, bg = c("red", "green3", "blue")[unclass(BSC_proveedores$...7)] )library(fpp)
library(ggplot2)
beer2 <- window(ausbeer, start=1992)
fit.beer <- tslm(beer2 ~ trend + season)
fcast <- forecast(fit.beer)
autoplot(beer2, xlab="Año", ylab="Millones de Galones") + ggtitle("Despacho de Cerveza en Australia")# No funciona el uso de titulo del gráfico
#autoplot(fcast , ggtitle("Despacho de Cerveza") ,xlab("Year"), ylab("megalitres"))autoplot(fcast, xlab="Año", ylab="Millones de Galones")Aunque la relación lineal asumida hasta ahora en este apartado es a menudo adecuada, hay muchos casos en los que una forma funcional no lineal es más adecuada. Para mantener las cosas simples en esta sección asumimos que sólo tenemos un predictor \(X\)
La forma más sencilla de modelar una relación no lineal es transformar la variable de previsión
\(y\) y/o la variable predictora \(X\) antes de estimar un modelo de regresión. Aunque esto proporciona una forma funcional no lineal, el modelo sigue siendo lineal en los parámetros. La transformación más utilizada es el logaritmo (natural) .
Se especifica un formulario funcional log-log como
\[log (y) = \beta_0 + \beta_1 * log (x) + \varepsilon \]
En este modelo, la pendiente \(\beta_1\) puede interpretarse como una elasticidad:
Se puede decir que es el cambio porcentual promedio en \(y\) resultado de un
aumento porcentual de \(X\).
También se pueden especificar otras formulas útiles. La formulación log-linear se especifica transformando únicamente la variable de previsión y la formula de registro lineal se obtiene transformando el predictor.
Recuerde que para realizar una transformación logarítmica en una variable, todos sus valores observados deben ser mayores que cero. En el caso de que esa variable
\(X\) contiene ceros, usamos la transformación
\(log (X+1)\) ; Es decir, añadimos uno al valor de la variable y luego tomamos logaritmos. Esto tiene un efecto similar a tomar logaritmos, pero evita el problema de los ceros. También tiene el efecto secundario ordenado de ceros en la escala original ceros aparezcan en la escala transformada como ceros.
Hay casos para los que simplemente transformar los datos no seriá adecuado y puede ser necesaria una especificación más general. Entonces el modelo que usamos será
\[ y=f(x) + \varepsilon\]
Dónde \(F\) es una función no lineal. En regresión estándar (lineal),
$ F (X)=_0+_1 * X$. En la especificación de regresión no lineal que sigue, permitimos
\(F\) para ser una función no lineal más flexible de \(X\) , en comparación con simplemente una transformación logarítmica u otra transformación.
Una de las especificaciones más sencillas es \(F\)
lineal por partes . Es decir, introducimos puntos donde la pendiente de
\(F\)
puede cambiar. Estos puntos se llaman nodos. Esto se puede lograr dejando que
\(X_{1,t}\) = X ,
e introducir la variables
$ X_{2,t}$ tal que :
\[x_{2,t} = (x-c) =\]
\[x_{2,t} = (x-c) + =\left\{\begin{array}{l l}
x=0 & x < c \\
(x-c) & x \geq c
\end{array}
\right\}
\]
La notación
\((X − C) +\)
significa que si el valor
\(X − C\) si es positivo y 0 de lo contrario.
Esto obliga a la pendiente a doblarse en el punto \(C\) . Los pliegues adicionales se pueden incluir en la relación añadiendo otras variables la ecuación anterior.
Un ejemplo de esto sería
\(X= T\)
y ajustar una tendencia lineal por tramos a una serie temporal.
Las relaciones lineales por partes construidas de esta manera son un caso especial de splines de regresión. En general, se obtiene una spline de regresión lineal utilizando
\[x_1 = x , x_2 =(x - c_1)_+ ... x_k=(x-c_{k-1})_+ \]
Dónde $ C_1, … c_{k-1} son los nodos (los puntos en los que la línea puede doblarse).
Selecciando del número de nudos \((K-1)\) y dónde deben posicionarse puede ser difícil y algo arbitrario. Algunos algoritmos automáticos de selección de nudos están disponibles en algún software, pero aún no son ampliamente utilizados.
Se puede obtener un resultado más suave utilizando expresiones cúbicas a piezas en lugar de líneas por piezas. Estos están limitados para ser continuos (se unen) y suaves (para que no haya cambios repentinos de dirección, como vemos con splines lineales por piezas). En general, una spline de regresión cúbica se escribe como
\[ x_1=x , x_2= x^2 , x_3=x^3 , x_4=(x - c_1), \ldots , x_k = (x-c_{k-3}) \]
La cantidad de energía para una carga a pulso de un camión de 24 palets es equivalente a la que una persona gasta en una maratón. Hoy , con la existencia de carga mecanizada es inhumano pensar en esta alternativa, pero tomemos las datos a ejemplo ilustrativo.
La figura muestra los tiempos ganadores del maratón de Boston (en minutos). Según las estadística, ll curso se alargó (de 24,5 millas a 26,2 millas) en 1924, lo que condujo a un salto en los tiempos del ganadores, por lo que sólo consideramos datos a partir de esa fecha. La serie temporal muestra una tendencia general a la baja a medida que los tiempos de los ganadores han ido mejorando a lo largo de los años. El panel inferior muestra los residuos entre la correlación de una tendencia lineal a los datos y el tiempo verdadero. La gráfica muestra un patrón no lineal obvio que no ha sido capturado por la tendencia lineal. También hay algo de heteroscedasticidad, con variación decreciente con el tiempo.
library(fpp2)
boston_men <- window(marathon, start=1924)
h <- 10
fit.lin <- tslm(boston_men ~ trend)
fcasts.lin <- forecast(fit.lin, h = h)
fit.exp <- tslm(boston_men ~ trend, lambda = 0)
fcasts.exp <- forecast(fit.exp, h = h)
t <- time(boston_men)
t.break1 <- 1950
t.break2 <- 1980
tb1 <- ts(pmax(0, t - t.break1), start = 1924)
tb2 <- ts(pmax(0, t - t.break2), start = 1924)
fit.pw <- tslm(boston_men ~ t + tb1 + tb2)
t.new <- t[length(t)] + seq(h)
tb1.new <- tb1[length(tb1)] + seq(h)
tb2.new <- tb2[length(tb2)] + seq(h)
newdata <- cbind(t=t.new, tb1=tb1.new, tb2=tb2.new) %>%
as.data.frame()
fcasts.pw <- forecast(fit.pw, newdata = newdata)
fit.spline <- tslm(boston_men ~ t + I(t^2) + I(t^3) +
I(tb1^3) + I(tb2^3))
fcasts.spl <- forecast(fit.spline, newdata = newdata)
autoplot(boston_men) +
autolayer(fitted(fit.lin), series = "Linear") +
autolayer(fitted(fit.exp), series = "Exponential") +
autolayer(fitted(fit.pw), series = "Piecewise") +
autolayer(fitted(fit.spline), series = "Cubic Spline") +
autolayer(fcasts.pw, series="Piecewise") +
autolayer(fcasts.lin, series="Linear", PI=FALSE) +
autolayer(fcasts.exp, series="Exponential", PI=FALSE) +
autolayer(fcasts.spl, series="Cubic Spline", PI=FALSE) +
xlab("Year") + ylab("Winning times in minutes") +
ggtitle("Boston Marathon") +
guides(colour = guide_legend(title = " "))arriba muestra las líneas y pronósticos ajustados de las tendencias lineales, exponenciales, lineales por tramos y spline cúbicas. Las mejores previsiones parecen provenir de la tendencia lineal por partes, mientras que la spline cúbica da el mejor ajuste a los datos históricos, pero malas previsiones.
Hay una formulación alternativa de splines cúbicas (llamadas splines de suavizado cúbico natural) que impone algunas restricciones, por lo que la función spline es lineal al final, lo que generalmente da pronósticos mucho mejores sin comprometer el ajuste. En la Figura siguiente, hemos utilizado la función splinef() para producir las previsiones de spline cúbica. Esto utiliza muchos más nudos de los que usamos en la Figura 5.21, pero los coeficientes están restringidos para evitar el sobreajuste, y la curva es lineal en ambos extremos. Esto tiene la ventaja añadida de que la selección de nudos no es subjetiva. También hemos utilizado una transformación de registro (lambda=0) para manejar la heteroscedasticidad.
boston_men %>%
splinef(lambda=0) %>%
autoplot()
Los residuos trazados a continuación muestran que este modelo ha capturado bien la tendencia, aunque queda algo de heteroscedasticidad. El amplio intervalo de predicción asociado con las previsiones refleja la volatilidad observada en los tiempos históricos de victoria.
boston_men %>%
splinef(lambda=0) %>%
checkresiduals()