Caso aplicado: Salario promedio de maestros

Se va a evaluar si existen diferencias significativas en el salario promedio de maestros de escuelas públicas según factores como la región. Se aplicará ANOVA para comparar grupos definidos por variables cualitativas y ANCOVA para controlar efectos de variables cuantitativas.

1. Eliminar cualquier elemento ———————————————

rm(list=ls())

2. Importar datos ———————————————————

library(readxl)
Data <- read_excel("Table 9_1.xlsx", col_types = c("text", 
    "numeric", "numeric", "numeric", "numeric"))
View(Data)

2.3. Identificar las dimensiones

dim(Data)
## [1] 51  5

2.4. Variables modeladas

names(Data)
## [1] "Estados"  "Salary"   "Spending" "D2"       "D3"

2.5. Verificar las variables

class(Data$Estados)
## [1] "character"
str(Data)
## tibble [51 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Estados : chr [1:51] "Connecticut" "Illinois" "Indiana" "Iowa" ...
##  $ Salary  : num [1:51] 60822 58246 47831 43130 43334 ...
##  $ Spending: num [1:51] 12436 9275 8935 7807 8373 ...
##  $ D2      : num [1:51] 1 1 1 1 1 1 1 1 1 1 ...
##  $ D3      : num [1:51] 0 0 0 0 0 0 0 0 0 0 ...
summary(Data)
##    Estados              Salary         Spending           D2        
##  Length:51          Min.   :35378   Min.   : 5347   Min.   :0.0000  
##  Class :character   1st Qu.:42973   1st Qu.: 7824   1st Qu.:0.0000  
##  Mode  :character   Median :45941   Median : 8622   Median :0.0000  
##                     Mean   :48069   Mean   : 9241   Mean   :0.4118  
##                     3rd Qu.:53298   3rd Qu.:10102   3rd Qu.:1.0000  
##                     Max.   :63640   Max.   :15508   Max.   :1.0000  
##        D3        
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :0.0000  
##  Mean   :0.3333  
##  3rd Qu.:1.0000  
##  Max.   :1.0000

Permite explorar y entender el conjunto de datos antes de hacer cualquier análisis.

head(Data,10)
## # A tibble: 10 × 5
##    Estados       Salary Spending    D2    D3
##    <chr>          <dbl>    <dbl> <dbl> <dbl>
##  1 Connecticut    60822    12436     1     0
##  2 Illinois       58246     9275     1     0
##  3 Indiana        47831     8935     1     0
##  4 Iowa           43130     7807     1     0
##  5 Kansas         43334     8373     1     0
##  6 Maine          41596    11285     1     0
##  7 Massachusetts  58624    12596     1     0
##  8 Michigan       54895     9880     1     0
##  9 Minnesota      49634     9675     1     0
## 10 Missouri       41839     7840     1     0

Ver las primeras 10 filas del data frame (Data). Es una forma rápida de inspeccionar cómo están organizadas las observaciones y detectar errores o formatos inesperados.

3. Crear una Variable DUMMY ————————————————-

# EJEMPLO

datos <- data.frame(
  nombre = c("Ana", "Luis", "Carla", "Pedro"),
  genero = c("F", "M", "F", "M")
)

# Opción 1: Usar ifelse()
datos$dummy_mujer <- ifelse(datos$genero == "F", 1, 0)
# Opción 2: Usar as.numeric() con lógica booleana 
datos$dummy_masculino <- as.numeric(datos$genero == "M")
# Opción 3: Crear dummies para varias categorías (con model.matrix)
# Si la variable tiene más de dos categorías (por ejemplo: "soltero", "casado", "divorciado") y quieres varias dummies:

datos$estado_civil <- c("soltero", "casado", "soltero", "divorciado")
dummies <- model.matrix(~ estado_civil - 1, data = datos)
# Eso te dará un data frame con una columna por cada categoría (sin intercepto por el -1).
dummies <- data.frame(dummies)

4. Caso aplicado ————————————————————

  1. Crear la variable categórica region a partir de las dummies D2 y D3
# Crear variable 'region' según dummies
Data$region <- with(Data, ifelse(D2 == 1, "Noreste_NorteCentro",
                                     ifelse(D3 == 1, "Sur", "Oeste")))
Data$region <- factor(Data$region)

### R, por defecto, usa la primera categoría alfabéticamente como la referencia (base). En este caso, "Noreste_NorteCentro" aparece antes que "Oeste" y "Sur"

# Convertir a factor (variable categórica)
Data$region <- factor(Data$region, levels = c("Oeste", "Noreste_NorteCentro", "Sur"))
#Esto define el orden de niveles y fuerza que "Oeste" sea la base de comparación en el modelo.
# Revisar tabla de frecuencia para confirmar
table(Data$region)
## 
##               Oeste Noreste_NorteCentro                 Sur 
##                  13                  21                  17
levels(Data$region)
## [1] "Oeste"               "Noreste_NorteCentro" "Sur"

2. Análisis de los modelos ————————————————–

2.1. Modelo ANOVA con 1 variable cualitativa (Región)

# Ajustar modelo lineal con variable categórica - MODELO
modelo_anova <- lm(Salary ~ region, data = Data)

# Resumen del modelo
summary(modelo_anova)
## 
## Call:
## lm(formula = Salary ~ region, data = Data)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -14161  -4566  -1638   4632  15625 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  48015       1857  25.853   <2e-16 ***
## regionNoreste_NorteCentro     1524       2363   0.645    0.522    
## regionSur                    -1721       2467  -0.698    0.489    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6696 on 48 degrees of freedom
## Multiple R-squared:  0.04397,    Adjusted R-squared:  0.004134 
## F-statistic: 1.104 on 2 and 48 DF,  p-value: 0.3399

Interpretación:

Se creó un modelo lineal donde el salario depende de la región (variable categórica) con el fin de realizar el análisis ANOVA, el cual muestra que los coeficientes de las regiones indican la diferencia promedio de salario respecto a la categoría base (por defecto, “Centro” si está primero alfabéticamente).

Recuerda:

# Prueba ANOVA
anova(modelo_anova)
## Analysis of Variance Table
## 
## Response: Salary
##           Df     Sum Sq  Mean Sq F value Pr(>F)
## region     2   98985177 49492589  1.1038 0.3399
## Residuals 48 2152304189 44839671

Permite evaluar si hay diferencias globales significativas entre los grupos de la variable categórica.

El análisis de varianza muestra que no hay diferencias estadísticamente significativas en el salario promedio de los maestros entre las regiones consideradas (F = 1.10, p = 0.3399). Es decir, la región no influye de manera significativa en el salario docente.

# Paso 4: Ver resumen del modelo
summary(modelo_anova)
## 
## Call:
## lm(formula = Salary ~ region, data = Data)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -14161  -4566  -1638   4632  15625 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  48015       1857  25.853   <2e-16 ***
## regionNoreste_NorteCentro     1524       2363   0.645    0.522    
## regionSur                    -1721       2467  -0.698    0.489    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6696 on 48 degrees of freedom
## Multiple R-squared:  0.04397,    Adjusted R-squared:  0.004134 
## F-statistic: 1.104 on 2 and 48 DF,  p-value: 0.3399
# Paso 5: Prueba ANOVA para comparar grupos
anova(modelo_anova)
## Analysis of Variance Table
## 
## Response: Salary
##           Df     Sum Sq  Mean Sq F value Pr(>F)
## region     2   98985177 49492589  1.1038 0.3399
## Residuals 48 2152304189 44839671

Interpretación:

El p-value: 0.3399 > 0.05 → No hay evidencia estadística suficiente para rechazar la hipótesis nula. Por ende, no existen diferencias estadísticamente significativas en los salarios promedio entre las regiones.

2.2. Gráfico Boxplot

# Cargar librería para gráficos 
library(ggplot2)

# Boxplot de Salario por region
ggplot(Data, aes(x = region, y = Salary, fill = region)) +
  geom_boxplot() +
  labs(title = "Distribución de salarios por región", x = "Región", y = "Salario") +
  theme_minimal()

Interpretación:

El gráfico boxplot permite observar la dispersión y mediana de los salarios por región.

Como muestra la tabla ANOVA (Pr(>F) = 0.3399), estas diferencias no son estadísticamente significativas al 5%, por lo que no se puede concluir que la región influya de forma significativa en el salario.

2.2.1. Boxplot con intervalos de confianza

library(ggplot2)
library(dplyr)

# Calcular medias y errores estándar por región
summary_stats <- Data %>%
  group_by(region) %>%
  summarise(
    mean_salary = mean(Salary),
    sd_salary = sd(Salary),
    n = n(),
    se = sd_salary / sqrt(n)
  )

# Gráfico de medias con barras de error (±1.96*SE para 95% IC)
ggplot(summary_stats, aes(x = region, y = mean_salary, fill = region)) +
  geom_col(width = 0.6) +
  geom_errorbar(aes(ymin = mean_salary - 1.96 * se,
                    ymax = mean_salary + 1.96 * se),
                width = 0.2) +
  labs(title = "Salario promedio por región con Intervalo de Confianza 95%",
       x = "Región",
       y = "Salario promedio (USD)") +
  theme_minimal() +
  theme(legend.position = "none")

2.2.4. Gráfico de puntos (dot plot) con dispersión horizontal (jitter) para datos categóricos

ggplot(Data, aes(x = region, y = Salary, color = region)) +
  geom_jitter(width = 0.2, alpha = 0.7) +
  labs(title = "Salarios de Maestros por Región",
       x = "Región",
       y = "Salario") +
  theme_minimal() +
  theme(legend.position = "none")

3. Modelo ANOVA con 2 variables cualitativas ————————————————————

rm(list= ls())
Data <- read_excel("C:/Users/Jimmy Cueva/Desktop/R para finanzas/Econometría/Variables Dummy/Base_2_cualitativas.xlsx")
head(Data)
## # A tibble: 6 × 3
##   Salario_Hora Estado_Civil Region
##          <dbl> <chr>        <chr> 
## 1         8.03 Casado       Sur   
## 2         6.56 No Casado    Sur   
## 3         9.24 No Casado    No Sur
## 4         8.23 Casado       Sur   
## 5         8.97 Casado       Sur   
## 6         9.26 No Casado    No Sur
# Genrar variable Dummies
Data$D2 <- ifelse(Data$Estado_Civil == "Casado", 1, 0)
Data$D3 <- ifelse(Data$Region == "Sur", 1, 0)
names(Data)[1] <- "Salario_hora"
# Modelo con las dos variables dummy D2 y D3
modelo_dos_dummies <- lm(Salario_hora ~ D2 + D3, data = Data)

# Resumen del modelo
summary(modelo_dos_dummies)
## 
## Call:
## lm(formula = Salario_hora ~ D2 + D3, data = Data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.54793 -0.32069  0.01767  0.30630  1.38442 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  8.79178    0.03478  252.77   <2e-16 ***
## D2           1.08715    0.04089   26.59   <2e-16 ***
## D3          -1.63845    0.04087  -40.09   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4695 on 525 degrees of freedom
## Multiple R-squared:  0.8152, Adjusted R-squared:  0.8145 
## F-statistic:  1158 on 2 and 525 DF,  p-value: < 2.2e-16

Recuerda:

# Prueba ANOVA para este modelo
anova(modelo_dos_dummies)
## Analysis of Variance Table
## 
## Response: Salario_hora
##            Df Sum Sq Mean Sq F value    Pr(>F)    
## D2          1 156.06  156.06  708.06 < 2.2e-16 ***
## D3          1 354.28  354.28 1607.41 < 2.2e-16 ***
## Residuals 525 115.71    0.22                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Recuerda:

Para D2 el p-valor es 0.196, mayor que el nivel común de significancia 0.05 → No se rechaza H0 → No hay evidencia significativa de que D2 afecte el salario. Para D3 el p-valor es 0.489, también mayor que 0.05 → No se rechaza H0.

4. Modelo ANCOVA ————————————————————

4.1. Crear el dataframe

rm(list=ls())
Data <- read_excel("Table 9_1.xlsx", col_types = c("text", 
                                                   "numeric", "numeric", "numeric", "numeric"))
Data$region <- with(Data, ifelse(D2 == 1, "Noreste_NorteCentro",
                                 ifelse(D3 == 1, "Sur", "Oeste")))
Data$region <- factor(Data$region, 
                      levels = c("Oeste", "Noreste_NorteCentro", "Sur"))

4.2. Modelo ANCOVA básico (sin interacción)

# Ajustar el modelo ANCOVA sin interacción
modelo_ancova <- lm(Salary ~ Spending + D2 + D3, data = Data)

# Resumen del modelo
summary(modelo_ancova)
## 
## Call:
## lm(formula = Salary ~ Spending + D2 + D3, data = Data)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -10556  -2471    106   2066  15084 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 28694.9180  3262.5213   8.795 1.70e-11 ***
## Spending        2.3404     0.3592   6.515 4.45e-08 ***
## D2          -2954.1268  1862.5756  -1.586   0.1194    
## D3          -3112.1948  1819.8725  -1.710   0.0938 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4905 on 47 degrees of freedom
## Multiple R-squared:  0.4977, Adjusted R-squared:  0.4656 
## F-statistic: 15.52 on 3 and 47 DF,  p-value: 3.762e-07

Interpretación:

4.2.1. Gráfico de residuos del modelo ANCOVA

# Gráfico de residuos
plot(modelo_ancova, which = 1)  # Residuos vs valores ajustados

# ANOVA del modelo
anova(modelo_ancova)
## Analysis of Variance Table
## 
## Response: Salary
##           Df     Sum Sq    Mean Sq F value    Pr(>F)    
## Spending   1 1037678493 1037678493 43.1251 3.714e-08 ***
## D2         1   12324668   12324668  0.5122   0.47773    
## D3         1   70369486   70369486  2.9245   0.09384 .  
## Residuals 47 1130916720   24062058                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretación:

4.3. Modelo ANCOVA con interacción

# Modelo con interacción entre Spending y las dummies D2 y D3
# Nos permite para verificar si la pendiente de Spending varía entre grupos)

modelo_interaccion <- lm(Salary ~ Spending * (D2 + D3), data = Data)

# Resumen del modelo con interacción
summary(modelo_interaccion)
## 
## Call:
## lm(formula = Salary ~ Spending * (D2 + D3), data = Data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11234.8  -2617.9   -268.5   2100.8  15217.0 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.344e+04  6.742e+03   4.960 1.05e-05 ***
## Spending     1.766e+00  7.999e-01   2.208   0.0324 *  
## D2          -1.387e+04  8.906e+03  -1.558   0.1264    
## D3          -4.873e+03  8.526e+03  -0.571   0.5705    
## Spending:D2  1.182e+00  9.779e-01   1.208   0.2332    
## Spending:D3  2.375e-01  9.848e-01   0.241   0.8105    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4904 on 45 degrees of freedom
## Multiple R-squared:  0.5193, Adjusted R-squared:  0.4659 
## F-statistic: 9.722 on 5 and 45 DF,  p-value: 2.402e-06

Interpretación:

4.3.1. Gráfico de dispersión

library(ggplot2)

# Crear una nueva variable de región
Data$Region <- factor(ifelse(Data$D2 == 1, "D2",
                             ifelse(Data$D3 == 1, "D3", "D1")))

# Graficar
ggplot(Data, aes(x = Spending, y = Salary, color = Region)) +
  geom_point(size = 2) +
  geom_smooth(method = "lm", formula = y ~ x, se = FALSE) +
  labs(title = "Interacción: Salary vs Spending según Región",
       x = "Gasto en capacitación (Spending)",
       y = "Salario",
       color = "Región") +
  theme_minimal()

Gráfico de dispersión (scatter plot) con líneas de regresión lineal ajustadas para cada grupo de región (D1, D2, D3).

4.3.2. Efecto parcial de ‘Spending’ sobre ‘Salary’

library(effects)
plot(allEffects(modelo_ancova))

Spending effect plot :

Relación positiva: A medida que aumenta el gasto (Spending), el salario también aumenta.

Intervalo de confianza (sombra azul): Confirma que el efecto es estadísticamente significativo, ya que el intervalo no incluye una pendiente plana.

D2 effect plot (Región Noreste):

Interpretación: En comparación con la región base (Oeste), la región Noreste muestra un menor salario promedio, controlando por el gasto.

Pendiente negativa: Indica que la región Noreste tiene un efecto reductor sobre el salario esperado.

D3 effect plot (Región Sur) :

Efecto también negativo: Similar a la región Noreste, pertenecer a la región Sur (D3 = 1) está asociado con salarios más bajos, aunque con un intervalo de confianza más amplio (mayor incertidumbre).

Conclusión general:

El gasto tiene un efecto positivo claro sobre el salario.

Las regiones Noreste (D2) y Sur (D3) tienen efectos negativos sobre el salario, lo que sugiere posibles desigualdades salariales regionales, controlando por gasto.

Si la prueba de Chow mostró que las pendientes no difieren significativamente, entonces el modelo sin interacción es suficiente; es decir, el efecto del gasto es el mismo sin importar la región, pero el nivel base del salario sí varía según la región.

4.4. Anova del modelo con interacción

anova(modelo_interaccion)
## Analysis of Variance Table
## 
## Response: Salary
##             Df     Sum Sq    Mean Sq F value    Pr(>F)    
## Spending     1 1037678493 1037678493 43.1482 4.455e-08 ***
## D2           1   12324668   12324668  0.5125   0.47777    
## D3           1   70369486   70369486  2.9261   0.09405 .  
## Spending:D2  1   47304106   47304106  1.9670   0.16763    
## Spending:D3  1    1398949    1398949  0.0582   0.81051    
## Residuals   45 1082213666   24049193                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretación:

4.5. Comparación de modelos:

anova(modelo_ancova, modelo_interaccion)
## Analysis of Variance Table
## 
## Model 1: Salary ~ Spending + D2 + D3
## Model 2: Salary ~ Spending * (D2 + D3)
##   Res.Df        RSS Df Sum of Sq      F Pr(>F)
## 1     47 1130916720                           
## 2     45 1082213666  2  48703055 1.0126 0.3714

Interpretación:

library(ggplot2)

# Añadir predicciones de ambos modelos
Data$pred_sin_interaccion <- predict(modelo_ancova)
Data$pred_con_interaccion <- predict(modelo_interaccion)

# Convertir las dummies en factor para facilitar el gráfico
Data$Grupo <- factor(with(Data, ifelse(D2 == 1, "D2", ifelse(D3 == 1, "D3", "D1"))))

# Gráfico
ggplot(Data, aes(x = Spending, y = Salary, color = Grupo)) +
  geom_point() +
  geom_line(aes(y = pred_sin_interaccion, linetype = "Sin interacción")) +
  geom_line(aes(y = pred_con_interaccion, linetype = "Con interacción")) +
  labs(title = "Comparación de modelos ANCOVA vs. Interacción",
       y = "Salary", linetype = "Modelo") +
  theme_minimal()

5. La variable dicótoma alternativa a la prueba de Chow

La prueba de Chow sirve para verificar si dos o más grupos (por ejemplo, dos períodos de tiempo o dos regiones) tienen coeficientes de regresión diferentes en un modelo lineal. Es útil para detectar rupturas estructurales o si la relación entre variables cambia entre grupos.

# Modelo sin interacción (hipótesis nula: mismas pendientes)
modelo_ancova <- lm(Salary ~ Spending + D2 + D3, data = Data)

# Modelo con interacción (hipótesis alternativa: pendientes diferentes)
modelo_chow <- lm(Salary ~ Spending * (D2 + D3), data = Data)

# Prueba de Chow (comparación anova entre ambos modelos)
anova(modelo_ancova, modelo_chow)
## Analysis of Variance Table
## 
## Model 1: Salary ~ Spending + D2 + D3
## Model 2: Salary ~ Spending * (D2 + D3)
##   Res.Df        RSS Df Sum of Sq      F Pr(>F)
## 1     47 1130916720                           
## 2     45 1082213666  2  48703055 1.0126 0.3714

Interpretación:

5.1. Ejemplo con dummy D3 y Spending

# Crear dataframe
library(dplyr)
data_chow <- Data %>% select(Salary, Spending, D3)

# Ajustar modelo sin interacción
modelo_sin_inter <- lm(Salary ~ Spending + D3, data = data_chow)

# Ajustar modelo con interacción
modelo_con_inter <- lm(Salary ~ Spending * D3, data = data_chow)

# Comparar modelos (prueba tipo Chow)
anova(modelo_sin_inter, modelo_con_inter)
## Analysis of Variance Table
## 
## Model 1: Salary ~ Spending + D3
## Model 2: Salary ~ Spending * D3
##   Res.Df        RSS Df Sum of Sq      F Pr(>F)
## 1     48 1191445676                           
## 2     47 1189680544  1   1765132 0.0697 0.7929

Interpretación:

5.2. Ejemplo con: D2 (“Noreste y Norte-centro” vs otras regiones)

# Crear dataframe
data_chow_D2 <- Data %>% select(Salary, Spending, D2)

# Modelo sin interacción
modelo_sin_inter_D2 <- lm(Salary ~ Spending + D2, data = data_chow_D2)

# Modelo con interacción (prueba tipo Chow)
modelo_con_inter_D2 <- lm(Salary ~ Spending * D2, data = data_chow_D2)

# Prueba de Chow (comparación de modelos)
anova(modelo_sin_inter_D2, modelo_con_inter_D2)
## Analysis of Variance Table
## 
## Model 1: Salary ~ Spending + D2
## Model 2: Salary ~ Spending * D2
##   Res.Df        RSS Df Sum of Sq      F Pr(>F)
## 1     48 1201286206                           
## 2     47 1142643361  1  58642845 2.4121 0.1271

Recuerda:

6. Regresión lineal con líneas por región (D2 y D3)

# Primero, convertir las variables dicotómicas en una variable categórica
Data$region <- factor(
  ifelse(Data$D2 == 1, "Noreste_NorteCentro",
         ifelse(Data$D3 == 1, "Sur", "Oeste"))
)

# Gráfico
library(ggplot2)
ggplot(Data, aes(x = Spending, y = Salary, color = region)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Relación entre Gasto y Salario por Región (ANCOVA)",
       x = "Spending (Gasto)",
       y = "Salary (Salario)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

7. Regresión por segementos

rm(list=ls())
library(readxl)
Data <- read_excel("Table 9_1.xlsx", col_types = c("text", 
    "numeric", "numeric", "numeric", "numeric"))
View(Data)
# Crear dummy de quiebre
Data$Segmento <- ifelse(Data$Spending > 10000, 1, 0)

# Regresión segmentada
modelo_segmentos <- lm(Salary ~ Spending + Segmento + Spending:Segmento, data = Data)
summary(modelo_segmentos)
## 
## Call:
## lm(formula = Salary ~ Spending + Segmento + Spending:Segmento, 
##     data = Data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11128.9  -2954.9    337.6   2774.8  17186.6 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       26797.6768  6295.5656   4.257 9.84e-05 ***
## Spending              2.3163     0.7600   3.048  0.00378 ** 
## Segmento           4343.8749 12482.8969   0.348  0.72940    
## Spending:Segmento    -0.4037     1.1733  -0.344  0.73233    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5075 on 47 degrees of freedom
## Multiple R-squared:  0.4623, Adjusted R-squared:  0.428 
## F-statistic: 13.47 on 3 and 47 DF,  p-value: 1.797e-06

Esto implica definir un punto de quiebre (por ejemplo, para gasto mayor o menor a 10,000) y crear dummies de corte.