Está en la página 1de 74

Sesion 1: Regresion lineal simple

Sergio Diaz

2023-06-03

1. Analisis exploratorio de datos(EDA)


Antes de iniciar cualquier analisis econometrico debemos comenzar explorando el data frame, aunque hay
elementos en comun debemos comenzar identificando el tipo de dato que estamos analizando.

• Corte transversal
• Serie de tiempo
• Datos de panel

complementariamente deberemos revisar tambien:

• Valores atipicos
• Valores faltantes
• Matriz de correlacion

1.1 Datos de corte transversal

df_corte <- read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbBA

El objeto df_corte es un data frame con informacion de la poblacion, pbipercapita y expectativa de vida
en diversos paises del mundo.

1.1.1 Valores atipicos y faltantes

summary(df_corte)

## country continent pop gdpPercap


## Length:142 Length:142 Min. :1.996e+05 Min. : 277.6
## Class :character Class :character 1st Qu.:4.508e+06 1st Qu.: 1624.8
## Mode :character Mode :character Median :1.052e+07 Median : 6124.4
## Mean :4.402e+07 Mean :11680.1
## 3rd Qu.:3.121e+07 3rd Qu.:18008.8
## Max. :1.319e+09 Max. :49357.2
## lifeExp
## Min. :39.61

1
## 1st Qu.:57.16
## Median :71.94
## Mean :67.01
## 3rd Qu.:76.41
## Max. :82.60

1.1.2 Matriz de correlacion

Aqui se aplico la funcion subset para seleccionar columnas, el criterio de seleccion se llevo a cabo por la
funcion apply bajo la respuesta de si la columna es o no de formato numerico.

df_corte_num <- subset(df_corte, select = sapply(df_corte, is.numeric))


cor(df_corte_num)

## pop gdpPercap lifeExp


## pop 1.00000000 -0.0556756 0.04755312
## gdpPercap -0.05567560 1.0000000 0.67866240
## lifeExp 0.04755312 0.6786624 1.00000000

Este resultado sugiere una relacion entre la expectativa de vida y el pbi percapita.

1.1.3 Matriz de dispercion

pairs.panels(df_corte_num, pch=21)

0 10000 30000 50000

pop

8.0e+08
−0.06 0.05
0.0e+00
50000

gdpPercap
0.68
20000
0

40 50 60 70 80

lifeExp

0.0e+00 6.0e+08 1.2e+09 40 50 60 70 80

2
1.2 Datos de Series de tiempo

df_series <- read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vR957LOSSTdus8Sw0y_A24EJTlh67E_Sf

El objeto df_series es un data frame con informacion de los componentes del PBI de Peru.

1.2.1 Valores atipicos y faltantes

summary(df_series)

## t Consumo Gasto Inversion


## Length:92 Min. :34942 Min. : 5443 Min. : 5664
## Class :character 1st Qu.:42382 1st Qu.: 7489 1st Qu.:13068
## Mode :character Median :63592 Median :10742 Median :25434
## Mean :62684 Mean :11337 Mean :21898
## 3rd Qu.:80647 3rd Qu.:13787 3rd Qu.:30160
## Max. :96327 Max. :23551 Max. :36006
## Exportaciones Importaciones PBI
## Min. :13624 Min. : 9847 Min. : 51760
## 1st Qu.:22024 1st Qu.:14185 1st Qu.: 70735
## Median :27691 Median :26988 Median :100821
## Mean :26913 Mean :23876 Mean : 98955
## 3rd Qu.:31496 3rd Qu.:32070 3rd Qu.:125322
## Max. :39290 Max. :36453 Max. :149423

1.2.2 Matriz de correlacion

Aqui se aplico la funcion subset para seleccionar columnas, el criterio de seleccion se llevo a cabo por la
funcion apply bajo la respuesta de si la columna es o no de formato numerico.

df_series_num <- subset(df_series, select = sapply(df_series, is.numeric))


cor(df_series_num)

## Consumo Gasto Inversion Exportaciones Importaciones


## Consumo 1.0000000 0.8956594 0.9057511 0.9195659 0.9645083
## Gasto 0.8956594 1.0000000 0.8252331 0.8755439 0.8712655
## Inversion 0.9057511 0.8252331 1.0000000 0.8807637 0.9663930
## Exportaciones 0.9195659 0.8755439 0.8807637 1.0000000 0.9378032
## Importaciones 0.9645083 0.8712655 0.9663930 0.9378032 1.0000000
## PBI 0.9886638 0.9282907 0.9363290 0.9517672 0.9740907
## PBI
## Consumo 0.9886638
## Gasto 0.9282907
## Inversion 0.9363290
## Exportaciones 0.9517672
## Importaciones 0.9740907
## PBI 1.0000000

Este resultado sugiere una relacion entre el PBI y el consumo.

3
1.2.3 Matriz de dispercion

pairs.panels(df_series_num, pch=21)

5000 15000 15000 30000 60000 120000

Consumo
0.90 0.91 0.92 0.96 0.99

40000
Gasto
0.83 0.88 0.87 0.93
5000

35000
Inversion
0.88 0.97 0.94

5000
Exportaciones
0.94 0.95
15000

Importaciones
0.97

10000
PBI
60000

40000 80000 5000 25000 10000 25000

1.2.4 Comportamiento de la serie

plot(df_series_num$PBI,type="l",col="red", ylim = c(0, max(df_series$PBI)))


lines(df_series_num$Consumo,col="blue")

4
150000
df_series_num$PBI

100000
50000
0

0 20 40 60 80

Index

1.3 Datos de panel

df_panel <- read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbBA

El objeto df_series es un data frame con informacion de PBI percapita, poblacion y expectativa de vida
para varios años.

table(df_panel$country,df_panel$continent)

##
## Africa Americas Asia Europe Oceania
## Afghanistan 0 0 12 0 0
## Albania 0 0 0 12 0
## Algeria 12 0 0 0 0
## Angola 12 0 0 0 0
## Argentina 0 12 0 0 0
## Australia 0 0 0 0 12
## Austria 0 0 0 12 0
## Bahrain 0 0 12 0 0
## Bangladesh 0 0 12 0 0
## Belgium 0 0 0 12 0
## Benin 12 0 0 0 0
## Bolivia 0 12 0 0 0

5
## Bosnia and Herzegovina 0 0 0 12 0
## Botswana 12 0 0 0 0
## Brazil 0 12 0 0 0
## Bulgaria 0 0 0 12 0
## Burkina Faso 12 0 0 0 0
## Burundi 12 0 0 0 0
## Cambodia 0 0 12 0 0
## Cameroon 12 0 0 0 0
## Canada 0 12 0 0 0
## Central African Republic 12 0 0 0 0
## Chad 12 0 0 0 0
## Chile 0 12 0 0 0
## China 0 0 12 0 0
## Colombia 0 12 0 0 0
## Comoros 12 0 0 0 0
## Congo, Dem. Rep. 12 0 0 0 0
## Congo, Rep. 12 0 0 0 0
## Costa Rica 0 12 0 0 0
## Cote d’Ivoire 12 0 0 0 0
## Croatia 0 0 0 12 0
## Cuba 0 12 0 0 0
## Czech Republic 0 0 0 12 0
## Denmark 0 0 0 12 0
## Djibouti 12 0 0 0 0
## Dominican Republic 0 12 0 0 0
## Ecuador 0 12 0 0 0
## Egypt 12 0 0 0 0
## El Salvador 0 12 0 0 0
## Equatorial Guinea 12 0 0 0 0
## Eritrea 12 0 0 0 0
## Ethiopia 12 0 0 0 0
## Finland 0 0 0 12 0
## France 0 0 0 12 0
## Gabon 12 0 0 0 0
## Gambia 12 0 0 0 0
## Germany 0 0 0 12 0
## Ghana 12 0 0 0 0
## Greece 0 0 0 12 0
## Guatemala 0 12 0 0 0
## Guinea 12 0 0 0 0
## Guinea-Bissau 12 0 0 0 0
## Haiti 0 12 0 0 0
## Honduras 0 12 0 0 0
## Hong Kong, China 0 0 12 0 0
## Hungary 0 0 0 12 0
## Iceland 0 0 0 12 0
## India 0 0 12 0 0
## Indonesia 0 0 12 0 0
## Iran 0 0 12 0 0
## Iraq 0 0 12 0 0
## Ireland 0 0 0 12 0
## Israel 0 0 12 0 0
## Italy 0 0 0 12 0
## Jamaica 0 12 0 0 0

6
## Japan 0 0 12 0 0
## Jordan 0 0 12 0 0
## Kenya 12 0 0 0 0
## Korea, Dem. Rep. 0 0 12 0 0
## Korea, Rep. 0 0 12 0 0
## Kuwait 0 0 12 0 0
## Lebanon 0 0 12 0 0
## Lesotho 12 0 0 0 0
## Liberia 12 0 0 0 0
## Libya 12 0 0 0 0
## Madagascar 12 0 0 0 0
## Malawi 12 0 0 0 0
## Malaysia 0 0 12 0 0
## Mali 12 0 0 0 0
## Mauritania 12 0 0 0 0
## Mauritius 12 0 0 0 0
## Mexico 0 12 0 0 0
## Mongolia 0 0 12 0 0
## Montenegro 0 0 0 12 0
## Morocco 12 0 0 0 0
## Mozambique 12 0 0 0 0
## Myanmar 0 0 12 0 0
## Namibia 12 0 0 0 0
## Nepal 0 0 12 0 0
## Netherlands 0 0 0 12 0
## New Zealand 0 0 0 0 12
## Nicaragua 0 12 0 0 0
## Niger 12 0 0 0 0
## Nigeria 12 0 0 0 0
## Norway 0 0 0 12 0
## Oman 0 0 12 0 0
## Pakistan 0 0 12 0 0
## Panama 0 12 0 0 0
## Paraguay 0 12 0 0 0
## Peru 0 12 0 0 0
## Philippines 0 0 12 0 0
## Poland 0 0 0 12 0
## Portugal 0 0 0 12 0
## Puerto Rico 0 12 0 0 0
## Reunion 12 0 0 0 0
## Romania 0 0 0 12 0
## Rwanda 12 0 0 0 0
## Sao Tome and Principe 12 0 0 0 0
## Saudi Arabia 0 0 12 0 0
## Senegal 12 0 0 0 0
## Serbia 0 0 0 12 0
## Sierra Leone 12 0 0 0 0
## Singapore 0 0 12 0 0
## Slovak Republic 0 0 0 12 0
## Slovenia 0 0 0 12 0
## Somalia 12 0 0 0 0
## South Africa 12 0 0 0 0
## Spain 0 0 0 12 0
## Sri Lanka 0 0 12 0 0

7
## Sudan 12 0 0 0 0
## Swaziland 12 0 0 0 0
## Sweden 0 0 0 12 0
## Switzerland 0 0 0 12 0
## Syria 0 0 12 0 0
## Taiwan 0 0 12 0 0
## Tanzania 12 0 0 0 0
## Thailand 0 0 12 0 0
## Togo 12 0 0 0 0
## Trinidad and Tobago 0 12 0 0 0
## Tunisia 12 0 0 0 0
## Turkey 0 0 0 12 0
## Uganda 12 0 0 0 0
## United Kingdom 0 0 0 12 0
## United States 0 12 0 0 0
## Uruguay 0 12 0 0 0
## Venezuela 0 12 0 0 0
## Vietnam 0 0 12 0 0
## West Bank and Gaza 0 0 12 0 0
## Yemen, Rep. 0 0 12 0 0
## Zambia 12 0 0 0 0
## Zimbabwe 12 0 0 0 0

1.3.1 Valores atipicos y faltantes

summary(df_panel)

## country continent year pop


## Length:1704 Length:1704 Min. :1952 Min. :6.001e+04
## Class :character Class :character 1st Qu.:1966 1st Qu.:2.794e+06
## Mode :character Mode :character Median :1980 Median :7.024e+06
## Mean :1980 Mean :2.960e+07
## 3rd Qu.:1993 3rd Qu.:1.959e+07
## Max. :2007 Max. :1.319e+09
## gdpPercap lifeExp
## Min. : 241.2 Min. :23.60
## 1st Qu.: 1202.1 1st Qu.:48.20
## Median : 3531.8 Median :60.71
## Mean : 7215.3 Mean :59.47
## 3rd Qu.: 9325.5 3rd Qu.:70.85
## Max. :113523.1 Max. :82.60

1.3.2 Matriz de correlacion

Aqui se aplico la funcion subset para seleccionar columnas, el criterio de seleccion se llevo a cabo por la
funcion apply bajo la respuesta de si la columna es o no de formato numerico.

df_panel_num <- subset(df_panel, select = sapply(df_panel, is.numeric))


cor(df_panel_num)

## year pop gdpPercap lifeExp

8
## year 1.00000000 0.08230808 0.22731807 0.43561122
## pop 0.08230808 1.00000000 -0.02559958 0.06495537
## gdpPercap 0.22731807 -0.02559958 1.00000000 0.58370622
## lifeExp 0.43561122 0.06495537 0.58370622 1.00000000

Este resultado sugiere una relacion entre el pbi percapita y la expectativa de vida.

1.3.3 Matriz de dispercion

pairs.panels(df_panel_num, pch=21)

0.0e+00 6.0e+08 1.2e+09 30 50 70

year

1980
0.08 0.23 0.44

1950
0.0e+00 1.0e+09

pop
−0.03 0.06
gdpPercap

8e+04
0.58

0e+00
lifeExp
30 50 70

1950 1970 1990 0e+00 6e+04

1.3.4 Dimencion de los datos

Las variables en los datos de panel se veen como un desarrollo de varias unidades en el tiempo.

dcast(df_panel[df_panel$continent=="Oceania",],formula = "country ~ year",value.var = "lifeExp")

## country 1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 2002
## 1 Australia 69.12 70.33 70.93 71.10 71.93 73.49 74.74 76.32 77.56 78.83 80.37
## 2 New Zealand 69.39 70.26 71.24 71.52 71.89 72.22 73.84 74.32 76.33 77.55 79.11
## 2007
## 1 81.235
## 2 80.204

9
dcast(df_panel[df_panel$continent=="Oceania",],formula = "country ~ year",value.var = "gdpPercap")

## country 1952 1957 1962 1967 1972 1977 1982


## 1 Australia 10039.60 10949.65 12217.23 14526.12 16788.63 18334.20 19477.01
## 2 New Zealand 10556.58 12247.40 13175.68 14463.92 16046.04 16233.72 17632.41
## 1987 1992 1997 2002 2007
## 1 21888.89 23424.77 26997.94 30687.75 34435.37
## 2 19007.19 18363.32 21050.41 23189.80 25185.01

2. Regresion lineal simple

2.1 Corte transversal

2.1.1 Modelo

lif eexpi = β0 + β1 gdpP ercapi

m_corte <- lm(lifeExp ~ gdpPercap,df_corte)


summary(m_corte)

##
## Call:
## lm(formula = lifeExp ~ gdpPercap, data = df_corte)
##
## Residuals:
## Min 1Q Median 3Q Max
## -22.828 -6.316 1.922 6.898 13.128
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.957e+01 1.010e+00 58.95 <2e-16 ***
## gdpPercap 6.371e-04 5.827e-05 10.93 <2e-16 ***
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 8.899 on 140 degrees of freedom
## Multiple R-squared: 0.4606, Adjusted R-squared: 0.4567
## F-statistic: 119.5 on 1 and 140 DF, p-value: < 2.2e-16

2.1.2 Linea

plot(df_corte$gdpPercap,df_corte$lifeExp)
abline(m_corte, col = "red")

10
80
70
df_corte$lifeExp

60
50
40

0 10000 20000 30000 40000 50000

df_corte$gdpPercap

2.2 Corte transversal

2.2.1 Modelo

Consumot = β0 + β1 P BIt

m_series <- lm(Consumo ~ PBI,df_series)


summary(m_series)

##
## Call:
## lm(formula = Consumo ~ PBI, data = df_series)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5380.3 -2155.3 330.8 1925.3 9203.9
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.684e+03 1.075e+03 -1.567 0.121
## PBI 6.505e-01 1.041e-02 62.468 <2e-16 ***
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##

11
## Residual standard error: 2947 on 90 degrees of freedom
## Multiple R-squared: 0.9775, Adjusted R-squared: 0.9772
## F-statistic: 3902 on 1 and 90 DF, p-value: < 2.2e-16

2.2.2 Linea

plot(df_series$PBI,df_series$Consumo)
abline(m_series, col = "red")
80000
df_series$Consumo

60000
40000

60000 80000 100000 120000 140000

df_series$PBI

2.3 Corte transversal

2.3.1 Modelo

lif eexpit = β0 + β1 gdpP ercapit

m_panel <- lm(lifeExp ~ gdpPercap,df_panel)


summary(m_panel)

##
## Call:
## lm(formula = lifeExp ~ gdpPercap, data = df_panel)
##

12
## Residuals:
## Min 1Q Median 3Q Max
## -82.754 -7.758 2.176 8.225 18.426
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.396e+01 3.150e-01 171.29 <2e-16 ***
## gdpPercap 7.649e-04 2.579e-05 29.66 <2e-16 ***
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 10.49 on 1702 degrees of freedom
## Multiple R-squared: 0.3407, Adjusted R-squared: 0.3403
## F-statistic: 879.6 on 1 and 1702 DF, p-value: < 2.2e-16

2.3.2 Linea

plot(df_panel$gdpPercap,df_panel$lifeExp)
abline(m_panel, col = "red")
80
70
df_panel$lifeExp

60
50
40
30

0e+00 2e+04 4e+04 6e+04 8e+04 1e+05

df_panel$gdpPercap

13
Sesion 2: Regresion lineal multiple

Sergio Diaz

2023-06-04

Regresion polinomial
En ocaciones la relacion entre una variable x e y no estan representados por una linea recta, es por ello que
podemos adaptar nuestro modelo incluyendo diversos grados de potencia de x.

Relaciones no lineales

df = read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vSbq8l_iF6l6-GOPo_bjDtx10obLafWbvZ4RhV00u
plot(df$x,df$y)
14
12
df$y

10
8
6
4

5 10 15

df$x

1
En estos datos podemos ver como hay una evidente relacion entre las variables x e y, sin embargo si evaluamos
esto desde una perspectiva lineal encontraremos que no podra ser identificado por el coeficiente de correlacion
de pearson.

cor(df)

## x y
## x 1.00000000 0.07191547
## y 0.07191547 1.00000000

El resultado nos indica que hay una nula relacion entre ambas variables. Para mejorar esto vamos a darle a
la relacion de x e y el ser mas flexible por medio de sus potencias.

• Polinomio de grado 1:

yi = β 0 + β 1 xi

• Polinomio de grado 2:

yi = β0 + β1 xi + β2 x2i

• Polinomio de grado 3:

yi = β0 + β1 xi + β2 x2i + β3 x3i

• Polinomio de grado 4:

yi = β0 + β1 xi + β2 x2i + β3 x3i + β4 x4i

Creacion de valores cuadraticos, cubicos, . . .

Actualmente solo existen en df dos columnas x e y. El siguien codigo crea nuevas columnas x_2, x_3 y x_4
como las verciones polinomiales de x.

df$x_2 <- df$xˆ2


df$x_3 <- df$xˆ3
df$x_4 <- df$xˆ4
df$x_5 <- df$xˆ5
df$x_6 <- df$xˆ6

Ahora nuestro data frame cuenta con nuevas columnas para ser empleadas en el modelo.

head(df)

2
## x y x_2 x_3 x_4 x_5 x_6
## 1 0.60 15.52 0.3600 0.216000 0.1296000 0.0777600 0.0466560
## 2 0.82 15.16 0.6724 0.551368 0.4521218 0.3707398 0.3040067
## 3 1.12 14.13 1.2544 1.404928 1.5735194 1.7623417 1.9738227
## 4 1.87 10.87 3.4969 6.539203 12.2283096 22.8669390 42.7611759
## 5 1.90 11.84 3.6100 6.859000 13.0321000 24.7609900 47.0458810
## 6 2.11 10.62 4.4521 9.393931 19.8211944 41.8227202 88.2459396

Ahora estimemos los modelos necesarios.

pol1 <- lm(y ~ x,df)


pol2 <- lm(y ~ x + x_2,df)
pol3 <- lm(y ~ x + x_2 + x_3,df)
pol4 <- lm(y ~ x + x_2 + x_3 + x_4,df)
pol5 <- lm(y ~ x + x_2 + x_3 + x_4 + x_5,df)
pol6 <- lm(y ~ x + x_2 + x_3 + x_4 + x_5 + x_6,df)

Los objetos pol1, pol2, pol3 y pol4 tienen informacion de los modelos estimados y podemos obtener
mucha informacion de ellos. Ahora extraeremos los valores ajustados de la recta. por medio del vector
fitted.values presente en estos modelos.

pol4$fitted.values

## 1 2 3 4 5 6 7 8
## 17.116614 15.631749 13.828994 10.330995 10.218324 9.483132 7.367465 7.281249
## 9 10 11 12 13 14 15 16
## 6.679821 6.468449 6.226064 6.194958 6.208712 6.312381 6.338508 6.689787
## 17 18 19 20 21 22 23 24
## 6.978384 7.173423 7.650578 7.799127 7.809075 8.619047 8.844917 8.972454
## 25 26 27 28 29 30 31 32
## 9.395788 9.606804 9.911891 10.081381 10.132175 10.352988 10.393876 10.402162
## 33 34 35 36 37 38 39 40
## 10.444605 10.423397 10.419203 10.276909 10.192949 10.169896 10.081261 9.944090
## 41 42 43 44 45
## 9.935574 9.929372 9.936867 9.942827 10.021776

Antes de graficar si queremos conocer los parametros del modelo solo debemos buscar en el objeto
coefficients.

pol4$coefficients

## (Intercept) x x_2 x_3 x_4


## 21.931604158 -9.018120107 1.729673217 -0.125963151 0.003146755

Lo que debemos hacer es llevar estos numeros a nuestra ecuacion inicial.

yi = 21.93 + −9.02xi + 1.73x2i + −0.13x3i + 0.003x4i

Suavizamiento de la linea de tendencia


Ahora si veamos el cambio en la linea de tendencia

3
par(mfrow=c(1,2))

plot(df$x,df$y,main="Grado 1", xlab = "x", ylab = "y")


lines(df$x,pol1$fitted.values,col="red")

plot(df$x,df$y,main="Grado 2", xlab = "x", ylab = "y")


lines(df$x,pol2$fitted.values,col="red")

Grado 1 Grado 2
14

14
12

12
10

10
y

y
8

8
6

6
4

5 10 15 5 10 15

x x

par(mfrow=c(1,2))

plot(df$x,df$y,main="Grado 3", xlab = "x", ylab = "y")


lines(df$x,pol3$fitted.values,col="red")

plot(df$x,df$y,main="Grado 4", xlab = "x", ylab = "y")


lines(df$x,pol4$fitted.values,col="red")

4
Grado 3 Grado 4
14

14
12

12
10

10
y

y
8

8
6

6
4

5 10 15 4 5 10 15

x x

par(mfrow=c(1,2))

plot(df$x,df$y,main="Grado 5", xlab = "x", ylab = "y")


lines(df$x,pol5$fitted.values,col="red")

plot(df$x,df$y,main="Grado 6", xlab = "x", ylab = "y")


lines(df$x,pol6$fitted.values,col="red")

5
Grado 5 Grado 6
14

14
12

12
10

10
y

y
8

8
6

6
4

5 10 15 4 5 10 15

x x

Criterios de eleccion entre modelos


Como el analisis visual no resulta suficiente se requiere conocer algunas metricas objetivas sobre el ajuste.
Para ello se emplea la funcion summary() para obtener las principales metricas del modelo.

s_pol1 <- summary(pol1)


s_pol2 <- summary(pol2)
s_pol3 <- summary(pol3)
s_pol4 <- summary(pol4)

R cuadrado

El coeficiente de determinación, comúnmente conocido como R cuadrado(R2 ), es una medida estadística


que proporciona información sobre la proporción de la variabilidad de una variable dependiente que puede
ser explicada por una variable independiente o un conjunto de variables independientes en un modelo de
regresión.

print(paste("Polinomio 1: Rcuadrado=",s_pol1$r.squared))

## [1] "Polinomio 1: Rcuadrado= 0.00517183431182067"

6
print(paste("Polinomio 2: Rcuadrado=",s_pol2$r.squared))

## [1] "Polinomio 2: Rcuadrado= 0.280170159438744"

print(paste("Polinomio 3: Rcuadrado=",s_pol3$r.squared))

## [1] "Polinomio 3: Rcuadrado= 0.783911690866406"

print(paste("Polinomio 4: Rcuadrado=",s_pol4$r.squared))

## [1] "Polinomio 4: Rcuadrado= 0.868469940319047"

R cuadrado ajustado

El R cuadrado ajustado es una medida estadística relacionada con el coeficiente de determinación (R


cuadrado) que tiene en cuenta el número de variables independientes en un modelo de regresión. A diferencia
del R cuadrado, que tiende a aumentar al agregar más variables independientes al modelo, el R cuadrado
ajustado penaliza el aumento en el número de variables, evitando la sobreestimación del ajuste del modelo.

print(paste("Polinomio 1: Rcuadrado ajustado=",s_pol1$adj.r.squared))

## [1] "Polinomio 1: Rcuadrado ajustado= -0.0179637044251137"

print(paste("Polinomio 2: Rcuadrado ajustado=",s_pol2$adj.r.squared))

## [1] "Polinomio 2: Rcuadrado ajustado= 0.245892547983446"

print(paste("Polinomio 3: Rcuadrado ajustado=",s_pol3$adj.r.squared))

## [1] "Polinomio 3: Rcuadrado ajustado= 0.768100351173703"

print(paste("Polinomio 4: Rcuadrado ajustado=",s_pol4$adj.r.squared))

## [1] "Polinomio 4: Rcuadrado ajustado= 0.855316934350952"

Variables dummy
Otra manera de incluir una mas variables en un ecuacion que querramos ver en dos dimenciones es por
medio de variables dummy. La cual emplea variables categoricas para poder contribuir con brindarle mayor
informacion al modelo.

Caso de estudio

Una inmobiliaria acaba de finalizar la venta de un proyecto. Debido a las diversas promociones, campañas
y pagos anticipados de los clientes la venta de cada inmueble ha generado distintos ingresos por lo que se
requiere hacer un analisis que nos permita valorizar los atributos de los terrenos vendidos.

7
terrenos = read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbBAO
head(terrenos)

## precio m2 tipo
## 1 40507 91.6 NORMAL
## 2 36811 92.9 CARRETERA
## 3 49010 93.0 PARQUE
## 4 50898 95.4 PARQUE
## 5 34838 87.6 CARRETERA
## 6 53411 95.9 PARQUE

Lo mas evidente en estos casos es observar la relacion entre el precio y el metro cuadrado.

plot(terrenos$m2,terrenos$precio)
50000
terrenos$precio

40000
30000

85 90 95 100 105

terrenos$m2

Efectos categoricos

La relacion es creciente sin embargo no parece haber un buen ajuste de los puntos. Continuamos analizando
los datos y observamos que cada lote es de un tipo distinto:

• Parque: Singnifica que el terreno esta frente a un parque por lo cual se pidio un precio mayor.
• Carretera: Esto singnifica que el lote esta cerca del ruido de una via principal por lo que al ser mas
dificil de vender perdio valor.

8
• Normal: Estos terrenos carecen de una ventaja o desventaja respecto de los otros grupos.

plot(terrenos$m2,terrenos$precio,col=factor(terrenos$tipo))
legend("topleft", legend = c("Parque", "Comun","Carretera"),
col=c("green", "red","black"),
lty = c("solid", "solid", "solid"))

Parque
Comun
Carretera
50000
terrenos$precio

40000
30000

85 90 95 100 105

terrenos$m2

Es evidente que el factor tipo influye en el precio del terreno vendido ya que los terrenos frente a parques
tienen una ventaja y los que estan cerca a la carretera una desventaja. Sin embargo el modelo de regresion
lineal simple se observa:

precioi = β0 + β1 m2i

Segun la grafica la pendiente beta parece ser la misma entre los grupos sin embargo es el intercepto el que
requiere una modificacion. Requeririamos lo siguiente:

• Un modelo para los lotes frente a parques

precioi = βparque + β1 m2i

• Un modelo para los lotes normales

precioi = β0 + β1 m2i

9
• Un modelo para los lotes frente a carreteras

precioi = βcarretera + β1 m2i

Incluso podriamos intuir:

βparque > β0 > βcarretera

Una posible salida seria estimar por separado las rectas de cada grupo, sin embargo correriamos el riesgo de
perjudicar la estimacion de β1 al reducir el tamaño de datos y realizar el proceso por separado.

Variable binaria

Para poder estimar los tres interceptos en un solo proceso de estimacion vamos a recurir ha representar la
columna tipo como 3 variables binarias, es decir que presenten valores de 0 y 1. De tal manera que se
creara una columna parque que tendra valor 1 tenga un parque en frente y 0 en caso contrario. El proceso
se repetira para las otras categorias y en estas nuevas columnas ninguna fila tendra mas de un 1 y tampoco
podra estar compuesta de puros 0.

terrenos$parque <- ifelse(terrenos$tipo == "PARQUE",1,0)


terrenos$normal <- ifelse(terrenos$tipo == "NORMAL",1,0)
terrenos$carretera <- ifelse(terrenos$tipo == "CARRETERA",1,0)
head(terrenos)

## precio m2 tipo parque normal carretera


## 1 40507 91.6 NORMAL 0 1 0
## 2 36811 92.9 CARRETERA 0 0 1
## 3 49010 93.0 PARQUE 1 0 0
## 4 50898 95.4 PARQUE 1 0 0
## 5 34838 87.6 CARRETERA 0 0 1
## 6 53411 95.9 PARQUE 1 0 0

La funcion ifelse() se emplea para evaluar un criterio logico y asignar un resultado especifico cuando
resulte ser verdadero o falso.

Modelando ecuacion con variables dummy

Habiamos indicado que requeriamos estimar βparque y βcarretera ya que para el grupo de lotes normales nos
servia β0 al no tener un atributo resaltante. Adicionalmente a esta condicion del caso de estudio resulta
inviable matematicamente incluir las tres variables binarias creadas reciente mente, es por ello que la variable
no incluida debe ser de preferencia un referente de las otras. El modelo final quedaria asi.

precioi = β0 + βparque parque + βcarretera carretera + β1 m2i

10
Grupo frente a un parque

De tal manera que cuando un terreno tenga un parque en frente βparque = 1 y βcarretera = 0, entonces:

precioi = β0 + βparque 1 + βcarretera 0 + β1 m2i


precioi = (β0 + βparque ) + β1 m2i

De esta manera el nuevo intercepto para el grupo frente a un parque seria (β0 + βparque ) y βparque seria la
estimacion del valor adicional que gana un terreno al estar frente a un parque.

Grupo normal

Cuando el terreno sea normal βparque = 0 y βcarretera = 0, entonces:

precioi = β0 + βparque 0 + βcarretera 0 + β1 m2i


precioi = β0 + β1 m2i

Este grupo referencia ingnoraria los otros parametros estimados.

Grupo cerca a una carretera

En el caso de cuando un terreno tenga una carretera cerca βparque = 0 y βcarretera = 1, entonces:

precioi = β0 + βparque 0 + βcarretera 1 + β1 m2i


precioi = (β0 + βcarretera ) + β1 m2i

De esta manera el nuevo intercepto para el grupo frente a un parque seria (β0 + βcarretera ) y βcarretera seria
la estimacion del valor adicional que gana un terreno al estar cerca de una carretera. Por la grafica observada
previamente podriamos intuir que este parametro es negativo.

Estimando el modelo

m_terrenos <- lm(precio ~ m2 + parque + carretera, terrenos)


m_terrenos$coefficients

## (Intercept) m2 parque carretera


## 4324.1299 404.6695 8240.4020 -6007.3261

b1 <- m_terrenos$coefficients["m2"]
b0 <- m_terrenos$coefficients["(Intercept)"]
bparque <- m_terrenos$coefficients["parque"]
bcarretera <- m_terrenos$coefficients["carretera"]

Interpretando:

• β0 : El valor fijo de los lotes normales es 4324.


• β1 : Un metro cuadrado adicional cuesta en promedio 404

11
• βparque : El valor agregado por tener un parque al frente es 8240
• βcarretera : El valor perjuicio economico por el ruido de la carretera es 6007.

Ahora nuestra ecuacion resulta:

precioi = 4324 + 8240parque − 6007carretera + 404m2i

Visualizando modelo

plot(terrenos$m2,terrenos$precio,col=factor(terrenos$tipo))
abline(a= b0+bparque, b=b1, col="green")
abline(a= b0,b=b1, col="red")
abline(a= b0+bcarretera, b=b1, col="black")
legend("topleft", legend = c("Parque", "Comun","Carretera"),
col=c("green", "red","black"),
lty = c("solid", "solid", "solid"))

Parque
Comun
Carretera
50000
terrenos$precio

40000
30000

85 90 95 100 105

terrenos$m2

12
Sesion 2: Regresion lineal multiple II

Sergio Diaz

2023-06-04

Efectos diferenciales en la relacion de x con y


El efecto diferencial se refiere a la variación o discrepancia en el impacto o influencia que una variable tiene
sobre otra, dependiendo de la categoría o nivel de una tercera variable categórica. En otras palabras, el efecto
diferencial implica que la relación entre dos variables puede ser diferente en grupos o categorías distintas de
una variable categórica.

Caso de estudio

Se busca medir el impacto del fertilizante en la produccion de papas, para ello se tomo registro de diversas
unidades agricolas y se registro la produccion de toneladas de papas por hectarea y la cantidad de fertilizante
empleada en dicha produccion medido en kilos por hectarea. Adicionalemente se registro el tipo de fertilizante
usado: tradicional, quimico y organico.

papas = read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbBAOLev
head(papas)

## produccion fertilizante tipo


## 1 11.37 21.09 organico
## 2 8.65 18.79 quimico
## 3 9.81 21.18 quimico
## 4 10.15 25.11 quimico
## 5 10.68 22.42 quimico
## 6 8.27 34.27 tradicional

Como podemos ver a medida que se incrementa el uso de fertilizante, se incrementa la produccion por
hectarea.

plot(papas$fertilizante,papas$produccion,
xlab = "Fertilizante (kg/ha)",
ylab = "Producción (th/ha)")

1
20
Producción (th/ha)

15
10
5

10 20 30 40

Fertilizante (kg/ha)

Interaccion entre variables categoricas y cuantitativas

Se puede observar que a medida que se incrementa la cantidad de fertilizante la produccion se hace mas
variable. Tambien podemos intuir que provienen de un intercepto unico. Ahora visualicemos la nube de
puntos segun el tipo de fertilizante usado:

• organico: Es abono moderno o de reciente creación.


• quimico: Estos abonos se producen industrialmente y contienen nutrientes específicos en forma de sales
químicas.
• tradicional: Este fertilizante suele ser producido con productos agropecuarios.

plot(papas$fertilizante,papas$produccion,col=factor(papas$tipo))
legend("topleft", legend = c("tradicional", "quimico","organico"),
col=c("green", "red","black"),
lty = c("solid", "solid", "solid"))

2
20

tradicional
quimico
organico
papas$produccion

15
10
5

10 20 30 40

papas$fertilizante

Es evidente que el factor tipo influye en la relacion entre x e y sin embargo en esta oportunidad se corrige
la pendiente, en nuestro modelo inicial tenemos:

produccioni = β0 + β1 f ertilizantei

Si la pendiente es diferente pero la pendiente es la misma, tenemos:

• Un modelo para el uso de fertilizante organico

produccioni = β0 + βorganico f ertilizantei

• Un modelo para el uso de fertilizante quimico

produccioni = β0 + β1 f ertilizantei

• Un modelo para el uso de fertilizante tradicional

produccioni = β0 + βtradicional f ertilizantei

Incluso podriamos intuir:

3
βorganico > β1 > βtradicional

Una posible salida seria estimar por separado las rectas de cada grupo, sin embargo correriamos el riesgo de
perjudicar la estimacion de β0 al reducir el tamaño de datos y realizar el proceso por separado.

Variable interactuada

Para poder estimar las tres pendientes en un solo proceso de estimacion vamos a recurir ha representar la
columna tipo como 3 variables interactuadas, es decir que presenten valores de 0 y xi . De tal manera que
se creara una columna x_tradicional que tendra valor xi cuando el fertilizante usado sea tradicional y 0
en caso contrario. El proceso se repetira para las otras categorias y en estas nuevas columnas ninguna fila
tendra mas de un xi y tampoco podra estar compuesta de puros 0.

papas$x_tradicional <- ifelse(papas$tipo == "tradicional",papas$fertilizante,0)


papas$x_quimico <- ifelse(papas$tipo == "quimico",papas$fertilizante,0)
papas$x_organico <- ifelse(papas$tipo == "organico",papas$fertilizante,0)
head(papas)

## produccion fertilizante tipo x_tradicional x_quimico x_organico


## 1 11.37 21.09 organico 0.00 0.00 21.09
## 2 8.65 18.79 quimico 0.00 18.79 0.00
## 3 9.81 21.18 quimico 0.00 21.18 0.00
## 4 10.15 25.11 quimico 0.00 25.11 0.00
## 5 10.68 22.42 quimico 0.00 22.42 0.00
## 6 8.27 34.27 tradicional 34.27 0.00 0.00

La funcion ifelse() se emplea para evaluar un criterio logico y asignar un resultado especifico cuando
resulte ser verdadero o falso.

Modelando ecuacion con interacciones

Habiamos indicado que requeriamos estimar βorganico y βtradicional ya que para el grupo de fertilizante
quimico nos servia β1 al no tener un atributo resaltante. Adicionalmente a esta condicion del caso de estudio
resulta inviable matematicamente incluir las tres variables interactuadas creadas reciente mente, es por ello
que la variable no incluida debe ser de preferencia un referente de las otras. El modelo final quedaria asi.

produccioni = β0 + βtradicional x_tradicional + βorganico x_organico + β1 f ertilizante

Grupo de fertilizante organico

De tal manera el fertilizante sea de tipo organico x_organico = f ertilizantei y x_tradicional = 0, entonces:

produccioni = β0 + βtradicional x_tradicional + βorganico x_organicoi + β1 f ertilizantei


produccioni = β0 + (βorganico + β1 )f ertilizantei

De esta manera la nueva pendiente para el grupo de fertilizante organico seria (βorganico + β1 ) y βorganico
seria la estimacion de la productividad adicional al emplear el fertilizante organico frente al quimico.

4
Grupo de fertilizante quimico

Cuando el fertilizante sea quimico xo rganico = 0 y xt radicional = 0, entonces:

produccioni = β0 + βtradicional x_tradicional + βorganico x_organicoi + β1 f ertilizantei


produccioni = β0 + β1 f ertilizantei

Este grupo de referencia se ingnoraria los otros parametros estimados.

Grupo de fertilizante tradicional

En el caso de que el fertilizante sea tradicional x_organico = 0 y x_tradicional = f ertilizantei , entonces:

produccioni = β0 + βtradicional x_tradicional + βorganico x_organicoi + β1 f ertilizantei


produccioni = β0 + βorganico x_organicoi + β1 f ertilizantei

produccioni = β0 + (βtradicional + β1 )f ertilizantei

De esta manera que la pendiente para el grupo de fertilizante tradicional seria: (βtradicional +β1 ) y βtradicional
seria la estimacion de la produccion adicional que genera un fertilizante tradicional frente a un quimico. Por
la grafica observada previamente podriamos intuir que este parametro es negativo.

Estimando el modelo

m_papas <- lm(produccion ~ fertilizante + x_organico + x_tradicional, papas)


m_papas$coefficients

## (Intercept) fertilizante x_organico x_tradicional


## 5.02826980 0.19564703 0.10879808 -0.09638246

Se estima el modelo:

produccioni = β0 + β1 f ertilizantei + βtradicional x_tradicional + βorganico x_organicoi

b1 <- m_papas$coefficients["fertilizante"]
b0 <- m_papas$coefficients["(Intercept)"]
borganico <- m_papas$coefficients["x_organico"]
btradicional <- m_papas$coefficients["x_tradicional"]

Interpretando:

• β0 : La produccion de papas medidas en tn/ha esperadas al no usar fertilizante es 5.028 .


• β1 : Un kg de fertilizante quimico adicional aumenta la produccion en: 0.196
• βorganico : El incremento de la productividad del fertilizante quimico cuando lo cambiamos por organico
es: 0.109
• βtradicional : El incremento de la productividad del fertilizante quimico cuando lo cambiamos por tradi-
cional es: -0.096

5
Ahora nuestra ecuacion resulta:

produccioni = 5.028 + 0.196f ertilizantei − 0.096x_tradicional + 0.109x_organicoi

Visualizando modelo

plot(papas$fertilizante,papas$produccion,col=factor(papas$tipo))
abline(a= b0, b=b1 + borganico, col="black")
abline(a= b0,b=b1, col="red")
abline(a= b0, b=b1 + btradicional, col="green")
legend("topleft", legend = c("Organico", "Quimico","Tradicional"),
col=c("black", "red","green"),
lty = c("solid", "solid", "solid"))
20

Organico
Quimico
Tradicional
papas$produccion

15
10
5

10 20 30 40

papas$fertilizante

Transformaciones logaritmicas
Complementariamente a los polinomios hay otra familia de ecuaciones que presentan relaciones no lineales.
La mas empleada son los logaritmos. A continuacion desarrollamos un caso de modelo coob douglas.

6
Caso de estudio

Una constructura se encuentra desarrollando la construccion de una carretera y debido a problemas logisticos
y de planificacion ha contado con distinto numero de trabajadores y maquinaria para poder llevar a cabo
sus operaciones.

carreteras = read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbB
head(carreteras)

## k l q
## 1 17 26 176
## 2 62 28 589
## 3 29 176 1322
## 4 201 115 3034
## 5 92 126 1459
## 6 46 131 243

Se registraron la cantidad de maquinas(k), trabajadores(l) y longitud de la carretera asfaltada(q) a fin de


poder determinar cual es el factor mas productivo para una correcta asignacion de sus recursos. Una primera
mirada inicial nos muestra que no hay una buena relacion lineal estre las variables.

plot(carreteras)

0 500 1500 2500

2000
k

1000
0
2500

l
1000
0

80000

q
40000
0

0 500 1000 1500 2000 0 20000 60000

Por un lado podemos identificar valores atipicos y un comportamiento que no es lineal por lo que no seria
viable plantear la ecuacion:

7
qi = b0 + ki β2 + li β1

Matriz de correlacion

Ahora revisemos la matriz de correlacion

cor(carreteras)

## k l q
## k 1.000000000 0.004663293 0.5262688
## l 0.004663293 1.000000000 0.1571538
## q 0.526268845 0.157153847 1.0000000

la ultima linea nos indica que la variable que mas correlaciona con produccion es capital. Sin embargo aun
tenemos la alternativa que esto mejore repitiendo el mismo analisis con valores logaritmicos.

Transformacion logaritmica

Cuando un data frame esta conformado solo por variables numericas es factible usar de manera directa la
funcion log para cambiar los valores por logaritmos.

head(log(carreteras))

## k l q
## 1 2.833213 3.258097 5.170484
## 2 4.127134 3.332205 6.378426
## 3 3.367296 5.170484 7.186901
## 4 5.303305 4.744932 8.017637
## 5 4.521789 4.836282 7.285507
## 6 3.828641 4.875197 5.493061

Matriz de dispercion

Al emplear valores logaritmicos la dispercion si asemeja una forma lineal.

plot(log(carreteras))

8
2 3 4 5 6 7 8

6
k

4
2
8
6

l
4
2

11
9
q

7
5
2 3 4 5 6 7 5 6 7 8 9 10 11

Ahora provemos como mejora la matriz de correlacion.

Matriz de dispercion

cor(log(carreteras))

## k l q
## k 1.00000000 0.06432006 0.6732867
## l 0.06432006 1.00000000 0.3197395
## q 0.67328673 0.31973946 1.0000000

Aunque ambas variables mejoran, es la correlacion con el trabajo la que presenta una mejoria singnificativa.

Implicancias en la ecuacion

Solamente cuando todas las variables sean transformadas a logaritmos aplica el siguiente desarrollo:

log(qi ) = β0 + β1 log(ki ) + β2 log(li )


Por propiedad de logaritmos

log(qi ) = β0 + log(kiβ1 ) + log(liβ2 )

9
Pordriamos reemplazar β0 por log(A) siendo A = exp(β0 )

log(qi ) = log(A) + log(kiβ1 ) + log(liβ2 )

la suma de los logaritmos resulta en un producto

log(qi ) = log(A.kiβ1 .liβ2 )

como ambos extremos tienen un logaritmo podemos anularlos con el antilogaritmo, resultando.

qi = A.kiβ1 .liβ2

La implicancia de esta forma ecuacion es que son los cambios relativos(%) en ki y li los que generan cambios
relativos(%) en q.

Estimacion del modelo:

Para estimar el modelo no hay que generar campos nuevos, simplemente definimos estos valores en la funcion
que genera el modelo.

m_carreteras <- lm(log(q) ~ log(k) + log(l),carreteras)


m_carreteras$coef

## (Intercept) log(k) log(l)


## 3.1076649 0.6995529 0.2912880

La ecuacion resultante resulta:

log(qi ) = 3.10 + 0.7 log(ki ) + 0.29 log(li )

Podemos tambien plantearlo:

qi = (22.3).ki0.7 .li0.29

Considerando A = 22.3 resultado de aplicar exponencial al parametro β0 .

10
Sesion 2: Regresion lineal multiple II

Sergio Diaz

2023-06-04

Efectos diferenciales en la relacion de x con y


El efecto diferencial se refiere a la variación o discrepancia en el impacto o influencia que una variable tiene
sobre otra, dependiendo de la categoría o nivel de una tercera variable categórica. En otras palabras, el efecto
diferencial implica que la relación entre dos variables puede ser diferente en grupos o categorías distintas de
una variable categórica.

Caso de estudio

Se busca medir el impacto del fertilizante en la produccion de papas, para ello se tomo registro de diversas
unidades agricolas y se registro la produccion de toneladas de papas por hectarea y la cantidad de fertilizante
empleada en dicha produccion medido en kilos por hectarea. Adicionalemente se registro el tipo de fertilizante
usado: tradicional, quimico y organico.

papas = read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbBAOLev
head(papas)

## produccion fertilizante tipo


## 1 11.37 21.09 organico
## 2 8.65 18.79 quimico
## 3 9.81 21.18 quimico
## 4 10.15 25.11 quimico
## 5 10.68 22.42 quimico
## 6 8.27 34.27 tradicional

Como podemos ver a medida que se incrementa el uso de fertilizante, se incrementa la produccion por
hectarea.

plot(papas$fertilizante,papas$produccion,
xlab = "Fertilizante (kg/ha)",
ylab = "Producción (th/ha)")

1
20
Producción (th/ha)

15
10
5

10 20 30 40

Fertilizante (kg/ha)

Interaccion entre variables categoricas y cuantitativas

Se puede observar que a medida que se incrementa la cantidad de fertilizante la produccion se hace mas
variable. Tambien podemos intuir que provienen de un intercepto unico. Ahora visualicemos la nube de
puntos segun el tipo de fertilizante usado:

• organico: Es abono moderno o de reciente creación.


• quimico: Estos abonos se producen industrialmente y contienen nutrientes específicos en forma de sales
químicas.
• tradicional: Este fertilizante suele ser producido con productos agropecuarios.

plot(papas$fertilizante,papas$produccion,col=factor(papas$tipo))
legend("topleft", legend = c("tradicional", "quimico","organico"),
col=c("green", "red","black"),
lty = c("solid", "solid", "solid"))

2
20

tradicional
quimico
organico
papas$produccion

15
10
5

10 20 30 40

papas$fertilizante

Es evidente que el factor tipo influye en la relacion entre x e y sin embargo en esta oportunidad se corrige
la pendiente, en nuestro modelo inicial tenemos:

produccioni = β0 + β1 f ertilizantei

Si la pendiente es diferente pero la pendiente es la misma, tenemos:

• Un modelo para el uso de fertilizante organico

produccioni = β0 + βorganico f ertilizantei

• Un modelo para el uso de fertilizante quimico

produccioni = β0 + β1 f ertilizantei

• Un modelo para el uso de fertilizante tradicional

produccioni = β0 + βtradicional f ertilizantei

Incluso podriamos intuir:

3
βorganico > β1 > βtradicional

Una posible salida seria estimar por separado las rectas de cada grupo, sin embargo correriamos el riesgo de
perjudicar la estimacion de β0 al reducir el tamaño de datos y realizar el proceso por separado.

Variable interactuada

Para poder estimar las tres pendientes en un solo proceso de estimacion vamos a recurir ha representar la
columna tipo como 3 variables interactuadas, es decir que presenten valores de 0 y xi . De tal manera que
se creara una columna x_tradicional que tendra valor xi cuando el fertilizante usado sea tradicional y 0
en caso contrario. El proceso se repetira para las otras categorias y en estas nuevas columnas ninguna fila
tendra mas de un xi y tampoco podra estar compuesta de puros 0.

papas$x_tradicional <- ifelse(papas$tipo == "tradicional",papas$fertilizante,0)


papas$x_quimico <- ifelse(papas$tipo == "quimico",papas$fertilizante,0)
papas$x_organico <- ifelse(papas$tipo == "organico",papas$fertilizante,0)
head(papas)

## produccion fertilizante tipo x_tradicional x_quimico x_organico


## 1 11.37 21.09 organico 0.00 0.00 21.09
## 2 8.65 18.79 quimico 0.00 18.79 0.00
## 3 9.81 21.18 quimico 0.00 21.18 0.00
## 4 10.15 25.11 quimico 0.00 25.11 0.00
## 5 10.68 22.42 quimico 0.00 22.42 0.00
## 6 8.27 34.27 tradicional 34.27 0.00 0.00

La funcion ifelse() se emplea para evaluar un criterio logico y asignar un resultado especifico cuando
resulte ser verdadero o falso.

Modelando ecuacion con interacciones

Habiamos indicado que requeriamos estimar βorganico y βtradicional ya que para el grupo de fertilizante
quimico nos servia β1 al no tener un atributo resaltante. Adicionalmente a esta condicion del caso de estudio
resulta inviable matematicamente incluir las tres variables interactuadas creadas reciente mente, es por ello
que la variable no incluida debe ser de preferencia un referente de las otras. El modelo final quedaria asi.

produccioni = β0 + βtradicional x_tradicional + βorganico x_organico + β1 f ertilizante

Grupo de fertilizante organico

De tal manera el fertilizante sea de tipo organico x_organico = f ertilizantei y x_tradicional = 0, entonces:

produccioni = β0 + βtradicional x_tradicional + βorganico x_organicoi + β1 f ertilizantei


produccioni = β0 + (βorganico + β1 )f ertilizantei

De esta manera la nueva pendiente para el grupo de fertilizante organico seria (βorganico + β1 ) y βorganico
seria la estimacion de la productividad adicional al emplear el fertilizante organico frente al quimico.

4
Grupo de fertilizante quimico

Cuando el fertilizante sea quimico xo rganico = 0 y xt radicional = 0, entonces:

produccioni = β0 + βtradicional x_tradicional + βorganico x_organicoi + β1 f ertilizantei


produccioni = β0 + β1 f ertilizantei

Este grupo de referencia se ingnoraria los otros parametros estimados.

Grupo de fertilizante tradicional

En el caso de que el fertilizante sea tradicional x_organico = 0 y x_tradicional = f ertilizantei , entonces:

produccioni = β0 + βtradicional x_tradicional + βorganico x_organicoi + β1 f ertilizantei


produccioni = β0 + βorganico x_organicoi + β1 f ertilizantei

produccioni = β0 + (βtradicional + β1 )f ertilizantei

De esta manera que la pendiente para el grupo de fertilizante tradicional seria: (βtradicional +β1 ) y βtradicional
seria la estimacion de la produccion adicional que genera un fertilizante tradicional frente a un quimico. Por
la grafica observada previamente podriamos intuir que este parametro es negativo.

Estimando el modelo

m_papas <- lm(produccion ~ fertilizante + x_organico + x_tradicional, papas)


m_papas$coefficients

## (Intercept) fertilizante x_organico x_tradicional


## 5.02826980 0.19564703 0.10879808 -0.09638246

Se estima el modelo:

produccioni = β0 + β1 f ertilizantei + βtradicional x_tradicional + βorganico x_organicoi

b1 <- m_papas$coefficients["fertilizante"]
b0 <- m_papas$coefficients["(Intercept)"]
borganico <- m_papas$coefficients["x_organico"]
btradicional <- m_papas$coefficients["x_tradicional"]

Interpretando:

• β0 : La produccion de papas medidas en tn/ha esperadas al no usar fertilizante es 5.028 .


• β1 : Un kg de fertilizante quimico adicional aumenta la produccion en: 0.196
• βorganico : El incremento de la productividad del fertilizante quimico cuando lo cambiamos por organico
es: 0.109
• βtradicional : El incremento de la productividad del fertilizante quimico cuando lo cambiamos por tradi-
cional es: -0.096

5
Ahora nuestra ecuacion resulta:

produccioni = 5.028 + 0.196f ertilizantei − 0.096x_tradicional + 0.109x_organicoi

Visualizando modelo

plot(papas$fertilizante,papas$produccion,col=factor(papas$tipo))
abline(a= b0, b=b1 + borganico, col="black")
abline(a= b0,b=b1, col="red")
abline(a= b0, b=b1 + btradicional, col="green")
legend("topleft", legend = c("Organico", "Quimico","Tradicional"),
col=c("black", "red","green"),
lty = c("solid", "solid", "solid"))
20

Organico
Quimico
Tradicional
papas$produccion

15
10
5

10 20 30 40

papas$fertilizante

Transformaciones logaritmicas
Complementariamente a los polinomios hay otra familia de ecuaciones que presentan relaciones no lineales.
La mas empleada son los logaritmos. A continuacion desarrollamos un caso de modelo coob douglas.

6
Caso de estudio

Una constructura se encuentra desarrollando la construccion de una carretera y debido a problemas logisticos
y de planificacion ha contado con distinto numero de trabajadores y maquinaria para poder llevar a cabo
sus operaciones.

carreteras = read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbB
head(carreteras)

## k l q
## 1 17 26 176
## 2 62 28 589
## 3 29 176 1322
## 4 201 115 3034
## 5 92 126 1459
## 6 46 131 243

Se registraron la cantidad de maquinas(k), trabajadores(l) y longitud de la carretera asfaltada(q) a fin de


poder determinar cual es el factor mas productivo para una correcta asignacion de sus recursos. Una primera
mirada inicial nos muestra que no hay una buena relacion lineal estre las variables.

plot(carreteras)

0 500 1500 2500

2000
k

1000
0
2500

l
1000
0

80000

q
40000
0

0 500 1000 1500 2000 0 20000 60000

Por un lado podemos identificar valores atipicos y un comportamiento que no es lineal por lo que no seria
viable plantear la ecuacion:

7
qi = b0 + ki β2 + li β1

Matriz de correlacion

Ahora revisemos la matriz de correlacion

cor(carreteras)

## k l q
## k 1.000000000 0.004663293 0.5262688
## l 0.004663293 1.000000000 0.1571538
## q 0.526268845 0.157153847 1.0000000

la ultima linea nos indica que la variable que mas correlaciona con produccion es capital. Sin embargo aun
tenemos la alternativa que esto mejore repitiendo el mismo analisis con valores logaritmicos.

Transformacion logaritmica

Cuando un data frame esta conformado solo por variables numericas es factible usar de manera directa la
funcion log para cambiar los valores por logaritmos.

head(log(carreteras))

## k l q
## 1 2.833213 3.258097 5.170484
## 2 4.127134 3.332205 6.378426
## 3 3.367296 5.170484 7.186901
## 4 5.303305 4.744932 8.017637
## 5 4.521789 4.836282 7.285507
## 6 3.828641 4.875197 5.493061

Matriz de dispercion

Al emplear valores logaritmicos la dispercion si asemeja una forma lineal.

plot(log(carreteras))

8
2 3 4 5 6 7 8

6
k

4
2
8
6

l
4
2

11
9
q

7
5
2 3 4 5 6 7 5 6 7 8 9 10 11

Ahora provemos como mejora la matriz de correlacion.

Matriz de correlacion

cor(log(carreteras))

## k l q
## k 1.00000000 0.06432006 0.6732867
## l 0.06432006 1.00000000 0.3197395
## q 0.67328673 0.31973946 1.0000000

Aunque ambas variables mejoran, es la correlacion con el trabajo la que presenta una mejoria singnificativa.

Implicancias en la ecuacion

Solamente cuando todas las variables sean transformadas a logaritmos aplica el siguiente desarrollo:

log(qi ) = β0 + β1 log(ki ) + β2 log(li )


Por propiedad de logaritmos

log(qi ) = β0 + log(kiβ1 ) + log(liβ2 )

9
Pordriamos reemplazar β0 por log(A) siendo A = exp(β0 )

log(qi ) = log(A) + log(kiβ1 ) + log(liβ2 )

la suma de los logaritmos resulta en un producto

log(qi ) = log(A.kiβ1 .liβ2 )

como ambos extremos tienen un logaritmo podemos anularlos con el antilogaritmo, resultando.

qi = A.kiβ1 .liβ2

La implicancia de esta forma ecuacion es que son los cambios relativos(%) en ki y li los que generan cambios
relativos(%) en q.

Estimacion del modelo:

Para estimar el modelo no hay que generar campos nuevos, simplemente definimos estos valores en la funcion
que genera el modelo.

m_carreteras <- lm(log(q) ~ log(k) + log(l),carreteras)


m_carreteras$coef

## (Intercept) log(k) log(l)


## 3.1076649 0.6995529 0.2912880

La ecuacion resultante resulta:

log(qi ) = 3.10 + 0.7 log(ki ) + 0.29 log(li )

Podemos tambien plantearlo:

qi = (22.3).ki0.7 .li0.29

Considerando A = 22.3 resultado de aplicar exponencial al parametro β0 .

Interpretacion

• El parametro tecnologico A es 22.3.


• El indice de elasticidad del capital K es 0.7: Si k aumenta en un 1% la produccion aumenta en 0.7%.
• El indice de elasticidad del trabajo L es 0.29: Si k aumenta en un 1% la produccion aumenta en 0.29%.

10
Multicolinealidad
La multicolinealidad es una situación en la que existe una alta correlación o relación lineal entre las variables
predictoras en un modelo de regresión. Se presenta cuando dos o más variables independientes en el modelo
están fuertemente relacionadas entre sí, lo que dificulta distinguir el efecto individual de cada variable sobre
la variable de respuesta.
Cuando hay multicolinealidad, los coeficientes de regresión pueden volverse inestables y difíciles de interpre-
tar. Puede suceder que los coeficientes tengan signos opuestos a los esperados o que sean estadísticamente
no significativos, lo que puede llevar a conclusiones erróneas. Además, la multicolinealidad puede aumentar
la variabilidad de los coeficientes, lo que reduce la precisión y confianza de las estimaciones.

Matriz de correlacion

Matrix sin multicolinealidad

La presencia de multicolinealidad puede surgir debido a diversas razones, como la inclusión de variables
altamente correlacionadas, la sobre especificación del modelo o el uso de transformaciones lineales de las
variables. También puede ser resultado de la forma en que se recopilan los datos o de problemas inherentes
a la naturaleza de las variables.

## x1 x2 x3 x4
## x1 1.000000000 -0.008665736 0.01675143 0.01638841
## x2 -0.008665736 1.000000000 0.15011469 -0.04081026
## x3 0.016751426 0.150114688 1.00000000 -0.03349189
## x4 0.016388413 -0.040810262 -0.03349189 1.00000000

Matrix con multicolinealidad

Para abordar la multicolinealidad, se pueden tomar varias medidas, como eliminar variables altamente
correlacionadas, combinar variables para crear nuevas variables independientes o recopilar datos adicionales.
También existen técnicas estadísticas más avanzadas, como la regresión ridge o la regresión de componentes
principales, que pueden ayudar a mitigar los efectos de la multicolinealidad.

## x1 x2 x3 x4
## x1 1.0000000 0.3972917 0.37145280 0.41128108
## x2 0.3972917 1.0000000 0.16113578 0.23803352
## x3 0.3714528 0.1611358 1.00000000 0.08398449
## x4 0.4112811 0.2380335 0.08398449 1.00000000

La detección y gestión adecuada de la multicolinealidad es importante para garantizar la validez y confiabil-


idad de los resultados de un modelo de regresión, y para obtener interpretaciones precisas de las relaciones
entre las variables predictoras y la variable de respuesta.

VIF

El VIF (Factor de Inflación de la Varianza, por sus siglas en inglés) es una medida utilizada para evaluar
la multicolinealidad en un modelo de regresión lineal. La multicolinealidad ocurre cuando existe una alta
correlación entre las variables predictoras en el modelo.

1
V IFi =
1 − Ri2

11
El VIF se calcula para cada variable en el modelo y proporciona una medida de cuánto se infla la varianza
del coeficiente de regresión de esa variable debido a la presencia de multicolinealidad con las demás variables
predictoras. En general, se considera que existe multicolinealidad significativa si el VIF es mayor que 5 o 10.

Caso de estudio

El data set auto tiene por objetivo la variable mpg, explica el rendimiento en millas por galon en base las
caracteristicas de los autos.

auto <- read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQxw68TRzl9CD8xHb9T_EPC0rjCvT7cbBAOLev


auto <- auto[,c("mpg","disp","hp","drat","wt","qsec","carb")]
head(auto)

## mpg disp hp drat wt qsec carb


## 1 21.0 160 110 3.90 2.620 16.46 4
## 2 21.0 160 110 3.90 2.875 17.02 4
## 3 22.8 108 93 3.85 2.320 18.61 1
## 4 21.4 258 110 3.08 3.215 19.44 1
## 5 18.7 360 175 3.15 3.440 17.02 2
## 6 18.1 225 105 2.76 3.460 20.22 1

Se estima el modelo

modelo1 <- lm(mpg ~ disp + hp + drat + wt + qsec + carb,data = auto)


summary(modelo1)

##
## Call:
## lm(formula = mpg ~ disp + hp + drat + wt + qsec + carb, data = auto)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.5501 -1.6658 -0.4125 1.1273 5.4884
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 16.613010 11.575677 1.435 0.1636
## disp 0.008406 0.016458 0.511 0.6140
## hp -0.020247 0.020451 -0.990 0.3316
## drat 2.025858 1.388473 1.459 0.1570
## wt -4.351416 1.804705 -2.411 0.0236 *
## qsec 0.631754 0.565427 1.117 0.2745
## carb -0.019318 0.728589 -0.027 0.9791
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 2.609 on 25 degrees of freedom
## Multiple R-squared: 0.8489, Adjusted R-squared: 0.8127
## F-statistic: 23.41 on 6 and 25 DF, p-value: 3.981e-09

Revisamos el vif

12
library(car)

## Loading required package: carData

vif(modelo1)

## disp hp drat wt qsec carb


## 18.954687 8.956570 2.510706 14.204683 4.650604 6.308884

Se elimina la variable que tenga mayor vif.

modelo2 <- lm(mpg ~ disp + hp + drat + qsec + carb,data = auto)


summary(modelo2)

##
## Call:
## lm(formula = mpg ~ disp + hp + drat + qsec + carb, data = auto)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.9747 -1.7805 -0.3483 1.2440 5.8604
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 25.529075 11.941471 2.138 0.0421 *
## disp -0.025463 0.009337 -2.727 0.0113 *
## hp -0.005127 0.021191 -0.242 0.8107
## drat 2.942687 1.453763 2.024 0.0533 .
## qsec -0.326363 0.437906 -0.745 0.4628
## carb -1.269334 0.557306 -2.278 0.0312 *
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 2.84 on 26 degrees of freedom
## Multiple R-squared: 0.8138, Adjusted R-squared: 0.778
## F-statistic: 22.72 on 5 and 26 DF, p-value: 9.85e-09

vif(modelo2)

## disp hp drat qsec carb


## 5.147991 8.114441 2.322407 2.353692 3.114622

Vemos que mas variables son singnificativas sin embargo aun hay presencia de multicolinealidad.

modelo3 <- lm(mpg ~ disp + drat + qsec + carb,data = auto)


summary(modelo3)

##
## Call:
## lm(formula = mpg ~ disp + drat + qsec + carb, data = auto)

13
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.0541 -1.8129 -0.4039 1.3503 5.7886
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24.55521 11.04480 2.223 0.034761 *
## disp -0.02695 0.00689 -3.912 0.000559 ***
## drat 2.95544 1.42725 2.071 0.048070 *
## qsec -0.28359 0.39358 -0.721 0.477389
## carb -1.35588 0.41983 -3.230 0.003249 **
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## Residual standard error: 2.79 on 27 degrees of freedom
## Multiple R-squared: 0.8134, Adjusted R-squared: 0.7857
## F-statistic: 29.42 on 4 and 27 DF, p-value: 1.725e-09

vif(modelo3)

## disp drat qsec carb


## 2.904649 2.319355 1.970035 1.831340

Otros paquetes para multicolinealidad

Package performance

library(performance)
p_modelo1 <- check_collinearity(modelo1)
p_modelo1

## # Check for Multicollinearity


##
## Low Correlation
##
## Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
## drat 2.51 [ 1.78, 3.93] 1.58 0.40 [0.25, 0.56]
## qsec 4.65 [ 3.07, 7.42] 2.16 0.22 [0.13, 0.33]
##
## Moderate Correlation
##
## Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
## hp 8.96 [ 5.69, 14.50] 2.99 0.11 [0.07, 0.18]
## carb 6.31 [ 4.08, 10.15] 2.51 0.16 [0.10, 0.25]
##
## High Correlation
##
## Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
## disp 18.95 [11.77, 30.93] 4.35 0.05 [0.03, 0.08]
## wt 14.20 [ 8.88, 23.12] 3.77 0.07 [0.04, 0.11]

14
p_modelo2 <- check_collinearity(modelo2)
print(p_modelo2)

## # Check for Multicollinearity


##
## Low Correlation
##
## Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
## drat 2.32 [1.65, 3.70] 1.52 0.43 [0.27, 0.61]
## qsec 2.35 [1.67, 3.75] 1.53 0.42 [0.27, 0.60]
## carb 3.11 [2.11, 5.01] 1.76 0.32 [0.20, 0.47]
##
## Moderate Correlation
##
## Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
## disp 5.15 [3.32, 8.41] 2.27 0.19 [0.12, 0.30]
## hp 8.11 [5.09, 13.38] 2.85 0.12 [0.07, 0.20]

p_modelo3 <- check_collinearity(modelo3)


print(p_modelo3)

## # Check for Multicollinearity


##
## Low Correlation
##
## Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
## disp 2.90 [1.96, 4.76] 1.70 0.34 [0.21, 0.51]
## drat 2.32 [1.63, 3.77] 1.52 0.43 [0.27, 0.61]
## qsec 1.97 [1.43, 3.19] 1.40 0.51 [0.31, 0.70]
## carb 1.83 [1.35, 2.97] 1.35 0.55 [0.34, 0.74]

Package mctest

library(mctest)
omcdiag(mod=modelo1)

##
## Call:
## omcdiag(mod = modelo1)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X’X|: 0.0017 1
## Farrar Chi-Square: 179.8966 1
## Red Indicator: 0.5848 1
## Sum of Lambda Inverse: 55.5861 1
## Theil’s Method: 0.7488 1
## Condition Number: 84.4517 1

15
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test

omcdiag(mod=modelo2)

##
## Call:
## omcdiag(mod = modelo2)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X’X|: 0.0239 0
## Farrar Chi-Square: 106.3988 1
## Red Indicator: 0.5645 1
## Sum of Lambda Inverse: 21.0532 0
## Theil’s Method: 0.2509 0
## Condition Number: 66.7536 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test

omcdiag(mod=modelo3)

##
## Call:
## omcdiag(mod = modelo3)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X’X|: 0.1940 0
## Farrar Chi-Square: 47.2764 1
## Red Indicator: 0.4647 0
## Sum of Lambda Inverse: 9.0254 0
## Theil’s Method: -0.2692 0
## Condition Number: 57.1101 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test

16
Supuestos del MCO

Sergio Diaz

2023-06-21

Teorema del limite central


El teorema del límite central (TLC) es uno de los resultados más importantes en estadística y probabilidad.
Afirma que, bajo ciertas condiciones, la suma o media de un gran número de variables aleatorias indepen-
dientes e idénticamente distribuidas (iid) tiende a seguir una distribución normal, sin importar cuál sea la
distribución original de las variables.
En términos más específicos, el TLC establece lo siguiente:
Las variables aleatorias deben ser independientes entre sí. Esto significa que el resultado de una variable no
afecta el resultado de las otras variables.
Las variables aleatorias deben tener la misma distribución. Esto significa que todas las variables tienen la
misma probabilidad de tomar cualquier valor dentro de su rango.
Las variables aleatorias deben tener una varianza finita. En otras palabras, la dispersión de los valores de
las variables no debe ser infinitamente grande.

Datos con distribucion normal

hist(log(df$l))

1
Histogram of log(df$l)
150
Frequency

100
50
0

2 3 4 5 6 7 8

log(df$l)

Se realizan distintos muestreos sobre estos datos y se obtienen promedios distintos

muestra <- 70
n_muestra <- 50
cont <- c()
for(i in 1:muestra){
mean <- mean(sample(log(df$k),n_muestra))
cont <- c(cont,mean)
}

hist(cont)

2
Histogram of cont
20
15
Frequency

10
5
0

4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3

cont

Datos sin distribucion normal

hist(df$l)

3
Histogram of df$l
800
600
Frequency

400
200
0

0 500 1000 1500 2000 2500 3000 3500

df$l

Se realizan distintos muestreos sobre estos datos y se obtienen promedios distintos

muestra <- 70
n_muestra <- 50
cont <- c()
for(i in 1:muestra){
mean <- mean(sample(df$k,n_muestra))
cont <- c(cont,mean)
}

hist(cont)

4
Histogram of cont
15
Frequency

10
5
0

200 250 300

cont

Supuestos de GaussMarko

Linealidad

# Ajustar modelo1 de regresión lineal


modelo1 <- lm(q ~ k + l, data = df)
modelo2 <- lm(log(q) ~ log(k) + log(l), data = df)

Modelo no lineal

plot(df$k,modelo1$residuals)

5
60000
modelo1$residuals

20000
−20000

0 500 1000 1500 2000

df$k

plot(df$l,modelo1$residuals)

6
60000
modelo1$residuals

20000
−20000

0 500 1000 1500 2000 2500 3000

df$l

Modelo lineal

plot(log(df$l),modelo2$residuals)

7
2
modelo2$residuals

1
0
−1
−2

2 3 4 5 6 7 8

log(df$l)

plot(log(df$k),modelo2$residuals)

8
2
modelo2$residuals

1
0
−1
−2

2 3 4 5 6 7

log(df$k)

Homocedasticidad

Breusch-Pagan

# Cargar librerías
library(lmtest)

## Warning: package ’lmtest’ was built under R version 4.3.1

## Loading required package: zoo

##
## Attaching package: ’zoo’

## The following objects are masked from ’package:base’:


##
## as.Date, as.Date.numeric

bp_test <- bptest(modelo1)


print(bp_test)

9
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 53.778, df = 2, p-value = 2.101e-12

Interpretacion: Si el p valor es menor ha 0.05 entonces hay heterocedasticidad(problema)

Caso no heterocedastico

bp_test <- bptest(modelo2)


print(bp_test)

##
## studentized Breusch-Pagan test
##
## data: modelo2
## BP = 1.572, df = 2, p-value = 0.4557

Independencia

df$r1 <- modelo1$residuals


df$r2 <- modelo2$residuals
cor(df[,c("l","k","r1")])

## l k r1
## l 1.000000e+00 4.663293e-03 1.332444e-17
## k 4.663293e-03 1.000000e+00 -6.958644e-17
## r1 1.332444e-17 -6.958644e-17 1.000000e+00

Normalidad

Caso no normal

hist(df$r1)

10
Histogram of df$r1
500
Frequency

300
100
0

−40000 −20000 0 20000 40000 60000 80000

df$r1

Caso normal

hist(df$r2)

11
Histogram of df$r2
250
200
Frequency

150
100
50
0

−2 −1 0 1 2 3

df$r2

Test de Shapiro-Wilk

shapiro.test(modelo1$residuals)

##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.62605, p-value < 2.2e-16

Interpretacion: Si el p valor es menor ha 0.05 entonces no hay normalidad(problema)

shapiro.test(modelo2$residuals)

##
## Shapiro-Wilk normality test
##
## data: modelo2$residuals
## W = 0.99791, p-value = 0.2473

Interpretacion: Si el p valor es menor ha 0.05 entonces no hay normalidad(problema)

12
Test de Anderson-Darling

library(nortest)
ad.test(modelo1$residuals)

##
## Anderson-Darling normality test
##
## data: modelo1$residuals
## A = 90.606, p-value < 2.2e-16

Interpretacion: Si el p valor es menor ha 0.05 entonces no hay normalidad(problema)

ad.test(modelo2$residuals)

##
## Anderson-Darling normality test
##
## data: modelo2$residuals
## A = 0.45538, p-value = 0.2674

Interpretacion: Si el p valor es menor ha 0.05 entonces no hay normalidad(problema)

13
Unidad I: Modelos de clasificacion
Sergio Diaz

2023-06-24

Antecedentes

Variable binaria
Una variable binaria es un tipo de variable que solo puede tomar dos posibles valores o categorías distintas.
Estos valores suelen representarse como 1 y 0, donde 1 indica la presencia o éxito de un evento o condición,
y 0 indica la ausencia o fracaso del mismo.
Las variables binarias también se conocen como variables dicotómicas o variables dummy, y son ampliamente
utilizadas en diversos campos de la ciencia de datos, incluyendo la epidemiología, la investigación de mercado,
la clasificación de datos y el aprendizaje automático.
Algunos ejemplos a considerar son:

1. En términos de análisis estadístico, las variables binarias se pueden utilizar en modelos de regresión
logística para predecir la probabilidad de ocurrencia de un evento o para determinar la influencia de
otras variables en la probabilidad de que ocurra dicho evento.
2. Variable binaria de género: Se utiliza para representar la diferencia de género en una muestra. Por
ejemplo, se puede crear una variable binaria con el valor 1 para mujeres y 0 para hombres.
3. Variable binaria de región geográfica: Para analizar el impacto de la ubicación geográfica en un modelo,
se pueden crear variables binarias para diferentes regiones o áreas geográficas. Cada región tendría
una variable binaria asociada que toma el valor 1 si la observación pertenece a esa región y 0 en caso
contrario.
4. Variable binaria de educación: Para capturar diferentes niveles educativos, se pueden crear variables bi-
narias para categorías como “educación primaria”, “educación secundaria” y “educación universitaria”.
Cada categoría tendría una variable binaria correspondiente, tomando el valor 1 si la observación
pertenece a esa categoría y 0 en caso contrario.
5. Variable binaria de condición laboral: Para analizar el efecto de diferentes condiciones laborales en
un modelo, se pueden crear variables binarias para categorías como “trabajador a tiempo completo”,
“trabajador a tiempo parcial” o “desempleado”. Cada categoría tendría una variable binaria asociada
que toma el valor 1 si la observación pertenece a esa categoría y 0 en caso contrario.

Modelo de probabilidad lineal


El modelo de probabilidad lineal es un enfoque utilizado en estadística y aprendizaje automático para modelar
la relación entre una variable de respuesta y un conjunto de variables predictoras o independientes. Este
modelo asume que la relación entre las variables se puede representar mediante una combinación lineal de
las variables predictoras, ponderadas por coeficientes.

yi = β0 + β1 X1 + β2 X2

1
Modelos de clasificacion
Los modelos de clasificación son una técnica fundamental en el campo del aprendizaje automático y la ciencia
de datos. Estos modelos se utilizan para asignar observaciones o instancias a diferentes categorías o clases,
en función de un conjunto de variables predictoras o características.

Modelo logit

El modelo logit es una técnica utilizada en estadística y aprendizaje automático para realizar análisis de
regresión logística. Es una extensión del modelo de regresión lineal, pero se aplica específicamente a prob-
lemas en los que la variable dependiente es binaria (solo puede tomar dos valores posibles, como “éxito” o
“fracaso”, “si” o “no”, etc.).
El modelo logit utiliza la función logística, también conocida como función sigmoide, para transformar una
combinación lineal de variables predictoras en una probabilidad. La función sigmoide toma valores en el
rango de 0 a 1, lo que permite interpretar el resultado como la probabilidad de que ocurra un evento.
En términos matemáticos, el modelo logit se representa mediante la ecuación:

1
yi =
1 + e−(β0 +β1 X1i +β2 X2i )

donde:

• yi es la variable dependiente (binaria).


• β0 , β1 , β2 son los coeficientes del modelo.
• X1i , X2i son las variables predictoras para la observación i.

Modelo Probit

El modelo probit es una técnica utilizada en estadística y econometría para realizar análisis de regresión
cuando la variable dependiente es binaria. Al igual que el modelo logit, el modelo probit se utiliza para
modelar y predecir la probabilidad de ocurrencia de un evento.
En el modelo probit, la relación entre las variables predictoras y la probabilidad de éxito se establece a través
de la función de distribución acumulativa de una distribución normal estándar, conocida como la función
probit. La función probit transforma una combinación lineal de las variables predictoras en una probabilidad,
y su inversa se utiliza para estimar los coeficientes del modelo.
En términos matemáticos, el modelo probit se representa mediante la ecuación:

P (yi = 1) = Φ(β0 + β1 X1i + β2 X2i )

Donde P (yi = 1) es la probabilidad de éxito, Φ representa la función probit y (β0 , β1 , β2 ) son los coeficientes
del modelo asociados con las variables predictoras (X1i , X2i ).

Caso de estudio
Se probaron distintos modelos de telefonos para estudiar las preferencias del consumidor, el siguiente dataset
tiene datos de la bateria(mha), pantalla(pulgadas) y si finalmente fue comprado o no.

2
telefonos <- read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vR9GuZtAgItzWEjbPUAITgIjSSr7u4TmK
head(telefonos,5)

## bateria pantalla compra


## 1 3124 5.06 1
## 2 4852 6.13 1
## 3 4196 7.12 1
## 4 3796 6.70 1
## 5 2468 6.92 0

Como vemos en este caso son dos variables numericas la que explica una variable cualitativa.

summary(telefonos)

## bateria pantalla compra


## Min. :2014 Min. :4.510 Min. :0.000
## 1st Qu.:2708 1st Qu.:5.220 1st Qu.:0.000
## Median :3490 Median :6.060 Median :1.000
## Mean :3471 Mean :6.021 Mean :0.648
## 3rd Qu.:4233 3rd Qu.:6.780 3rd Qu.:1.000
## Max. :4999 Max. :7.500 Max. :1.000

En un primera revicion podemos identificar los rangos y los valores promedios de la bateria y la pantalla.
Para la variable compra el promedio tambien representa la proporcion de modelos vendidos.

Variable objetivo como factor

Aunque el modelo logit aceptaria datos numericos de 0 y 1, lo mas recomendable para el analisis exploratorio
y desarrollo de modelos es transformar este dato numerico en un factor, de esta manera R entendera que se
trata de una variable cualitativa.

telefonos$compra <- as.factor(telefonos$compra)


summary(telefonos)

## bateria pantalla compra


## Min. :2014 Min. :4.510 0:352
## 1st Qu.:2708 1st Qu.:5.220 1:648
## Median :3490 Median :6.060
## Mean :3471 Mean :6.021
## 3rd Qu.:4233 3rd Qu.:6.780
## Max. :4999 Max. :7.500

Ahora R considero que compra al ser una variable cualitativa debe ser analisada por medio de sus frecuencias.

Analisis exploratorio con ggplot2

ggplot2 es un paquete de visualización de datos altamente utilizado en R. Fue desarrollado por Hadley
Wickham y está basado en la gramática de gráficos, lo que permite crear visualizaciones de datos de forma
concisa y flexible.

3
La principal filosofía detrás de ggplot2 es que los gráficos se construyen agregando capas (layers) a un lienzo
en blanco. Cada capa representa una parte de la visualización, como puntos, líneas, barras o etiquetas. Esto
permite crear gráficos complejos combinando diferentes capas para mostrar múltiples variables o patrones
en los datos.
Para inicial el analisis revisamos la relacion entre la compra y cada una de las variables exogenas.

library(ggplot2)
ggplot(telefonos,aes(x=compra,y=bateria)) + geom_boxplot()

5000

4000
bateria

3000

2000

0 1
compra

La caga de los datos donde se realiza la compra del telefono estan por encima de los que no compraron, se
puede intuir que la bateria es variable importante para la compra.

library(ggplot2)
ggplot(telefonos,aes(x=compra,y=pantalla)) + geom_boxplot()

4
7
pantalla

0 1
compra

El grafico indica que no hay diferencia relevante en el tamaño de pantalla para la decision de compra.

Modelo logit

modelo_logit <- glm(compra ~ pantalla + bateria, data = telefonos, family = binomial)

## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred

# Resumen del modelo


summary(modelo_logit)

##
## Call:
## glm(formula = compra ~ pantalla + bateria, family = binomial,
## data = telefonos)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -739.4153 357.7691 -2.067 0.0388 *
## pantalla 0.3735 1.1776 0.317 0.7511
## bateria 0.2447 0.1188 2.060 0.0394 *
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1

5
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1297.3519 on 999 degrees of freedom
## Residual deviance: 9.6707 on 997 degrees of freedom
## AIC: 15.671
##
## Number of Fisher Scoring iterations: 17

Interpretacion

interpretacion de parametros del modelo logit:

coef(modelo_logit)

## (Intercept) pantalla bateria


## -739.4153451 0.3735007 0.2446651

• Intercepto: El intercepto (-739.4153451) representa el logaritmo de la razón de odds de éxito de venta


cuando todas las variables predictoras son cero. Sin embargo, en el contexto del modelo logit, la
interpretación directa del intercepto puede ser difícil.
• Variable “pantalla”: Cada incremento de una unidad en el tamaño de pantalla se asocia con un aumento
de 0.3735007 en el logaritmo de la razón de odds de éxito de venta. Esto significa que, manteniendo to-
das las demás variables constantes, un aumento en el tamaño de pantalla está positivamente relacionado
con la probabilidad de éxito de venta.
• Variable “bateria”: Cada incremento de una unidad en la duración de la batería se asocia con un
aumento de 0.2446651 en el logaritmo de la razón de odds de éxito de venta. Esto implica que,
manteniendo todas las demás variables constantes, una mayor duración de la batería está positivamente
relacionada con la probabilidad de éxito de venta.

Esto no resulta muy practico al tratarce de logaritmos, sin embargo podemos retirar este efecto emplando
el exponencial

exp(coef(modelo_logit))

## (Intercept) pantalla bateria


## 7.509798e-322 1.452812e+00 1.277193e+00

Interpretación del exponencial de parametros del modelo logit:

• Exponencial del intercepto: El valor extremadamente pequeño (7.509798e-322) indica que la proba-
bilidad de éxito de venta cuando todas las variables predictoras son cero es prácticamente cero. Es
importante tener en cuenta que este valor puede estar relacionado con la escala de las variables o
posibles problemas de ajuste del modelo.
• Exponencial de la variable “pantalla”: Un incremento de una unidad en el tamaño de pantalla se asocia
con un aumento de aproximadamente 1.45 veces en la razón de odds de éxito de venta. Esto sugiere
que un mayor tamaño de pantalla tiende a aumentar la probabilidad de éxito de venta.

6
• Exponencial de la variable “bateria”: Un incremento de una unidad en la duración de la batería se
asocia con un aumento de aproximadamente 1.28 veces en la razón de odds de éxito de venta. Esto
indica que una mayor duración de la batería tiene un impacto positivo en la probabilidad de éxito de
venta.

Recuerda que el exponencial de los coeficientes en un modelo logit nos proporciona la razón de odds, que es
una medida de la relación entre la probabilidad de éxito y la probabilidad de fracaso.

Modelo Probit

modelo_probit <- glm(compra ~ pantalla + bateria, data = telefonos, family = binomial(link = "probit"))

## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred

# Resumen del modelo


summary(modelo_probit)

##
## Call:
## glm(formula = compra ~ pantalla + bateria, family = binomial(link = "probit"),
## data = telefonos)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -421.69184 187.28622 -2.252 0.0243 *
## pantalla 0.25011 0.66680 0.375 0.7076
## bateria 0.13944 0.06222 2.241 0.0250 *
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1297.3519 on 999 degrees of freedom
## Residual deviance: 9.5602 on 997 degrees of freedom
## AIC: 15.56
##
## Number of Fisher Scoring iterations: 19

Interpretacion

coef(modelo_probit)

## (Intercept) pantalla bateria


## -421.6918358 0.2501098 0.1394427

• Intercepto: El intercepto (-421.6918358) indica el valor de la función probit cuando todas las variables
predictoras son cero. Sin embargo, la interpretación directa del intercepto puede ser difícil en el
contexto del modelo probit.

7
• Variable “pantalla”: Cada incremento de una unidad en el tamaño de pantalla se asocia con un aumento
de 0.2501098 en la probabilidad de éxito de venta, considerando las demás variables constantes. Esto
sugiere que un mayor tamaño de pantalla está relacionado positivamente con la probabilidad de éxito
de venta.
• Variable “bateria”: Cada incremento de una unidad en la duración de la batería se asocia con un
aumento de 0.1394427 en la probabilidad de éxito de venta, manteniendo las demás variables constantes.
Esto implica que una mayor duración de la batería está positivamente relacionada con la probabilidad
de éxito de venta.

Es importante tener en cuenta que en un modelo probit, los coeficientes estimados no tienen una inter-
pretación directa en términos de razón de odds como en el modelo logit. En cambio, se interpretan como
los cambios marginales en la probabilidad de éxito de venta asociados con cada variable, manteniendo las
demás constantes.

Comparacion de modelo

Empleamos la funcion predict.glm() para obtener los valores estimados de cada modelo. La opcion
type="response" es para que los valores se exprecen en probabilidad.

plot(predict.glm(modelo_logit,type="response"),predict.glm(modelo_probit,type="response"))
abline(0,1)
predict.glm(modelo_probit, type = "response")

1.0
0.8
0.6
0.4
0.2
0.0

0.0 0.2 0.4 0.6 0.8 1.0

predict.glm(modelo_logit, type = "response")

Ambos modelo estiman probabilidades similares.

8
Precision del modelo

Modelo Logit

El paquete caret (Classification And REgression Training) es una herramienta muy útil en R para el en-
trenamiento y evaluación de modelos de clasificación y regresión. Proporciona una interfaz unificada y
fácil de usar para ajustar modelos de machine learning con múltiples algoritmos y facilita tareas comunes,
como la selección de características, preprocesamiento de datos, ajuste de hiperparámetros y evaluación del
rendimiento del modelo.

library(caret)

## Loading required package: lattice

probabilidad <- predict.glm(modelo_logit,type="response")


estimado <- factor(ifelse(probabilidad>0.5,1,0))
real <- telefonos$compra
confusionMatrix(estimado,real, positive = "1")

## Confusion Matrix and Statistics


##
## Reference
## Prediction 0 1
## 0 351 1
## 1 1 647
##
## Accuracy : 0.998
## 95% CI : (0.9928, 0.9998)
## No Information Rate : 0.648
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9956
##
## Mcnemar’s Test P-Value : 1
##
## Sensitivity : 0.9985
## Specificity : 0.9972
## Pos Pred Value : 0.9985
## Neg Pred Value : 0.9972
## Prevalence : 0.6480
## Detection Rate : 0.6470
## Detection Prevalence : 0.6480
## Balanced Accuracy : 0.9978
##
## ’Positive’ Class : 1
##

Una matriz de confusión obtenida utilizando el paquete caret en R es una tabla que muestra el rendimiento
de un modelo de clasificación al comparar las etiquetas verdaderas y las etiquetas predichas para un conjunto
de datos.
La matriz de confusión generada por caret tiene una estructura de 2x2 (para problemas de clasificación
binaria) y consta de cuatro celdas:

9
Verdaderos positivos (TP): Representa el número de casos correctamente clasificados como positivos por
el modelo. Verdaderos negativos (TN): Representa el número de casos correctamente clasificados como
negativos por el modelo. Falsos positivos (FP): Representa el número de casos incorrectamente clasificados
como positivos por el modelo (clasificados como positivos pero que en realidad son negativos). Falsos
negativos (FN): Representa el número de casos incorrectamente clasificados como negativos por el modelo
(clasificados como negativos pero que en realidad son positivos). La interpretación de la matriz de confusión
obtenida con caret permite evaluar el rendimiento general del modelo y calcular métricas de evaluación,
como la precisión, la sensibilidad, la especificidad y el valor predictivo positivo.

Modelo Probit

probabilidad <- predict.glm(modelo_probit,type="response")


estimado <- factor(ifelse(probabilidad>0.5,1,0))
real <- telefonos$compra
confusionMatrix(estimado,real, positive = "1")

## Confusion Matrix and Statistics


##
## Reference
## Prediction 0 1
## 0 351 1
## 1 1 647
##
## Accuracy : 0.998
## 95% CI : (0.9928, 0.9998)
## No Information Rate : 0.648
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9956
##
## Mcnemar’s Test P-Value : 1
##
## Sensitivity : 0.9985
## Specificity : 0.9972
## Pos Pred Value : 0.9985
## Neg Pred Value : 0.9972
## Prevalence : 0.6480
## Detection Rate : 0.6470
## Detection Prevalence : 0.6480
## Balanced Accuracy : 0.9978
##
## ’Positive’ Class : 1
##

10

También podría gustarte