0.Carga de librerías

library(readxl)
library(dplyr)
library(gt)
library(plotly)
library(DT)

Se define además una función auxiliar para aplicar el mismo estilo de bordes negros a todas las tablas gt del documento, manteniendo la coherencia visual con el resto de los trabajos del grupo (por ejemplo, el análisis de Unit Type).

estilo_gt <- function(tabla_gt) {
  tabla_gt %>%
    tab_style(
      style = cell_borders(sides = c("left", "right"), color = "black", weight = px(1)),
      locations = list(cells_body(columns = everything()), cells_column_labels(columns = everything()))
    ) %>%
    tab_options(
      table.border.top.color            = "black",
      table.border.bottom.color         = "black",
      table.border.top.style            = "solid",
      table.border.bottom.style         = "solid",
      column_labels.font.weight         = "bold",
      column_labels.border.top.color    = "black",
      column_labels.border.bottom.color = "black",
      column_labels.border.bottom.width = px(2),
      heading.border.bottom.color       = "black",
      heading.border.bottom.width       = px(2),
      table_body.hlines.color           = "white",
      table_body.border.bottom.color    = "black"
    )
}

color_azul <- "#2E86C1"

1. Carga de datos

datos <- read_excel("dataset_mundial_petro.xlsx")
cat("Número de registros (filas crudas):", nrow(datos), "\n")
## Número de registros (filas crudas): 49212
cat("Número de variables disponibles:", ncol(datos), "\n")
## Número de variables disponibles: 32

El archivo trae múltiples filas por yacimiento (una fila distinta por cada registro de reservas/producción asociado a un mismo campo). Por eso, en la siguiente sección se agrupa por Unit ID antes de construir cualquier tabla, en lugar de trabajar directamente con las filas crudas.


2. Seleccion de variables (Causa y Efecto)

Un yacimiento se descubre (X1), luego recibe la aprobación de inversión (X2), y a lo largo de su vida operativa acumula un estado registrado (X3) antes o junto con el arranque de producción (Y). Por eso X1, X2 y X3 se tratan como variables explicativas (causa) y Y como el efecto:

  • Y = PRODUCTION_START_YEAR: año en que el yacimiento empieza a producir.
  • X1 = DISCOVERY_YEAR (Discovery year): año en que se descubrió el yacimiento.
  • X2 = FID_YEAR (FID Year): año de la Decisión Final de Inversión.
  • X3 = STATUS_YEAR (Status year): año del último estado operativo registrado del yacimiento (activo, cerrado, en construcción, etc.).

FID Year y Production start year llegan como texto porque incluyen valores como “2025 (expected)”; se extrae el año numérico con una función auxiliar antes de agrupar por yacimiento.

extraer_anio <- function(v) as.numeric(sub("^(\\d{4}).*", "\\1", as.character(v)))

datos <- datos %>%
  mutate(
    X1_raw = as.numeric(`Discovery year`),
    X2_raw = extraer_anio(`FID Year`),
    X3_raw = as.numeric(`Status year`),
    Y_raw  = extraer_anio(`Production start year`)
  )

3. Tabla original

Se agrupa por Unit ID (identificador único de yacimiento), tomando un solo valor representativo por variable. Esta es la tabla original, tal cual queda disponible por yacimiento, sin descartar todavía los valores faltantes.

agregado <- datos %>%
  group_by(`Unit ID`) %>%
  summarise(
    DISCOVERY_YEAR        = first(X1_raw),
    FID_YEAR               = first(X2_raw),
    STATUS_YEAR             = first(X3_raw),
    PRODUCTION_START_YEAR   = first(Y_raw),
    .groups = "drop"
  )

tabla_original <- agregado %>% select(-`Unit ID`)
cat("Yacimientos únicos disponibles (tabla original):", nrow(tabla_original), "\n")
## Yacimientos únicos disponibles (tabla original): 8334
sapply(tabla_original, function(col) sum(!is.na(col)))
##        DISCOVERY_YEAR              FID_YEAR           STATUS_YEAR 
##                  4935                   308                  8048 
## PRODUCTION_START_YEAR 
##                  2233
datatable(tabla_original,
          options = list(pageLength = 10),
          colnames = c("Año de Descubrimiento (X1)", "Año de FID (X2)",
                       "Año del Último Estado (X3)",
                       "Año de Inicio de Producción (Y)"))

Como se observa en el conteo de valores no nulos, las cuatro variables no tienen la misma cantidad de datos disponibles; en particular FID_YEAR tiene muchos menos registros que el resto. Esta diferencia se retoma en la Sección 5.


4. Grafica original

Se grafica cada X contra Y usando la tabla original, considerando únicamente los pares de datos disponibles para cada relación (sin exigir todavía que las tres X estén completas a la vez).

graf_dispersion <- function(data, xvar, yvar, xtitulo, ytitulo = "Y") {
  plot_ly(data, x = as.formula(paste0("~", xvar)), y = as.formula(paste0("~", yvar)),
          type = "scatter", mode = "markers",
          marker = list(size = 5, color = color_azul, opacity = 0.6)) %>%
    layout(xaxis = list(title = xtitulo), yaxis = list(title = ytitulo))
}
d1_orig <- tabla_original %>% select(DISCOVERY_YEAR, PRODUCTION_START_YEAR) %>% na.omit()
d2_orig <- tabla_original %>% select(FID_YEAR, PRODUCTION_START_YEAR) %>% na.omit()
d3_orig <- tabla_original %>% select(STATUS_YEAR, PRODUCTION_START_YEAR) %>% na.omit()

cat("Pares válidos X1-Y:", nrow(d1_orig), "\n")
## Pares válidos X1-Y: 1889
cat("Pares válidos X2-Y:", nrow(d2_orig), "\n")
## Pares válidos X2-Y: 290
cat("Pares válidos X3-Y:", nrow(d3_orig), "\n")
## Pares válidos X3-Y: 2159
g1_orig <- graf_dispersion(d1_orig, "DISCOVERY_YEAR", "PRODUCTION_START_YEAR", "X1 Discovery Year (original)")
g2_orig <- graf_dispersion(d2_orig, "FID_YEAR", "PRODUCTION_START_YEAR", "X2 FID Year (original)")
g3_orig <- graf_dispersion(d3_orig, "STATUS_YEAR", "PRODUCTION_START_YEAR", "X3 Status Year (original)")

subplot(g1_orig, g2_orig, g3_orig, nrows = 1, shareX = FALSE, shareY = TRUE,
        titleX = TRUE, titleY = TRUE, margin = 0.06) %>%
  layout(showlegend = FALSE)

5. Conjetura inicial y tratamiento de datos

Conjetura inicial: en la gráfica original la tendencia general es difícil de leer con total claridad, sobre todo en X1 y X3, donde la nube de puntos es más dispersa; en X2 sí se insinúa una relación creciente más marcada con Y. Esto es esperable porque cada gráfica usa una cantidad distinta de pares de datos (Sección 4), lo cual no es adecuado para ajustar un único modelo de regresión múltiple, ya que este necesita que las tres X y la Y estén disponibles simultáneamente para el mismo yacimiento.

Estrategia de tratamiento: se conservan únicamente los yacimientos que tienen las cuatro variables completas a la vez (X1, X2, X3, Y) y con valores físicamente válidos (años enteros positivos, mayores a cero). De esta forma todas las columnas de la tabla final quedan con exactamente la misma cantidad de datos, lo cual es indispensable para que el modelo de regresión múltiple sea consistente.

tabla <- tabla_original %>%
  filter(!is.na(DISCOVERY_YEAR), !is.na(FID_YEAR), !is.na(STATUS_YEAR),
         !is.na(PRODUCTION_START_YEAR)) %>%
  filter(DISCOVERY_YEAR > 0, FID_YEAR > 0, STATUS_YEAR > 0,
         PRODUCTION_START_YEAR > 0)

cat("Yacimientos con las 4 variables completas y válidas:", nrow(tabla), "\n")
## Yacimientos con las 4 variables completas y válidas: 259
# Verificación de balance: todas las columnas deben tener el mismo número de datos
sapply(tabla, function(col) sum(!is.na(col)))
##        DISCOVERY_YEAR              FID_YEAR           STATUS_YEAR 
##                   259                   259                   259 
## PRODUCTION_START_YEAR 
##                   259

6. Tabla tratada

datatable(tabla,
          options = list(pageLength = 10),
          colnames = c("Año de Descubrimiento (X1)", "Año de FID (X2)",
                       "Año del Último Estado (X3)",
                       "Año de Inicio de Producción (Y)"))

7. Grafica tratada

g1 <- graf_dispersion(tabla, "DISCOVERY_YEAR", "PRODUCTION_START_YEAR", "X1 Discovery (tratada)")
g2 <- graf_dispersion(tabla, "FID_YEAR", "PRODUCTION_START_YEAR", "X2 FID (tratada)")
g3 <- graf_dispersion(tabla, "STATUS_YEAR", "PRODUCTION_START_YEAR", "X3 Status (tratada)")

subplot(g1, g2, g3, nrows = 1, shareX = FALSE, shareY = TRUE,
        titleX = TRUE, titleY = TRUE, margin = 0.06) %>%
  layout(showlegend = FALSE)

Con las tres variables completas y en la misma cantidad, ahora sí es posible construir el gráfico 3D conjunto (el color de los puntos representa a X3, la tercera variable que no cabe en los ejes):

plot_ly(tabla, x = ~DISCOVERY_YEAR, y = ~FID_YEAR, z = ~PRODUCTION_START_YEAR,
        type = "scatter3d", mode = "markers",
        marker = list(size = 4, color = ~STATUS_YEAR, colorscale = "Viridis", showscale = TRUE)) %>%
  layout(scene = list(
    xaxis = list(title = "X1 DISCOVERY_YEAR"),
    yaxis = list(title = "X2 FID_YEAR"),
    zaxis = list(title = "Y PRODUCTION_START_YEAR")
  ))

8. Conjetura final

Con los datos ya tratados, la tendencia se ve mucho más clara: los puntos crecen de forma conjunta principalmente con X2, mientras que X1 y X3 aportan variación adicional sin romper la tendencia general. Se propone entonces un modelo de regresión lineal múltiple de 3 variables:

\[y = b_0 + b_1 x_1 + b_2 x_2 + b_3 x_3\]


9. Parametros

Modelo matemático:

\[Y = b_0 + b_1 X_1 + b_2 X_2 + b_3 X_3\]

Ajuste del modelo:

modelo <- lm(PRODUCTION_START_YEAR ~ DISCOVERY_YEAR + FID_YEAR + STATUS_YEAR,
             data = tabla)
summary(modelo)
## 
## Call:
## lm(formula = PRODUCTION_START_YEAR ~ DISCOVERY_YEAR + FID_YEAR + 
##     STATUS_YEAR, data = tabla)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -25.474  -1.264   0.004   1.307   7.709 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -709.74418  286.59299  -2.476   0.0139 *  
## DISCOVERY_YEAR   -0.01276    0.01293  -0.986   0.3248    
## FID_YEAR          0.99566    0.01774  56.126   <2e-16 ***
## STATUS_YEAR       0.36935    0.14620   2.526   0.0121 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.855 on 255 degrees of freedom
## Multiple R-squared:  0.9584, Adjusted R-squared:  0.9579 
## F-statistic:  1960 on 3 and 255 DF,  p-value: < 2.2e-16

Parámetros:

b0 <- coef(modelo)[1]
b1 <- coef(modelo)[2]
b2 <- coef(modelo)[3]
b3 <- coef(modelo)[4]

data.frame(
  Parámetro = c("b0 (intercepto)", "b1 (pendiente X1)", "b2 (pendiente X2)",
                "b3 (pendiente X3)"),
  Valor     = c(round(b0, 4), round(b1, 4), round(b2, 4), round(b3, 4))
) %>%
  gt() %>%
  tab_header(title = md("**Parámetros del Modelo**")) %>%
  tab_source_note("Autor: Grupo 5") %>%
  estilo_gt()
Parámetros del Modelo
Parámetro Valor
b0 (intercepto) -709.7442
b1 (pendiente X1) -0.0128
b2 (pendiente X2) 0.9957
b3 (pendiente X3) 0.3693
Autor: Grupo 5

Ecuación múltiple:

\[y = -709.74 + -0.0128x_1 + 0.9957x_2 + 0.3693x_3\]

Sobre el signo de b1: X1 (DISCOVERY_YEAR) sale con pendiente negativa; el peso explicativo principal lo lleva X2. Esto no representa un problema del modelo y se revisa formalmente en la Sección 11 (Restricciones).


10. Comparacion y bondad del modelo

10.1 Grafica de comparacion (realidad vs. modelo)

Como X3 también forma parte del modelo, la superficie se calcula dejando X3 fija en su promedio para poder graficarla en 3D:

x1_seq <- seq(min(tabla$DISCOVERY_YEAR), max(tabla$DISCOVERY_YEAR), length.out = 25)
x2_seq <- seq(min(tabla$FID_YEAR), max(tabla$FID_YEAR), length.out = 25)
x3_medio <- mean(tabla$STATUS_YEAR)
malla  <- outer(x1_seq, x2_seq, function(a, b) b0 + b1 * a + b2 * b + b3 * x3_medio)

plot_ly() %>%
  add_markers(data = tabla, x = ~DISCOVERY_YEAR, y = ~FID_YEAR, z = ~PRODUCTION_START_YEAR,
              marker = list(size = 4, color = color_azul), name = "Datos reales") %>%
  add_surface(x = x1_seq, y = x2_seq, z = t(malla), opacity = 0.6,
              showscale = FALSE, name = "Modelo (X3 en su media)") %>%
  layout(scene = list(
    xaxis = list(title = "X1 DISCOVERY_YEAR"),
    yaxis = list(title = "X2 FID_YEAR"),
    zaxis = list(title = "Y PRODUCTION_START_YEAR")
  ))

Para ver el efecto de las 3 variables a la vez, se compara además lo predicho contra lo observado; mientras más cerca estén los puntos de la línea roja, mejor es el ajuste:

tabla$Y_predicho <- predict(modelo)

plot_ly(tabla, x = ~PRODUCTION_START_YEAR, y = ~Y_predicho,
        type = "scatter", mode = "markers",
        marker = list(size = 6, color = color_azul)) %>%
  add_trace(x = ~PRODUCTION_START_YEAR, y = ~PRODUCTION_START_YEAR,
             mode = "lines", line = list(color = "red", dash = "dash"),
             name = "Ajuste perfecto") %>%
  layout(title = "Y observado vs. Y predicho",
         xaxis = list(title = "Y observado"),
         yaxis = list(title = "Y predicho"))

10.2 Test de bondad

pearson_x1 <- cor(tabla$DISCOVERY_YEAR, tabla$PRODUCTION_START_YEAR)
pearson_x2 <- cor(tabla$FID_YEAR, tabla$PRODUCTION_START_YEAR)
pearson_x3 <- cor(tabla$STATUS_YEAR, tabla$PRODUCTION_START_YEAR)

data.frame(
  Variable = c("X1 (DISCOVERY_YEAR)", "X2 (FID_YEAR)", "X3 (STATUS_YEAR)"),
  Pearson  = c(round(pearson_x1, 4), round(pearson_x2, 4), round(pearson_x3, 4)),
  Resultado = c(ifelse(abs(pearson_x1) > 0.7, "Supera 0.7", "No supera 0.7"),
                ifelse(abs(pearson_x2) > 0.7, "Supera 0.7", "No supera 0.7"),
                ifelse(abs(pearson_x3) > 0.7, "Supera 0.7", "No supera 0.7"))
) %>%
  gt() %>%
  tab_header(title = md("**Correlación de Pearson por variable**")) %>%
  tab_source_note("Autor: Grupo 5") %>%
  estilo_gt()
Correlación de Pearson por variable
Variable Pearson Resultado
X1 (DISCOVERY_YEAR) 0.5950 No supera 0.7
X2 (FID_YEAR) 0.9783 Supera 0.7
X3 (STATUS_YEAR) 0.3990 No supera 0.7
Autor: Grupo 5

Nota honesta: de las 3 variables, solo X2 (FID_YEAR) supera 0.7 de correlación con Y por sí sola; X1 y X3 no llegan a ese nivel individualmente.

r2       <- summary(modelo)$r.squared
f_pvalue <- pf(summary(modelo)$fstatistic[1],
               summary(modelo)$fstatistic[2],
               summary(modelo)$fstatistic[3], lower.tail = FALSE)

cat("R² del modelo:", round(r2, 4), "\n")
## R² del modelo: 0.9584
cat("F-test (p-valor):", format(f_pvalue, scientific = TRUE, digits = 4), "\n")
## F-test (p-valor): 9.661e-176
cat("¿F-test significativo (p < 0.05)?:", f_pvalue < 0.05, "\n")
## ¿F-test significativo (p < 0.05)?: TRUE

Aun cuando X1 y X3 no superan 0.7 de correlación por separado, el modelo conjunto explica 95.8% de la variabilidad de Y (R² = 0.9584), y el F-test confirma que el modelo en conjunto es significativo.


11. Restricciones

Dominio teórico y rango observado:

data.frame(
  Variable  = c("X1 (DISCOVERY_YEAR)", "X2 (FID_YEAR)", "X3 (STATUS_YEAR)",
                "Y (PRODUCTION_START_YEAR)"),
  Dominio_teorico = c(
    "Enteros positivos (Z+): un año calendario no puede ser negativo, fraccionario ni anterior al origen de la industria petrolera",
    "Enteros positivos (Z+): puede incluir años próximos porque hay proyectos con FID ya aprobado a futuro",
    "Enteros positivos (Z+): fecha de la última actualización de estado del yacimiento",
    "Enteros positivos (Z+): año calendario de arranque de producción; no existen registros de años negativos"
  ),
  Rango_observado = c(
    paste0("[", min(tabla$DISCOVERY_YEAR), ", ", max(tabla$DISCOVERY_YEAR), "]"),
    paste0("[", min(tabla$FID_YEAR), ", ", max(tabla$FID_YEAR), "]"),
    paste0("[", min(tabla$STATUS_YEAR), ", ", max(tabla$STATUS_YEAR), "]"),
    paste0("[", min(tabla$PRODUCTION_START_YEAR), ", ", max(tabla$PRODUCTION_START_YEAR), "]")
  )
) %>%
  gt() %>%
  tab_header(title = md("**Dominio teórico y rango observado de cada variable**")) %>%
  tab_source_note("Autor: Grupo 5") %>%
  estilo_gt()
Dominio teórico y rango observado de cada variable
Variable Dominio_teorico Rango_observado
X1 (DISCOVERY_YEAR) Enteros positivos (Z+): un año calendario no puede ser negativo, fraccionario ni anterior al origen de la industria petrolera [1938, 2022]
X2 (FID_YEAR) Enteros positivos (Z+): puede incluir años próximos porque hay proyectos con FID ya aprobado a futuro [1975, 2029]
X3 (STATUS_YEAR) Enteros positivos (Z+): fecha de la última actualización de estado del yacimiento [2018, 2024]
Y (PRODUCTION_START_YEAR) Enteros positivos (Z+): año calendario de arranque de producción; no existen registros de años negativos [1975, 2034]
Autor: Grupo 5

Dominio [X1] (DISCOVERY_YEAR): D = {Z+ ∩ [1938, 2022]}

Dominio [X2] (FID_YEAR): D = {Z+ ∩ [1975, 2029]}

Dominio [X3] (STATUS_YEAR): D = {Z+ ∩ [2018, 2024]}

Dominio [Y] (PRODUCTION_START_YEAR): D = {Z+ ∩ [1975, 2034]}

Estos dominios son coherentes con los declarados en la tabla de variables descriptivas del grupo (donde el “Año” se definió como perteneciente a los enteros, \(\mathbb{Z}\)); por lo tanto, no existen restricciones matemáticas adicionales más allá del propio dominio físico de los datos.

¿Existe una combinación de X1, X2 y X3 que, reemplazada en el plano, genere un valor de Y fuera de su dominio (años negativos, cero o no enteros)?

Aunque b1 es negativo, esto no implica automáticamente una restricción: el modelo solo se interpreta dentro del dominio muestral. Se verifica evaluando la ecuación del modelo en los 8 vértices (combinaciones mín/máx de X1, X2 y X3):

combinaciones_extremas <- expand.grid(
  DISCOVERY_YEAR = c(min(tabla$DISCOVERY_YEAR), max(tabla$DISCOVERY_YEAR)),
  FID_YEAR        = c(min(tabla$FID_YEAR), max(tabla$FID_YEAR)),
  STATUS_YEAR     = c(min(tabla$STATUS_YEAR), max(tabla$STATUS_YEAR))
)
combinaciones_extremas$Y_estimado <- predict(modelo, newdata = combinaciones_extremas)
combinaciones_extremas <- combinaciones_extremas %>%
  mutate(Y_estimado = round(Y_estimado, 2),
         Fuera_de_dominio = Y_estimado <= 0)

combinaciones_extremas %>%
  gt() %>%
  tab_header(title = md("**Verificación de restricciones en los vértices del dominio**")) %>%
  tab_source_note("Autor: Grupo 5") %>%
  estilo_gt()
Verificación de restricciones en los vértices del dominio
DISCOVERY_YEAR FID_YEAR STATUS_YEAR Y_estimado Fuera_de_dominio
1938 1975 2018 1977.31 FALSE
2022 1975 2018 1976.24 FALSE
1938 2029 2018 2031.08 FALSE
2022 2029 2018 2030.00 FALSE
1938 1975 2024 1979.53 FALSE
2022 1975 2024 1978.45 FALSE
1938 2029 2024 2033.29 FALSE
2022 2029 2024 2032.22 FALSE
Autor: Grupo 5
hay_restriccion <- any(combinaciones_extremas$Fuera_de_dominio)
cat("¿Alguna combinación genera un Y fuera de dominio?:", hay_restriccion, "\n")
## ¿Alguna combinación genera un Y fuera de dominio?: FALSE

No hay restricciones: ninguna combinación de X1, X2 y X3 dentro del dominio muestral genera un valor de Y fuera de su dominio (Y siempre se mantiene positivo).

Rango de validez del modelo: en consecuencia, el modelo es válido únicamente para años comprendidos entre 1938 y 2034, que es el rango muestral observado en las cuatro variables.

Sobre el cambio de escala de los años: se evaluó desplazar el origen de los años (por ejemplo, empezar a contar desde 0) para que la tendencia se viera más marcada en la gráfica. Sin embargo, ese tipo de sustitución de variable solo se justifica cuando la gráfica cruza un eje o involucra raíces, lo cual no ocurre aquí (todos los años son positivos y no hay raíces en el modelo). Por eso se decide mantener los años en su escala original.


12. Estimacion y conclusion

12.1 Estimacion

escenarios <- data.frame(
  Escenario = c("Típico (medianas)", "Descubrimiento antiguo", "FID reciente", "Estado más antiguo"),
  DISCOVERY_YEAR = c(median(tabla$DISCOVERY_YEAR), min(tabla$DISCOVERY_YEAR),
                      median(tabla$DISCOVERY_YEAR), median(tabla$DISCOVERY_YEAR)),
  FID_YEAR        = c(median(tabla$FID_YEAR), median(tabla$FID_YEAR),
                      max(tabla$FID_YEAR), median(tabla$FID_YEAR)),
  STATUS_YEAR     = c(median(tabla$STATUS_YEAR), median(tabla$STATUS_YEAR),
                      median(tabla$STATUS_YEAR), min(tabla$STATUS_YEAR))
)

escenarios$PRODUCTION_START_YEAR_ESTIMADA <- predict(modelo, newdata = escenarios)

escenarios %>%
  mutate(PRODUCTION_START_YEAR_ESTIMADA = round(PRODUCTION_START_YEAR_ESTIMADA, 2)) %>%
  gt() %>%
  tab_header(title = md("**Estimaciones del Modelo**")) %>%
  tab_source_note("Autor: Grupo 5") %>%
  estilo_gt()
Estimaciones del Modelo
Escenario DISCOVERY_YEAR FID_YEAR STATUS_YEAR PRODUCTION_START_YEAR_ESTIMADA
Típico (medianas) 2005 2019 2022 2021.74
Descubrimiento antiguo 1938 2019 2022 2022.60
FID reciente 2005 2029 2022 2031.70
Estado más antiguo 2005 2019 2018 2020.26
Autor: Grupo 5

12.2 Conclusion

Entre PRODUCTION_START_YEAR (Y) y DISCOVERY_YEAR (X1), FID_YEAR (X2) y STATUS_YEAR (X3) (medidos en años) existe una relación de tipo lineal definida por la ecuación del plano

\[y = -709.74 + -0.0128x_1 + 0.9957x_2 + 0.3693x_3\]

donde Y está influenciada en un 95.8% por la combinación de X1, X2 y X3, mientras que el 4.2% restante se debe a otros factores. El modelo no presenta restricciones. Es válido únicamente para años comprendidos entre 1938 y 2034.