1 Instalamos paquetes

# paquete con test de homocedasticidad
install.packages("lmtest")    

2 Cargamos los paquetes

library(readxl)
library(tidyverse)
library(PerformanceAnalytics)
library(lmtest)

3 Cargamos la base de datos

MANDARINAS <- read_excel("MANDARINAS_2024.xlsx")

4 Analizamos grƔficamente

ggplot(MANDARINAS, aes(PESO, DIAM_ECUAT, color= GRUPO)) +
  geom_point()

glimpse(MANDARINAS)
## Rows: 419
## Columns: 8
## $ N             <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
## $ GRUPO         <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ VARIEDAD      <chr> "Clementina", "Clementina", "Clementina", "Clementina", …
## $ N_DE_FRUTO    <dbl> 19, 9, 21, 8, 4, 30, 22, 23, 17, 27, 29, 14, 16, 13, 25,…
## $ PESO          <dbl> 101, 122, 127, 126, 37, 139, 140, 130, 138, 142, 121, 15…
## $ DIAM_ECUAT    <dbl> 64.2, 64.2, 64.7, 64.9, 65.9, 66.4, 67.1, 67.5, 68.2, 68…
## $ NIVEL_DE_DAƑO <dbl> 1, 0, 3, 3, 2, 2, 3, 1, 2, 2, 2, 1, 1, 2, 1, 1, 0, 1, 0,…
## $ COLOR         <dbl> 4, 5, 4, 1, 5, 4, 4, 3, 3, 4, 4, 1, 1, 3, 4, 1, 4, 1, 5,…

šŸ’¬ Ā”Recordemos!

ā–Ŗļø <dbl>: Double. Significa que la variable es numĆ©rica continua, del tipo double (nĆŗmero decimal). Ejemplo: 3.14, 10.0, -2.5 Equivalente a numeric en R base.

ā–Ŗ <chr>: Character. Significa que la variable es texto (cadena de caracteres). Ejemplo: ā€œArgentinaā€, ā€œLunesā€, ā€œGrupo Aā€.

ā–Ŗ <fct>: Factor. Significa que la variable es un factor, es decir, una variable categórica con niveles definidos. Es usada en anĆ”lisis estadĆ­sticos y grĆ”ficos para representar categorĆ­as como grupos, tratamientos, variedades, etc. Ejemplo: niveles de ā€œBajoā€, ā€œMedioā€, ā€œAltoā€.

4.1 Transformamos la variable ā€œGRUPOā€ de double a factor

MANDARINAS_MODIF <- MANDARINAS %>% 
  mutate(GRUPO = as.factor(GRUPO))
glimpse(MANDARINAS_MODIF)
## Rows: 419
## Columns: 8
## $ N             <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
## $ GRUPO         <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ VARIEDAD      <chr> "Clementina", "Clementina", "Clementina", "Clementina", …
## $ N_DE_FRUTO    <dbl> 19, 9, 21, 8, 4, 30, 22, 23, 17, 27, 29, 14, 16, 13, 25,…
## $ PESO          <dbl> 101, 122, 127, 126, 37, 139, 140, 130, 138, 142, 121, 15…
## $ DIAM_ECUAT    <dbl> 64.2, 64.2, 64.7, 64.9, 65.9, 66.4, 67.1, 67.5, 68.2, 68…
## $ NIVEL_DE_DAƑO <dbl> 1, 0, 3, 3, 2, 2, 3, 1, 2, 2, 2, 1, 1, 2, 1, 1, 0, 1, 0,…
## $ COLOR         <dbl> 4, 5, 4, 1, 5, 4, 4, 3, 3, 4, 4, 1, 1, 3, 4, 1, 4, 1, 5,…

4.2 Graficamos nuevamente

ggplot(MANDARINAS_MODIF, aes(PESO, DIAM_ECUAT, colour = GRUPO)) +
  geom_point()

5 Regresión lineal

Vamos a analizar los datos del archivo ā€œMandarina_2024ā€ correspondientes al Grupo 1.

# Filtramos los datos del Grupo 1 en un objeto

GRUPO1 <- MANDARINAS_MODIF %>% 
  filter(GRUPO == "1")

5.1 GrÔfico de dispersión de puntos

ggplot(GRUPO1, aes(PESO, DIAM_ECUAT)) +
  geom_point()

5.2 GrÔfico de dispersión de puntos con la recta de regresión

# Graficamos la recta de regresión

ggplot(GRUPO1, aes(PESO, DIAM_ECUAT)) +
  geom_point(size= 2.5, alpha= 0.6) +
  geom_smooth(method = "lm", se=FALSE) # geom_smooth: agrega una lĆ­nea de suavizado

# method= "lm": le indica a geom_smooth que debe usar un ajuste lineal
# se= FALSE: se refiere a no mostrar el intervalo de confianza (banda)

5.3 Modelo de Regresión lineal

\[Y = š›¼ + š›½ X + šœ€\]

Donde:

  • š›¼: ordenada al origen (intercepto).

  • š›½: pendiente de la recta.

  • šœ€: error

5.4 Supuestos del modelo

  1. Linealidad: Se asume que existe una relación lineal entre la variable independiente X y la variable dependiente Y. Esto significa que el cambio esperado en Y es proporcional (constante) a lo largo del rango de X:un cambio de una unidad en X produce siempre el mismo cambio esperado en Y.

  2. Independencia de los errores: Los errores (εi) son independientes entre sí. Esto significa que el error cometido al predecir una observación no debe estar relacionado con el error cometido en otra. En otras palabras, no debe haber patrones sistemÔticos ni correlaciones entre los errores.En la prÔctica, la asignación aleatoria de las unidades experimentales o muestrales favorece este supuesto. Cuando se asignan tratamientos o se seleccionan observaciones al azar, se busca eliminar la influencia de factores no observados que podrían generar dependencia entre los datos.

  3. Homocedasticidad: La varianza de los errores debe ser constante para todos los valores de X. Es decir que el nivel de dispersión o variabilidad del error no cambia sistemÔticamente al aumentar o disminuir X. Cuando este supuesto no se cumple, se dice que hay heterocedasticidad, y esto puede llevar a:

  • Estimaciones ineficientes de los coeficientes.
  • Intervalos de confianza y tests de hipótesis incorrectos (valores p poco confiables).
  1. Normalidad: Los errores se distribuyen normalmente con media cero y varianza constante: εi∼N(0, σ2).

5.5 Cuadro resumen de los supuestos de regresión lineal

Supuesto Verificación grÔfica y/o pruebas estadísticas
  1. Linealidad

- GrÔfico de dispersión

- GrÔfico de Residuos vs. valores ajustados

- Prueba de lack of fitĀ (si hay repeticiones en X)

  1. Independencia

- GrÔfico de residuos en orden de recolección o tiempo.

- Test de Durbin-Watson (series temporales)

  1. Homocedasticidad

- GrÔfico de Residuos vs. valores ajustados

- GrƔfico de Valores ajustados vs Res. estandarizados

- Test de Breusch-Pagan, Test de Levene

  1. Normalidad

- GrƔfico de histograma de residuos

- GrƔfico Q-Q (cuantil-cuantil)

- Test de Shapiro-Wilk

5.6 Función lm()

Su nombre proviene de ā€œlinear modelā€, y sirve para ajustar modelos lineales.

modelo <- lm(y ~ x)

Permite modelar la relación entre una variable dependiente (o respuesta) y una o mÔs variables independientes (o predictoras) mediante una ecuación lineal.

REGRESION_GRUPO1 <- lm(GRUPO1$DIAM_ECUAT ~ GRUPO1$PESO)
REGRESION_GRUPO1
## 
## Call:
## lm(formula = GRUPO1$DIAM_ECUAT ~ GRUPO1$PESO)
## 
## Coefficients:
## (Intercept)  GRUPO1$PESO  
##     47.4397       0.1486

5.7 Ecuación de Regresión calculada

\[y = 47.44 + 0.15 x\]

Es decir:

\[diam.ecuatorial(mm) = 47.44 + 0.15*Peso(g)\]

5.8 Graficamos y agregamos la ecuación obtenida

ggplot(GRUPO1, aes(PESO, DIAM_ECUAT)) +
  geom_point(size = 2.5, alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, color = "blue") +
  geom_text(x = 200, y = 65, label = "y = 47.44 + 0.15 x", size = 5)

5.9 Salida del modelo de Regresión

# Resumen estadĆ­stico del modelo
summary(REGRESION_GRUPO1)
## 
## Call:
## lm(formula = GRUPO1$DIAM_ECUAT ~ GRUPO1$PESO)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3643 -1.2809 -0.0974  0.8050 12.9637 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 47.43965    1.48021   32.05   <2e-16 ***
## GRUPO1$PESO  0.14856    0.01026   14.48   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.463 on 58 degrees of freedom
## Multiple R-squared:  0.7832, Adjusted R-squared:  0.7795 
## F-statistic: 209.5 on 1 and 58 DF,  p-value: < 2.2e-16

5.9.1 ¿ Cómo se interpreta?

  1. Call: Indica la fórmula del modelo. Significa que se estÔ modelando el diÔmetro ecuatorial como una función lineal del peso.

  2. Residuals: resumen de los residuos (diferencia entre valores observados y predichos). Idealmente deben estar centrados alrededor de ā€œ0ā€ y tener distribución simĆ©trica.

  • Interpretación:
    Aunque la mayorƭa de los valores son pequeƱos, el valor mƔximo (12.96) sugiere un posible outlier (valor atƭpico).
  1. Coefficients:

    Columna Significado
    Estimate Valor estimado del intercepto y pendiente (coeficientes)
    Std. Error Error estÔndar de cada estimación.
    t value EstadĆ­stico t
    Pr(>ā˜tā˜) valor p de la prueba t
  • Interpretación:

    • Intercepto: cuando el peso es 0 (no tiene interpretación fĆ­sica en este contexto, pero es necesario para la ecuación), el modelo estima un diĆ”metro de ~47.44 mm.

    • Pendiente: por cada gramo adicional de peso, el diĆ”metro ecuatorial aumenta en promedio 0.15 mm.

    • Ambos coeficientes son altamente significativos (p < 0.001).

  1. Signif. codes: Los asteriscos indican nivel de significancia:

    Símbolo Valor p Interpretación
    *** p < 0.001 Muy altamente significativo
    ** 0.001 ≤ p < 0.01 Altamente significativo
    * 0.01 ≤ p < 0.05 Significativo
    . 0.05 ≤ p < 0.1 Marginalmente significativo (tendencia)
    ā€œā€ p ≄ 0.1 No significativo
  2. Residual standad error (Error estÔndar residual): Indica cuÔnto se desvían en promedio los puntos observados del modelo ajustado. Cuanto mÔs bajo, mejor. En promedio, el modelo se equivoca en ±2.46 mm al estimar el diÔmetro.

  • Interpretación:
  1. Multiple R-squared: (R²) proporción de variabilidad explicada por el modelo. Adjusted R-squared: (R² ajustado) igual que R² pero ajustado por la cantidad de predictores.
  • Interpretación: R² = 0.7832: el peso explica el 78.3% de la variabilidad en el diĆ”metro ecuatorial.
  1. F-statistic (209.5) y p-value (< 2.2e-16):
  • Interpretación:
    • H0: β = 0 No hay relación lineal entre el peso y diĆ”metro ecuatorial.

    • H1: β ≠ 0 Si hay relación lineal entre peso y diĆ”metro ecuatorial.

  • Se rechaza la hipótesis nula. Es decir, el peso tiene un efecto significativo sobre el diĆ”metro ecuatorial.
  • El modelo de regresión es estadĆ­sticamente significativo en su conjunto.

5.10 Cumplimiento de supuestos

5.10.1 AnƔlisis grƔfico

#Usamos la función plot
par(mfrow=c(2,2)) # permite visualizar los grƔficos de residuos en una sola imagen
plot(REGRESION_GRUPO1)

Interpretación


1. Residuals vs Fitted (Residuos vs Valores ajustados)

Objetivo: Verificar linealidad y homocedasticidad.

QuƩ buscar: Los residuos deben estar distribuidos aleatoriamente alrededor de la lƭnea horizontal (en 0), sin formar patrones.

Que observamos en el grƔfico: La mayorƭa de los puntos estƔn bien distribuidos, pero hay cierta curvatura leve (linea roja). Esto podrƭa indicar una posible ligera no linealidad o heterocedasticidad. El punto 5 es un outlier.


2. Q-Q Residuals (Q-Q plot de Residuos)

Objetivo: Verificar la normalidad de los residuos.

QuƩ buscar: Los puntos deben estar alineados con la lƭnea diagonal.

Que observamos en el grƔfico: Casi todos los puntos estƔn bien alineados, salvo un outlier que se aparta en el extremo superior derecho (punto 5). Esto indica que los residuos son aproximadamente normales.


3. Scale-Location (Valores ajustados vs Residuos estandarizados)

Objetivo: Verificar homocedasticidad.

Qué buscar: Distribución horizontal (sin tendencia) de los puntos.

Que observarmos en el grƔfico: Hay una leve tendencia decreciente, lo que sugiere una posible heterocedasticidad: los residuos parecen mƔs grandes para valores pequeƱos de DIAM_ECUATORIAL. Sin embargo, la mayorƭa estƔn concentrados alrededor de 1, lo cual es aceptable.


4. Residuals vs Leverage (Residuos estandarizados vs Leverage)

Objetivo: Identificar observaciones influyentes (problemƔticas) que pueden afectar el modelo al incluirlas o quitarlas.

QuĆ© buscar: Puntos con alto leverage y residuos extremos (identificados con Cook’s distance).

Que observamos en el grƔfico: + La mayorƭa de los puntos tiene bajo leverage ( cercano a 0). + El punto 5 tiene alto leverage y alto residuo estandarizado. Es potencialmente influyente.

5.10.2 Pruebas formales para los supuestos

Normalidad

H0: los residuos tienen distribución normal.

H1: los residuos NO tienen distribución normal.

RESIDUOS <- residuals(REGRESION_GRUPO1)
shapiro.test(RESIDUOS)
## 
##  Shapiro-Wilk normality test
## 
## data:  RESIDUOS
## W = 0.81683, p-value = 3.64e-07

Como el p-valor (3.64e-07) es menor que el nivel de significancia (0.05), concluimos que hay evidencia para rechazar la hipótesis nula de normalidad. Por lo tanto, los residuos NO se distribuyen normalmente.

Linealidad

Se evalúa graficamente (Residuals vs Fitted). En este caso de estudio no se puede usar un test de falta de ajuste (lack of fit) porque no hay réplicas de la variable independiente.

Homocedasticidad

H0: Se cumple el supuesto de homocedasticidad

H1: No se cumple el supuesto de homocedasticidad

# Usamos el paquete "lmtest" con la función bptest() del test de Breusch-Pagan
bptest(GRUPO1$DIAM_ECUAT~GRUPO1$PESO, data = GRUPO1)
## 
##  studentized Breusch-Pagan test
## 
## data:  GRUPO1$DIAM_ECUAT ~ GRUPO1$PESO
## BP = 15.496, df = 1, p-value = 8.269e-05
  • El test de Breusch-Pagan es una prueba estadĆ­stica utilizada para detectar heterocedasticidad en los residuos de un modelo de regresión lineal.

6 Nuevo modelo de Regresión sin el outlier

🤨 Se observó la presencia de un valor atípico

6.1 Buscamos grƔficamente el outlier

# Determinamos que observación es el outlier 
GRUPO1 %>%
  mutate(ID = row_number()) %>% # Agregamos un identificador único para cada observación (fila)
  ggplot(aes(x = PESO, y = DIAM_ECUAT)) +
  geom_point() +
  geom_text(aes(label = ID), vjust = -1, size = 3) # Etiquetas con el nĆŗmero de fila (ID) 

# Buscamos en el data frame la fila 5
GRUPO1
## # A tibble: 60 Ɨ 8
##        N GRUPO VARIEDAD   N_DE_FRUTO  PESO DIAM_ECUAT NIVEL_DE_DAƑO COLOR
##    <dbl> <fct> <chr>           <dbl> <dbl>      <dbl>         <dbl> <dbl>
##  1     1 1     Clementina         19   101       64.2             1     4
##  2     2 1     Clementina          9   122       64.2             0     5
##  3     3 1     Clementina         21   127       64.7             3     4
##  4     4 1     Clementina          8   126       64.9             3     1
##  5     5 1     Clementina          4    37       65.9             2     5
##  6     6 1     Clementina         30   139       66.4             2     4
##  7     7 1     Clementina         22   140       67.1             3     4
##  8     8 1     Clementina         23   130       67.5             1     3
##  9     9 1     Clementina         17   138       68.2             2     3
## 10    10 1     Clementina         27   142       68.2             2     4
## # ℹ 50 more rows

6.2 Eliminamos el outlier

# Eliminamos la fila 5
GRUPO1_MODIF <- GRUPO1 %>% 
  slice(-5) # Usamos función slice del paquete dplyr y el número de fila a eliminar

6.3 GrÔfico de dispersión sin outlier

# Graficamos la relación entre las variables obtenida por el Grupo 1 sin el dato de la fila 5
ggplot(GRUPO1_MODIF, aes(x = PESO, y = DIAM_ECUAT)) +
  geom_point() 

6.4 Obtenemos los coeficientes de Regresión y el resumen sin outlier

REGRESION_GRUPO1_MODIF <- lm(DIAM_ECUAT ~ PESO, data = GRUPO1_MODIF)
REGRESION_GRUPO1_MODIF
## 
## Call:
## lm(formula = DIAM_ECUAT ~ PESO, data = GRUPO1_MODIF)
## 
## Coefficients:
## (Intercept)         PESO  
##     43.0319       0.1779
summary(REGRESION_GRUPO1_MODIF)
## 
## Call:
## lm(formula = DIAM_ECUAT ~ PESO, data = GRUPO1_MODIF)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7437 -0.8547 -0.1411  0.8869  3.8395 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 43.031948   1.057914   40.68   <2e-16 ***
## PESO         0.177922   0.007277   24.45   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.572 on 57 degrees of freedom
## Multiple R-squared:  0.9129, Adjusted R-squared:  0.9114 
## F-statistic: 597.7 on 1 and 57 DF,  p-value: < 2.2e-16

6.5 Comprobamos graficamente los supuestos

#Usamos la función plot
par(mfrow=c(2,2)) # permite visualizar los grƔficos de residuos en una sola imagen
plot(REGRESION_GRUPO1_MODIF)

6.6 Pruebas formales para los supuestos

Normalidad

H0: los residuos tienen distribución normal.

H1: los residuos NO tienen distribución normal.

shapiro.test(residuals(REGRESION_GRUPO1_MODIF))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(REGRESION_GRUPO1_MODIF)
## W = 0.97387, p-value = 0.2336

Homocedasticidad

H0: Se cumple el supuesto de homocedasticidad

H1: No se cumple el supuesto de homocedasticidad

bptest(GRUPO1_MODIF$DIAM_ECUAT~GRUPO1_MODIF$PESO, data = GRUPO1_MODIF)
## 
##  studentized Breusch-Pagan test
## 
## data:  GRUPO1_MODIF$DIAM_ECUAT ~ GRUPO1_MODIF$PESO
## BP = 0.82266, df = 1, p-value = 0.3644

6.7 Prueba de hipotesis para la Regresión

La prueba de hipótesis en Regresión lineal simple usualmente se refiere a evaluar si la pendiente del modelo es significativamente distinta de cero, es decir, si existe una relación lineal entre las variables dependiente e independiente.

H0: β1 = 0 (no hay relación lineal)

H1: β1 ≠ 0 (sĆ­ hay relación lineal)

α = 0.05

En otras palabras… Existe una relación lineal significativa entre el peso (PESO) y el diĆ”metro ecuatorial del fruto (DIAM_ECUAT).

summary(REGRESION_GRUPO1_MODIF)
## 
## Call:
## lm(formula = DIAM_ECUAT ~ PESO, data = GRUPO1_MODIF)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7437 -0.8547 -0.1411  0.8869  3.8395 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 43.031948   1.057914   40.68   <2e-16 ***
## PESO         0.177922   0.007277   24.45   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.572 on 57 degrees of freedom
## Multiple R-squared:  0.9129, Adjusted R-squared:  0.9114 
## F-statistic: 597.7 on 1 and 57 DF,  p-value: < 2.2e-16

6.8 Predicción

Podemos utilizar la ecuación obtenida para realizar una predicción del diÔmetro ecuatorial esperado (milímetros) para un determinado peso (gramos). Por ejemplo para 150 gramos.

Usaremos la recta generada en el modelo:

\[diam.ecuat(mm) = 43.0319 + 0.1779 * Peso(g)\]

diam_ecuat = 43.0319 + 0.1779 * 150
diam_ecuat
## [1] 69.7169

También podemos utilizar la función predict()

Peso_150 <- data.frame(PESO = 150)
predict(REGRESION_GRUPO1_MODIF, newdata = Peso_150, interval = "confidence")
##        fit      lwr      upr
## 1 69.72027 69.29673 70.14382
  • Devuelve el valor ajustado (fit) y los lĆ­mites inferior (lwr) y superior (upr) del intervalo de confianza para el diĆ”metro ecuatorial esperado (mm).

6.9 GrÔfico de dispersión con recta de Regresión y predicción

ggplot(GRUPO1_MODIF, aes(PESO, DIAM_ECUAT)) +
  geom_point(size = 2.5, alpha = 0.6, color = "red") +
  geom_smooth(method = "lm", se = TRUE, color = "black") +
  geom_text(x = 200, y = 65, label = "diam. ecuat = 43.03 + 0.18 peso", size = 5) +
  geom_point(aes(x = 150, y = 69.7169), color = "yellow", size = 3.0) # Predicción