Tipo: Regresión Lineal Simple
Nombre: Empresa y salarios
Descripción: Vamos a ver si podemor predecir el salario actual de la persona en función del salario con el que entró a trabajar
Biliografia: https://www.youtube.com/watch?v=-p02G7NXlSk&list=PLKc8oG2WuyL9nO8z0ImlZ0SgRWm2NuKBb
url1<-"https://raw.githubusercontent.com/armandovl/datasets_uno/main/empresa_salarios.csv"
datos1<-read.csv(url(url1)) #llamamos el dataset mediante una url
head(datos1,7) #los primeros 7 registros
## id sexo fechnac educ catlab salario_actual salario_inicial antiguedad
## 1 1 1 03/02/1952 15 3 57000 27000 98
## 2 2 1 23/05/1958 16 1 40200 18750 98
## 3 3 0 26/07/1929 12 1 21450 12000 98
## 4 4 0 15/04/1947 8 1 21900 13200 98
## 5 5 1 09/02/1955 15 1 45000 21000 98
## 6 6 1 22/08/1958 15 1 32100 13500 98
## 7 7 1 26/04/1956 15 1 36000 18750 98
## experiencia minoria directivo
## 1 144 0 1
## 2 36 0 0
## 3 381 0 0
## 4 190 0 0
## 5 138 0 0
## 6 67 0 0
## 7 114 0 0
#estructura de los datos
str(datos1)
## 'data.frame': 474 obs. of 11 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sexo : int 1 1 0 0 1 1 1 0 0 0 ...
## $ fechnac : chr "03/02/1952" "23/05/1958" "26/07/1929" "15/04/1947" ...
## $ educ : int 15 16 12 8 15 15 15 12 15 12 ...
## $ catlab : int 3 1 1 1 1 1 1 1 1 1 ...
## $ salario_actual : int 57000 40200 21450 21900 45000 32100 36000 21900 27900 24000 ...
## $ salario_inicial: int 27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
## $ antiguedad : int 98 98 98 98 98 98 98 98 98 98 ...
## $ experiencia : int 144 36 381 190 138 67 114 0 115 244 ...
## $ minoria : int 0 0 0 0 0 0 0 0 0 0 ...
## $ directivo : int 1 0 0 0 0 0 0 0 0 0 ...
#estadísticos desrcriptivos
summary(datos1)
## id sexo fechnac educ
## Min. : 1.0 Min. :0.0000 Length:474 Min. : 8.00
## 1st Qu.:119.2 1st Qu.:0.0000 Class :character 1st Qu.:12.00
## Median :237.5 Median :1.0000 Mode :character Median :12.00
## Mean :237.5 Mean :0.5443 Mean :13.49
## 3rd Qu.:355.8 3rd Qu.:1.0000 3rd Qu.:15.00
## Max. :474.0 Max. :1.0000 Max. :21.00
## catlab salario_actual salario_inicial antiguedad
## Min. :1.000 Min. : 15750 Min. : 9000 Min. :63.00
## 1st Qu.:1.000 1st Qu.: 24000 1st Qu.:12488 1st Qu.:72.00
## Median :1.000 Median : 28875 Median :15000 Median :81.00
## Mean :1.411 Mean : 34420 Mean :17016 Mean :81.11
## 3rd Qu.:1.000 3rd Qu.: 36938 3rd Qu.:17490 3rd Qu.:90.00
## Max. :3.000 Max. :135000 Max. :79980 Max. :98.00
## experiencia minoria directivo
## Min. : 0.00 Min. :0.0000 Min. :0.0000
## 1st Qu.: 19.25 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 55.00 Median :0.0000 Median :0.0000
## Mean : 95.86 Mean :0.2194 Mean :0.1772
## 3rd Qu.:138.75 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :476.00 Max. :1.0000 Max. :1.0000
vamos a ver la correlación entre esas dos variables
cor.test(datos1$salario_inicial,datos1$salario_actual)
##
## Pearson's product-moment correlation
##
## data: datos1$salario_inicial and datos1$salario_actual
## t = 40.276, df = 472, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8580696 0.8989267
## sample estimates:
## cor
## 0.8801175
#tambien se puede hacer como correlación de kendall o spearman
#cor.test(datos1$salario_inicial,datos1$salario_actual, method = "kendall")
Vamos a ver graficamente como se comporta el salario en actual en funcion del salario inicial
#Para ver los parametros, se escribe en la consola ?plot
plot(datos1$salario_inicial,datos1$salario_actual,
col="green3",
pch=18,
xlab="Salario inicial",
ylab="Salario actual",
main="Relación entre el salario actual y el salarion inicial",
sub="relacion lineal")
Parece que sí se ve una forma de relación lineal
# alt 126 = ~
modelo1<-lm(salario_actual~salario_inicial,datos1)
summary(modelo1)
##
## Call:
## lm(formula = salario_actual ~ salario_inicial, data = datos1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -35424 -4031 -1154 2584 49293
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.928e+03 8.887e+02 2.17 0.0305 *
## salario_inicial 1.909e+00 4.741e-02 40.28 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8115 on 472 degrees of freedom
## Multiple R-squared: 0.7746, Adjusted R-squared: 0.7741
## F-statistic: 1622 on 1 and 472 DF, p-value: < 2.2e-16
Tabla de annova: p-value: < 2.2e-16 ,sí existe una pendiente, e modelo si es significativo
Coeficientes de determinación R2: 0.7741 (se usa el r2 ajustado que es más riguroso a la hora de interpretar la bondad de ajuste del modelo, cuanto del porcentaje de la variabilidad de la variable predicha es explicado por la variable predictora
Coeficientes y constuir la ecuación:
modelo1$coefficients
## (Intercept) salario_inicial
## 1928.20576 1.90945
#la línea roja tiene que estar sobre la línea punteada, en este caso no se cumple
plot(modelo1,1)
residuos=residuals(modelo1)
mean(residuos)
## [1] -1.862293e-13
a pesar de que es negativo, Se acerca mucho al cero
Se ve que tiene una alta curtosis
#hacemos la gráfica de histograma
hist(residuos, breaks=50 , col="lightblue", freq = FALSE)
#obtenemos la línea de densidad
lines(density(residuos), lwd = 2, col = 'blue')
#tendencia de curva normal
x <- seq(min(residuos), max(residuos), length = 40)
f <- dnorm(x, mean = mean(residuos), sd = sd(residuos))
lines(x, f, col = "red", lwd = 2)
#todos se deben acercar a la línea punteada, pero hay varios que no
plot(modelo1,2)
shapiro.test(residuos)# este test solo es para menos de 50 observaciones
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.85688, p-value < 2.2e-16
nos dice que no hay normalidad, pero vamos a hacer otro tipo de prueba
# Alternativamente conviene usar la modificación de Lilliefors a este test.
# Esta corrección considera que los parámetros son estimados, a diferencia
# del «ks» «a secas»:
library(nortest)
lillie.test(residuos)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: residuos
## D = 0.12727, p-value < 2.2e-16
# realizar la prueba Anderson-Darling para comprobar la normalidad >50 observaciones
ad.test (residuos)
##
## Anderson-Darling normality test
##
## data: residuos
## A = 16.125, p-value < 2.2e-16
En el caso de las dos pruebas anteriores, nos salen valores menores a 0.05 entonces no hay normalidad, H0= Normalidad Ha= No normalidad
par(mfrow=c(2,1)) #para dividir el gráfico en dos
hist(residuos, col="yellow",breaks=60) #color y cortes
boxplot(residuos, bty="l", range=1.5, col="yellow", horizontal=T,xlab="residuos") #boxplot
par(mfrow=c(1,1)) #devolver a los parametros iniciales
En el gráfico anterior s eve que hay muchos valores atípicos, sobrepasan 1 y medio el rango intercuartil
#
plot(modelo1,5)
Graficamente se ve con el grafico 1 del modelo, los puntos no tienen que tener forma de embudo
plot(modelo1,1)
predichos=fitted(modelo1)
plot(residuos~predichos)
plot(modelo1,3)
EN el grafico de escalas la linea roja debe ser horizontal y no debe mostrar ningun patron
parece que si hay una forma de embudo, pero vamos a hacer la prueba Breusch-Pagan
h0=no hay heterocedasticidad, ha= si hay heterocedasticidad
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(modelo1)
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 59.224, df = 1, p-value = 1.407e-14
el pvalor es menor a 0.05 es decir que se rechaza la h0, si hay heterocedasticidad
plot(datos1$salario_inicial,datos1$salario_actual,
col="green3",
pch=18,
xlab="Salario inicial",
ylab="Salario actual",
main="Relación entre el salario actual y el salario inicial",
sub="relacion lineal")
abline(modelo1, col="red")
plot(datos1$salario_inicial,residuos,)
cor(datos1$salario_inicial,residuos)
## [1] 1.729793e-17
Tipo: Regresión multiple
Nombre: Empresa y salarios
Descripción: Vamos a ver si podemor predecir el salario actual de la persona en función del salario con el que entró a trabajar y también la variable de años de educacion
Biliografia: https://www.youtube.com/watch?v=-p02G7NXlSk&list=PLKc8oG2WuyL9nO8z0ImlZ0SgRWm2NuKBb
library(rio)
datos2<-import("https://raw.githubusercontent.com/armandovl/datasets_uno/main/empresa_salarios.csv")
head(datos2,7) #los primeros 7 registros
## id sexo fechnac educ catlab salario_actual salario_inicial antiguedad
## 1 1 1 03/02/1952 15 3 57000 27000 98
## 2 2 1 23/05/1958 16 1 40200 18750 98
## 3 3 0 26/07/1929 12 1 21450 12000 98
## 4 4 0 15/04/1947 8 1 21900 13200 98
## 5 5 1 09/02/1955 15 1 45000 21000 98
## 6 6 1 22/08/1958 15 1 32100 13500 98
## 7 7 1 26/04/1956 15 1 36000 18750 98
## experiencia minoria directivo
## 1 144 0 1
## 2 36 0 0
## 3 381 0 0
## 4 190 0 0
## 5 138 0 0
## 6 67 0 0
## 7 114 0 0
#estructura de los datos
str(datos2)
## 'data.frame': 474 obs. of 11 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sexo : int 1 1 0 0 1 1 1 0 0 0 ...
## $ fechnac : chr "03/02/1952" "23/05/1958" "26/07/1929" "15/04/1947" ...
## $ educ : int 15 16 12 8 15 15 15 12 15 12 ...
## $ catlab : int 3 1 1 1 1 1 1 1 1 1 ...
## $ salario_actual : int 57000 40200 21450 21900 45000 32100 36000 21900 27900 24000 ...
## $ salario_inicial: int 27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
## $ antiguedad : int 98 98 98 98 98 98 98 98 98 98 ...
## $ experiencia : int 144 36 381 190 138 67 114 0 115 244 ...
## $ minoria : int 0 0 0 0 0 0 0 0 0 0 ...
## $ directivo : int 1 0 0 0 0 0 0 0 0 0 ...
#estadísticos desrcriptivos
summary(datos2)
## id sexo fechnac educ
## Min. : 1.0 Min. :0.0000 Length:474 Min. : 8.00
## 1st Qu.:119.2 1st Qu.:0.0000 Class :character 1st Qu.:12.00
## Median :237.5 Median :1.0000 Mode :character Median :12.00
## Mean :237.5 Mean :0.5443 Mean :13.49
## 3rd Qu.:355.8 3rd Qu.:1.0000 3rd Qu.:15.00
## Max. :474.0 Max. :1.0000 Max. :21.00
## catlab salario_actual salario_inicial antiguedad
## Min. :1.000 Min. : 15750 Min. : 9000 Min. :63.00
## 1st Qu.:1.000 1st Qu.: 24000 1st Qu.:12488 1st Qu.:72.00
## Median :1.000 Median : 28875 Median :15000 Median :81.00
## Mean :1.411 Mean : 34420 Mean :17016 Mean :81.11
## 3rd Qu.:1.000 3rd Qu.: 36938 3rd Qu.:17490 3rd Qu.:90.00
## Max. :3.000 Max. :135000 Max. :79980 Max. :98.00
## experiencia minoria directivo
## Min. : 0.00 Min. :0.0000 Min. :0.0000
## 1st Qu.: 19.25 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 55.00 Median :0.0000 Median :0.0000
## Mean : 95.86 Mean :0.2194 Mean :0.1772
## 3rd Qu.:138.75 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :476.00 Max. :1.0000 Max. :1.0000
Ver la relación entre variables cuantitativa
library(PerformanceAnalytics)
chart.Correlation(datos2[,4:11], histogram = F )
vamos a ver la correlación entre todas las variables
cor(datos2[,c(4,6:7)])
## educ salario_actual salario_inicial
## educ 1.0000000 0.6605589 0.6331956
## salario_actual 0.6605589 1.0000000 0.8801175
## salario_inicial 0.6331956 0.8801175 1.0000000
#tambien se puede hacer como correlación de kendall o spearman
#cor.test(datos1$salario_inicial,datos1$salario_actual, method = "kendall")
parece que hay multi colinealidad entre las x (salario inicial, educación)
Vamos a ver graficamente como se comporta el salario en actual en funcion del salario inicial
#Para ver los parametros, se escribe en la consola ?plot
plot(datos2$salario_inicial,datos2$salario_actual,
col="green3",
pch=18,
xlab="Salario inicial",
ylab="Salario actual",
main="Relación entre el salario actual y el salarion inicial",
sub="relacion lineal")
plot(datos2$salario_inicial,datos2$educ,
col="green3",
pch=18,
xlab="Salario inicial",
ylab="Años educacion",
main="Relación entre el salario actual y el años de educación",
sub="relacion lineal")
no parece que haya una relación lineal
# alt 126 = ~
modelo2<-lm(salario_actual~salario_inicial+educ,datos2)
summary(modelo2)
##
## Call:
## lm(formula = salario_actual ~ salario_inicial + educ, data = datos2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29581 -4093 -741 2917 49218
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.809e+03 1.754e+03 -4.452 1.06e-05 ***
## salario_inicial 1.673e+00 5.885e-02 28.423 < 2e-16 ***
## educ 1.020e+03 1.606e+02 6.356 4.91e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7797 on 471 degrees of freedom
## Multiple R-squared: 0.7924, Adjusted R-squared: 0.7915
## F-statistic: 898.9 on 2 and 471 DF, p-value: < 2.2e-16
Tabla de annova: p-value: < 2.2e-16, y todas la variables son significativas ,sí existe una pendiente, e modelo si es significativo
Coeficientes de determinación R2: 0.7915 (se usa el r2 ajustado que es más riguroso a la hora de interpretar la bondad de ajuste del modelo, cuanto del porcentaje de la variabilidad de la variable predicha es explicado por la variable predictora
Coeficientes y constuir la ecuación:
modelo2$coefficients
## (Intercept) salario_inicial educ
## -7808.714157 1.672631 1020.390142
#la línea roja tiene que estar sobre la línea punteada, en este caso no se cumple
plot(modelo2,1)
la línea roja se aleja de la punteada, pero menos de lo que era con una sola variable
residuos=residuals(modelo2)
mean(residuos)
## [1] -6.146089e-13
a pesar de que es negativo, Se acerca mucho al cero
Se ve que tiene una alta curtosis
#hacemos la gráfica de histograma
hist(residuos, breaks=50 , col="lightblue", freq = FALSE)
#obtenemos la línea de densidad
lines(density(residuos), lwd = 2, col = 'blue')
#tendencia de curva normal
x <- seq(min(residuos), max(residuos), length = 40)
f <- dnorm(x, mean = mean(residuos), sd = sd(residuos))
lines(x, f, col = "red", lwd = 2)
#todos se deben acercar a la línea punteada, pero hay varios que no
plot(modelo2,2)
shapiro.test(residuos)# este test solo es para menos de 50 observaciones
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.87555, p-value < 2.2e-16
nos dice que no hay normalidad, pero vamos a hacer otro tipo de prueba
# Alternativamente conviene usar la modificación de Lilliefors a este test.
# Esta corrección considera que los parámetros son estimados, a diferencia
# del «ks» «a secas»:
library(nortest)
lillie.test(residuos)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: residuos
## D = 0.11123, p-value = 2.23e-15
# realizar la prueba Anderson-Darling para comprobar la normalidad >50 observaciones
ad.test (residuos)
##
## Anderson-Darling normality test
##
## data: residuos
## A = 12.136, p-value < 2.2e-16
En el caso de las dos pruebas anteriores, nos salen valores menores a 0.05 entonces no hay normalidad, H0= Normalidad Ha= No normalidad
par(mfrow=c(2,1)) #para dividir el gráfico en dos
hist(residuos, col="yellow",breaks=60) #color y cortes
boxplot(residuos, bty="l", range=1.5, col="yellow", horizontal=T,xlab="residuos") #boxplot
par(mfrow=c(1,1)) #devolver a los parametros iniciales
En el gráfico anterior s eve que hay muchos valores atípicos, sobrepasan 1 y medio el rango intercuartil
vamos a ver si hay valores influyentes (valores con mayor distancia de cook), los que están fuera de la línea punteada, estos se pueden quitar y ver como sale el modelo
#
plot(modelo2,5)
te nemos que ver que estos valores no sean iguales o mayores que 1
plot(modelo2,4)
#calcularlos manualmente
#datosCook<-cooks.distance(modelo2) #obtener los datos de cook
#which(ddatosCook>1) #solo me de los valores mayores a 1
Graficamente se ve con el grafico 1 del modelo, los puntos no tienen que tener forma de embudo
plot(modelo2,1)
predichos=fitted(modelo2)
plot(residuos~predichos)
plot(modelo2,3)
EN el grafico de escalas la linea roja debe ser horizontal y no debe mostrar ningun patron
parece que si hay una forma de embudo, pero vamos a hacer la prueba Breusch-Pagan
h0=no hay heterocedasticidad, ha= si hay heterocedasticidad
library(lmtest)
bptest(modelo2)
##
## studentized Breusch-Pagan test
##
## data: modelo2
## BP = 49.22, df = 2, p-value = 2.052e-11
el pvalor es menor a 0.05 es decir que se rechaza la h0, si hay heterocedasticidad
Hacermos la prueba de factores de inflacion de varianza
donde el valor no tiene que estar entre 5 y diez
library(DescTools)
VIF(modelo2)
## salario_inicial educ
## 1.669273 1.669273
library(ggplot2)
str(datos2)
## 'data.frame': 474 obs. of 11 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sexo : int 1 1 0 0 1 1 1 0 0 0 ...
## $ fechnac : chr "03/02/1952" "23/05/1958" "26/07/1929" "15/04/1947" ...
## $ educ : int 15 16 12 8 15 15 15 12 15 12 ...
## $ catlab : int 3 1 1 1 1 1 1 1 1 1 ...
## $ salario_actual : int 57000 40200 21450 21900 45000 32100 36000 21900 27900 24000 ...
## $ salario_inicial: int 27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
## $ antiguedad : int 98 98 98 98 98 98 98 98 98 98 ...
## $ experiencia : int 144 36 381 190 138 67 114 0 115 244 ...
## $ minoria : int 0 0 0 0 0 0 0 0 0 0 ...
## $ directivo : int 1 0 0 0 0 0 0 0 0 0 ...
plot<-ggplot(datos2,aes(x =salario_inicial, y =salario_actual)) +
geom_point(aes(size=educ, alpha=0.3))+ #, shape=island, color = sex
# xlab('Largo del pico') +
# ylab('Profundidad del pico') +
# ggtitle('Tres variables cuanti, dos cuali') +
# theme_minimal()
#
# plot$labels$colour = "Sexo"
# plot$labels$size = "Peso"
# plot$labels$shape = "Isla"
#geom_smooth(method="lm",color="red") +
#geom_smooth(data=datos2,method=lm, formula=y~(x^2) ,size=1)
stat_smooth(data=datos2,method="lm", formula="y~x^2" ,size=1,color="purple")
#poner otro modelo cuadratico
#+ stat_smooth(data=datos2,method="lm", formula="y~x+I(x^2)" ,size=1,color="red", )
plot
library(ggExtra)
plot<-ggplot(datos2,aes(x =salario_inicial, y =salario_actual)) +
geom_point(aes(size=educ, alpha=0.3))+ #, shape=island, color = sex size=
# xlab('Largo del pico') +
# ylab('Profundidad del pico') +
# ggtitle('Tres variables cuanti, dos cuali') +
# theme_minimal()
#
# plot$labels$colour = "Sexo"
# plot$labels$size = "Peso"
# plot$labels$shape = "Isla"
#geom_smooth(method="lm",color="red") +
#geom_smooth(data=datos2,method=lm, formula=y~(x^2) ,size=1)
stat_smooth(data=datos2,method="lm", formula="y~x^2" ,size=1,color="purple")
#poner otro modelo cuadratico
#+ stat_smooth(data=datos2,method="lm", formula="y~x+I(x^2)" ,size=1,color="red", )
#adicional boxplot
ggMarginal(plot,type="boxplot")
Tipo: Regresión multiple
Nombre: Empresa y salarios
Descripción: Vamos a ver si podemor predecir el salario actual de la persona en función varias varables, tanto continuas, como dummies
Biliografia: https://www.youtube.com/watch?v=-p02G7NXlSk&list=PLKc8oG2WuyL9nO8z0ImlZ0SgRWm2NuKBb
library(rio)
datos3<-import("https://raw.githubusercontent.com/armandovl/datasets_uno/main/empresa_salarios.csv")
head(datos3,7) #los primeros 7 registros
## id sexo fechnac educ catlab salario_actual salario_inicial antiguedad
## 1 1 1 03/02/1952 15 3 57000 27000 98
## 2 2 1 23/05/1958 16 1 40200 18750 98
## 3 3 0 26/07/1929 12 1 21450 12000 98
## 4 4 0 15/04/1947 8 1 21900 13200 98
## 5 5 1 09/02/1955 15 1 45000 21000 98
## 6 6 1 22/08/1958 15 1 32100 13500 98
## 7 7 1 26/04/1956 15 1 36000 18750 98
## experiencia minoria directivo
## 1 144 0 1
## 2 36 0 0
## 3 381 0 0
## 4 190 0 0
## 5 138 0 0
## 6 67 0 0
## 7 114 0 0
#estructura de los datos
str(datos3)
## 'data.frame': 474 obs. of 11 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sexo : int 1 1 0 0 1 1 1 0 0 0 ...
## $ fechnac : chr "03/02/1952" "23/05/1958" "26/07/1929" "15/04/1947" ...
## $ educ : int 15 16 12 8 15 15 15 12 15 12 ...
## $ catlab : int 3 1 1 1 1 1 1 1 1 1 ...
## $ salario_actual : int 57000 40200 21450 21900 45000 32100 36000 21900 27900 24000 ...
## $ salario_inicial: int 27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
## $ antiguedad : int 98 98 98 98 98 98 98 98 98 98 ...
## $ experiencia : int 144 36 381 190 138 67 114 0 115 244 ...
## $ minoria : int 0 0 0 0 0 0 0 0 0 0 ...
## $ directivo : int 1 0 0 0 0 0 0 0 0 0 ...
#estadísticos desrcriptivos
summary(datos3)
## id sexo fechnac educ
## Min. : 1.0 Min. :0.0000 Length:474 Min. : 8.00
## 1st Qu.:119.2 1st Qu.:0.0000 Class :character 1st Qu.:12.00
## Median :237.5 Median :1.0000 Mode :character Median :12.00
## Mean :237.5 Mean :0.5443 Mean :13.49
## 3rd Qu.:355.8 3rd Qu.:1.0000 3rd Qu.:15.00
## Max. :474.0 Max. :1.0000 Max. :21.00
## catlab salario_actual salario_inicial antiguedad
## Min. :1.000 Min. : 15750 Min. : 9000 Min. :63.00
## 1st Qu.:1.000 1st Qu.: 24000 1st Qu.:12488 1st Qu.:72.00
## Median :1.000 Median : 28875 Median :15000 Median :81.00
## Mean :1.411 Mean : 34420 Mean :17016 Mean :81.11
## 3rd Qu.:1.000 3rd Qu.: 36938 3rd Qu.:17490 3rd Qu.:90.00
## Max. :3.000 Max. :135000 Max. :79980 Max. :98.00
## experiencia minoria directivo
## Min. : 0.00 Min. :0.0000 Min. :0.0000
## 1st Qu.: 19.25 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 55.00 Median :0.0000 Median :0.0000
## Mean : 95.86 Mean :0.2194 Mean :0.1772
## 3rd Qu.:138.75 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :476.00 Max. :1.0000 Max. :1.0000
#convertir a factor varias palabras
# names<-c(1:3,5)
# mydata[,names]<-lapply(mydata[,names], factor)
names<-c("sexo","minoria","directivo","catlab")
datos3[,names]<-lapply(datos3[,names], factor)
str(datos3)
## 'data.frame': 474 obs. of 11 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sexo : Factor w/ 2 levels "0","1": 2 2 1 1 2 2 2 1 1 1 ...
## $ fechnac : chr "03/02/1952" "23/05/1958" "26/07/1929" "15/04/1947" ...
## $ educ : int 15 16 12 8 15 15 15 12 15 12 ...
## $ catlab : Factor w/ 3 levels "1","2","3": 3 1 1 1 1 1 1 1 1 1 ...
## $ salario_actual : int 57000 40200 21450 21900 45000 32100 36000 21900 27900 24000 ...
## $ salario_inicial: int 27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
## $ antiguedad : int 98 98 98 98 98 98 98 98 98 98 ...
## $ experiencia : int 144 36 381 190 138 67 114 0 115 244 ...
## $ minoria : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
## $ directivo : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
table(datos3$catlab)
##
## 1 2 3
## 363 27 84
Ver la relación entre variables cuantitativa
library(PerformanceAnalytics)
chart.Correlation(datos3[,c(4,6:9)], histogram = F )
vamos a ver la correlación entre todas las variables
cor(datos3[,c(4,6:9)])
## educ salario_actual salario_inicial antiguedad
## educ 1.00000000 0.66055891 0.63319565 0.047378777
## salario_actual 0.66055891 1.00000000 0.88011747 0.084092267
## salario_inicial 0.63319565 0.88011747 1.00000000 -0.019753475
## antiguedad 0.04737878 0.08409227 -0.01975347 1.000000000
## experiencia -0.25235252 -0.09746693 0.04513563 0.002978134
## experiencia
## educ -0.252352521
## salario_actual -0.097466926
## salario_inicial 0.045135627
## antiguedad 0.002978134
## experiencia 1.000000000
#tambien se puede hacer como correlación de kendall o spearman
#cor.test(datos1$salario_inicial,datos1$salario_actual, method = "kendall")
library(corrplot)
## corrplot 0.92 loaded
corrplot(cor(datos3[,c(4,6:9)]),method="circle")
parece que hay multi colinealidad entre variables
# alt 126 = ~
modelo3<-lm(salario_actual~salario_inicial+educ+minoria+directivo+sexo+catlab,datos3)
summary(modelo3)
##
## Call:
## lm(formula = salario_actual ~ salario_inicial + educ + minoria +
## directivo + sexo + catlab, data = datos3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -23447 -3513 -859 2548 47093
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 151.2521 2045.6150 0.074 0.9411
## salario_inicial 1.2100 0.0753 16.070 < 2e-16 ***
## educ 785.6276 164.0812 4.788 2.26e-06 ***
## minoria1 -1276.7892 831.0418 -1.536 0.1251
## directivo1 12037.1406 1443.0242 8.342 8.32e-16 ***
## sexo1 1913.8399 807.4902 2.370 0.0182 *
## catlab2 3242.6141 1608.0999 2.016 0.0443 *
## catlab3 NA NA NA NA
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7216 on 467 degrees of freedom
## Multiple R-squared: 0.8237, Adjusted R-squared: 0.8214
## F-statistic: 363.6 on 6 and 467 DF, p-value: < 2.2e-16
Tabla de annova: p-value: < 2.2e-16, si hay pendiente pero no todas la variables son significativas
Coeficientes de determinación R2: 0.8214 (se usa el r2 ajustado que es más riguroso a la hora de interpretar la bondad de ajuste del modelo, cuanto del porcentaje de la variabilidad de la variable predicha es explicado por la variable predictora
Coeficientes y constuir la ecuación:
#va otra vez el modelo sin minoria
# alt 126 = ~
modelo3<-lm(salario_actual~salario_inicial+educ+directivo+sexo+catlab,datos3)
summary(modelo3)
##
## Call:
## lm(formula = salario_actual ~ salario_inicial + educ + directivo +
## sexo + catlab, data = datos3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -23521 -3434 -815 2761 47474
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.974e+02 2.036e+03 -0.097 0.9228
## salario_inicial 1.217e+00 7.527e-02 16.168 < 2e-16 ***
## educ 7.866e+02 1.643e+02 4.787 2.27e-06 ***
## directivo1 1.224e+04 1.439e+03 8.501 2.53e-16 ***
## sexo1 1.757e+03 8.022e+02 2.190 0.0290 *
## catlab2 3.019e+03 1.604e+03 1.882 0.0604 .
## catlab3 NA NA NA NA
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7227 on 468 degrees of freedom
## Multiple R-squared: 0.8228, Adjusted R-squared: 0.8209
## F-statistic: 434.5 on 5 and 468 DF, p-value: < 2.2e-16
#quitar catlab que tambien genera problemas
modelo3<-lm(salario_actual~salario_inicial+educ+directivo+sexo,datos3)
summary(modelo3)
##
## Call:
## lm(formula = salario_actual ~ salario_inicial + educ + directivo +
## sexo, data = datos3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -23841 -3552 -811 2808 47243
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.067e+03 1.927e+03 0.554 0.57994
## salario_inicial 1.223e+00 7.541e-02 16.211 < 2e-16 ***
## educ 6.785e+02 1.544e+02 4.395 1.37e-05 ***
## directivo1 1.223e+04 1.443e+03 8.472 3.15e-16 ***
## sexo1 2.258e+03 7.588e+02 2.975 0.00308 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7246 on 469 degrees of freedom
## Multiple R-squared: 0.8214, Adjusted R-squared: 0.8199
## F-statistic: 539.4 on 4 and 469 DF, p-value: < 2.2e-16
ya mas o menos quedó el modelo, vamos a sacar los coeficientes
modelo3$coefficients
## (Intercept) salario_inicial educ directivo1 sexo1
## 1067.324880 1.222557 678.468029 12226.010592 2257.708452
#la línea roja tiene que estar sobre la línea punteada, en este caso no se cumple
plot(modelo3,1)
la línea roja se aleja de la punteada, pero menos de lo que era con una sola variable
residuos=residuals(modelo3)
mean(residuos)
## [1] 3.295545e-13
Se acerca mucho al cero
Se ve que tiene una alta curtosis
#hacemos la gráfica de histograma
hist(residuos, breaks=50 , col="lightblue", freq = FALSE)
#obtenemos la línea de densidad
lines(density(residuos), lwd = 2, col = 'blue')
#tendencia de curva normal
x <- seq(min(residuos), max(residuos), length = 40)
f <- dnorm(x, mean = mean(residuos), sd = sd(residuos))
lines(x, f, col = "red", lwd = 2)
#todos se deben acercar a la línea punteada, pero hay varios que no
plot(modelo3,2)
shapiro.test(residuos)# este test solo es para menos de 50 observaciones
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.88391, p-value < 2.2e-16
nos dice que no hay normalidad, pero vamos a hacer otro tipo de prueba
# Alternativamente conviene usar la modificación de Lilliefors a este test.
# Esta corrección considera que los parámetros son estimados, a diferencia
# del «ks» «a secas»:
library(nortest)
lillie.test(residuos)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: residuos
## D = 0.10022, p-value = 2.429e-12
# realizar la prueba Anderson-Darling para comprobar la normalidad >50 observaciones
ad.test (residuos)
##
## Anderson-Darling normality test
##
## data: residuos
## A = 11.281, p-value < 2.2e-16
En el caso de las dos pruebas anteriores, nos salen valores menores a 0.05 entonces no hay normalidad, H0= Normalidad Ha= No normalidad
par(mfrow=c(2,1)) #para dividir el gráfico en dos
hist(residuos, col="yellow",breaks=60) #color y cortes
boxplot(residuos, bty="l", range=1.5, col="yellow", horizontal=T,xlab="residuos") #boxplot
par(mfrow=c(1,1)) #devolver a los parametros iniciales
En el gráfico anterior s eve que hay muchos valores atípicos, sobrepasan 1 y medio el rango intercuartil
vamos a ver si hay valores influyentes (valores con mayor distancia de cook), los que están fuera de la línea punteada, estos se pueden quitar y ver como sale el modelo
#
plot(modelo3,5)
te nemos que ver que estos valores no sean iguales o mayores que 1
plot(modelo3,4)
#calcularlos manualmente
#datosCook<-cooks.distance(modelo2) #obtener los datos de cook
#which(ddatosCook>1) #solo me de los valores mayores a 1
Graficamente se ve con el grafico 1 del modelo, los puntos no tienen que tener forma de embudo
plot(modelo3,1)
predichos=fitted(modelo3)
plot(residuos~predichos)
plot(modelo3,3)
EN el grafico de escalas la linea roja debe ser horizontal y no debe mostrar ningun patron
parece que si hay una forma de embudo, pero vamos a hacer la prueba Breusch-Pagan
h0=no hay heterocedasticidad, ha= si hay heterocedasticidad
library(lmtest)
bptest(modelo3)
##
## studentized Breusch-Pagan test
##
## data: modelo3
## BP = 55.904, df = 4, p-value = 2.1e-11
el pvalor es menor a 0.05 es decir que se rechaza la h0, si hay heterocedasticidad
Hacermos la prueba de factores de inflacion de varianza
donde el valor no tiene que estar entre 5 y diez
library(DescTools)
VIF(modelo3)
## salario_inicial educ directivo sexo
## 3.173415 1.786305 2.741302 1.289283
Es la prueba de durwin watson , solo se hace cuando sean modelos de series de tiempo
H 0 (hipótesis nula): No existe correlación entre los residuos.
H A (hipótesis alternativa): Los residuos están autocorrelacionados.
dwtest(modelo3) #si hay autocorrelación
##
## Durbin-Watson test
##
## data: modelo3
## DW = 1.7954, p-value = 0.01193
## alternative hypothesis: true autocorrelation is greater than 0
library(ggplot2)
str(datos3)
## 'data.frame': 474 obs. of 11 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sexo : Factor w/ 2 levels "0","1": 2 2 1 1 2 2 2 1 1 1 ...
## $ fechnac : chr "03/02/1952" "23/05/1958" "26/07/1929" "15/04/1947" ...
## $ educ : int 15 16 12 8 15 15 15 12 15 12 ...
## $ catlab : Factor w/ 3 levels "1","2","3": 3 1 1 1 1 1 1 1 1 1 ...
## $ salario_actual : int 57000 40200 21450 21900 45000 32100 36000 21900 27900 24000 ...
## $ salario_inicial: int 27000 18750 12000 13200 21000 13500 18750 9750 12750 13500 ...
## $ antiguedad : int 98 98 98 98 98 98 98 98 98 98 ...
## $ experiencia : int 144 36 381 190 138 67 114 0 115 244 ...
## $ minoria : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
## $ directivo : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
plot<-ggplot(datos3,aes(x =salario_inicial, y =salario_actual))+ #empezamos por dos simples
geom_point()
plot
plot<-ggplot(datos3,aes(x =salario_inicial, y =salario_actual))+ #empezamos por dos simples
geom_point(aes(size=educ, alpha=0.3)) #agregamos otra cuanti en tamaño
plot
plot<-ggplot(datos3,aes(x =salario_inicial, y =salario_actual))+
geom_point(aes(size=educ, alpha=0.3, color=sexo)) #agregamos una cuali en color
plot
#las tres cualitativas van a estar en sexo
plot<-ggplot(datos3,aes(x =salario_inicial, y =salario_actual))+
geom_point(aes(size=educ, alpha=0.3, color=sexo,shape=sexo))+
facet_grid(sexo~.)
plot
#linea de regresion
plot<-ggplot(datos3,aes(x =salario_inicial, y =salario_actual))+
geom_point(aes(size=educ, alpha=0.3, color=sexo,shape=sexo))+
facet_grid(sexo~.)+
geom_smooth(method=lm, se=FALSE, fullrange=TRUE)
plot
## `geom_smooth()` using formula 'y ~ x'
#hacer un zoom al grafico
#linea de regresion
plot<-ggplot(datos3,aes(x =salario_inicial, y =salario_actual))+
geom_point(aes(size=educ, alpha=0.3, color=sexo,shape=sexo))+
facet_grid(sexo~.)+
geom_smooth(method=lm, se=FALSE, fullrange=TRUE)+
xlim(10000, 20000)
plot
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 95 rows containing non-finite values (stat_smooth).
## Warning: Removed 95 rows containing missing values (geom_point).