knitr::opts_chunk$set(echo = TRUE)
#CARGA DE LIBRERIAS
knitr::opts_chunk$set(echo = TRUE)
library(readr)
library(data.table)
## Warning: package 'data.table' was built under R version 4.4.3
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ purrr     1.0.2
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   4.0.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::between()     masks data.table::between()
## ✖ dplyr::filter()      masks stats::filter()
## ✖ dplyr::first()       masks data.table::first()
## ✖ lubridate::hour()    masks data.table::hour()
## ✖ lubridate::isoweek() masks data.table::isoweek()
## ✖ dplyr::lag()         masks stats::lag()
## ✖ dplyr::last()        masks data.table::last()
## ✖ lubridate::mday()    masks data.table::mday()
## ✖ lubridate::minute()  masks data.table::minute()
## ✖ lubridate::month()   masks data.table::month()
## ✖ lubridate::quarter() masks data.table::quarter()
## ✖ lubridate::second()  masks data.table::second()
## ✖ purrr::transpose()   masks data.table::transpose()
## ✖ lubridate::wday()    masks data.table::wday()
## ✖ lubridate::week()    masks data.table::week()
## ✖ lubridate::yday()    masks data.table::yday()
## ✖ lubridate::year()    masks data.table::year()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
library(vcd)
## Warning: package 'vcd' was built under R version 4.4.3
## Cargando paquete requerido: grid
library(sjPlot)
## Learn more about sjPlot with 'browseVignettes("sjPlot")'.
## 
## Adjuntando el paquete: 'sjPlot'
## 
## The following object is masked from 'package:ggplot2':
## 
##     set_theme
library(epiR)
## Cargando paquete requerido: survival
## Package epiR 2.0.77 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
library(gtsummary)
## Warning: package 'gtsummary' was built under R version 4.4.3
library(tableone)
library(ggpubr)
library(vcd)
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.4.3
## Cargando paquete requerido: gnm
## Warning: package 'gnm' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'vcdExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     summarise
library(CalibrationCurves)
## Warning: package 'CalibrationCurves' was built under R version 4.4.3
## Cargando paquete requerido: rms
## Warning: package 'rms' was built under R version 4.4.3
## Cargando paquete requerido: Hmisc
## Warning: package 'Hmisc' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'Hmisc'
## 
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## 
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(pROC)
## Warning: package 'pROC' was built under R version 4.4.3
## Type 'citation("pROC")' for a citation.
## 
## Adjuntando el paquete: 'pROC'
## 
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
library(glmnet)
## Warning: package 'glmnet' was built under R version 4.4.3
## Cargando paquete requerido: Matrix
## 
## Adjuntando el paquete: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## Loaded glmnet 4.1-10
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Cargando paquete requerido: lattice
## 
## Adjuntando el paquete: 'lattice'
## 
## The following object is masked from 'package:gnm':
## 
##     barley
## 
## 
## Adjuntando el paquete: 'caret'
## 
## The following object is masked from 'package:survival':
## 
##     cluster
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(broom.helpers)
## Warning: package 'broom.helpers' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'broom.helpers'
## 
## The following objects are masked from 'package:gtsummary':
## 
##     all_categorical, all_continuous, all_contrasts, all_dichotomous,
##     all_interaction, all_intercepts
options(scipen = 999, digits = 3, encoding = 'UTF-8')
library(naniar)
## Warning: package 'naniar' was built under R version 4.4.3
library(dplyr)
library(survival)
library(survminer)
## 
## Adjuntando el paquete: 'survminer'
## 
## The following object is masked from 'package:survival':
## 
##     myeloma
library(MASS)
## 
## Adjuntando el paquete: 'MASS'
## 
## The following object is masked from 'package:gtsummary':
## 
##     select
## 
## The following object is masked from 'package:dplyr':
## 
##     select
library(rms)
library(sjPlot)
pkgbuild::has_build_tools(debug = TRUE)
## Trying to compile a simple C file
## Running "C:/PROGRA~1/R/R-44~1.2/bin/x64/Rcmd.exe" SHLIB foo.c
## using C compiler: 'gcc.exe (GCC) 13.3.0'
## gcc  -I"C:/PROGRA~1/R/R-44~1.2/include" -DNDEBUG     -I"C:/rtools44/x86_64-w64-mingw32.static.posix/include"     -O2 -Wall  -mfpmath=sse -msse2 -mstackrealign  -c foo.c -o foo.o
## gcc -shared -s -static-libgcc -o foo.dll tmp.def foo.o -LC:/rtools44/x86_64-w64-mingw32.static.posix/lib/x64 -LC:/rtools44/x86_64-w64-mingw32.static.posix/lib -LC:/PROGRA~1/R/R-44~1.2/bin/x64 -lR
## 
## [1] TRUE
library(ggsurvfit)
## Warning: package 'ggsurvfit' was built under R version 4.4.3
library(riskRegression)
## Warning: package 'riskRegression' was built under R version 4.4.3
## Registered S3 method overwritten by 'riskRegression':
##   method        from 
##   nobs.multinom broom
## riskRegression version 2025.05.20
library(rms)
library(cmprsk)
## Warning: package 'cmprsk' was built under R version 4.4.3
library(prodlim)
## Warning: package 'prodlim' was built under R version 4.4.3
library(naniar)
library(ggplot2)
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
library(tidycmprsk)
## Warning: package 'tidycmprsk' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'tidycmprsk'
## 
## The following objects are masked from 'package:cmprsk':
## 
##     crr, cuminc
## 
## The following object is masked from 'package:gtsummary':
## 
##     trial
library(dplyr)
library(psych)
## Warning: package 'psych' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'psych'
## 
## The following objects are masked from 'package:scales':
## 
##     alpha, rescale
## 
## The following object is masked from 'package:ggsurvfit':
## 
##     %+%
## 
## The following object is masked from 'package:Hmisc':
## 
##     describe
## 
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.4.3
## Cargando paquete requerido: zoo
## 
## Adjuntando el paquete: 'zoo'
## 
## The following objects are masked from 'package:data.table':
## 
##     yearmon, yearqtr
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## 
## Adjuntando el paquete: 'lmtest'
## 
## The following object is masked from 'package:rms':
## 
##     lrtest

Generación de una base de datos. Se genera una base de datos de 200 personas Variables: * Colesterol (continua) * Edad (continua) * Sexo (F,M)

La regresión lineal es un método estadístico que permite determinar el valor promedio de una variable continua de resultado (y) conociendo el valor de la variable predictora (x). En la regresión lineal múltiple, hay más de una variable predictora. La relación entre las variables continuas debe ser lineal. En caso de otro tipo de relación, se debe aplicar otro tipo de modelo.

En la regresión lineal simple, el cálculo para conocer el valor promedio de una variable Y según el valor de X es Y=B0 + B1 * X

Sirve para predecir valores (cuánto es el valor promedio esperado del peso según la edad para un bebé) o explicar relaciones (cuánto aumenta la temperatura del pie por cada grado de temperatura que aumenta la temperatura ambiente) OJO! No prueba causalidad No elimina confusión no medida Asume relación lineal (a veces no es real)

set.seed(123)

n <- 200

COL <- data.frame(
  sexo = sample(c("F", "M"), size = n, replace = TRUE),
  edad = sample(20:70, size = n, replace = TRUE)
)

COL$colesterol <- 150 +
  1.5 * COL$edad +
  ifelse(COL$sexo == "M", 22, 0) +
  rnorm(n, mean = 0, sd = 12)

COL$colesterol <- round(COL$colesterol, 1)

range(COL$colesterol)
## [1] 158 288
head(COL)
##   sexo edad colesterol
## 1    F   49        219
## 2    F   49        205
## 3    F   44        231
## 4    M   35        232
## 5    F   43        201
## 6    M   30        215

Evaluación de la relación entre la variable colesterol y edad Evaluación de la relación entre la variable colesterol y sexo

#Evaluación gráfica 
summary(COL)
##      sexo                edad        colesterol 
##  Length:200         Min.   :20.0   Min.   :158  
##  Class :character   1st Qu.:35.0   1st Qu.:208  
##  Mode  :character   Median :45.0   Median :230  
##                     Mean   :45.4   Mean   :228  
##                     3rd Qu.:57.2   3rd Qu.:246  
##                     Max.   :70.0   Max.   :288
boxplot(colesterol ~ sexo, data = COL,
        ylab = "Colesterol",
        xlab = "Sexo")

plot(COL$edad, COL$colesterol,
     xlab = "Edad",
     ylab = "Colesterol")
abline(lm(colesterol ~ edad, data = COL), col = "red", lwd = 2)

Descripción de las variables

describe(COL$colesterol)
##    vars   n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 200  228 28.7    230     228 31.6 158 288   130 -0.11    -0.62 2.03
describe(COL$edad)
##    vars   n mean sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 200 45.4 14     45    45.6 17.8  20  70    50 -0.09     -1.1 0.99
table(COL$sexo)
## 
##   F   M 
## 103  97

REGRESION LINEAL SIMPLE. Evaluar cómo se modifica el colesterol en función de la edad

modelo1 <- lm(colesterol ~ edad , data = COL)
summary(modelo1)
## 
## Call:
## lm(formula = colesterol ~ edad, data = COL)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -48.87 -13.00   0.02  14.20  41.81 
## 
## Coefficients:
##             Estimate Std. Error t value            Pr(>|t|)    
## (Intercept) 154.9054     4.3464    35.6 <0.0000000000000002 ***
## edad          1.6041     0.0915    17.5 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18 on 198 degrees of freedom
## Multiple R-squared:  0.608,  Adjusted R-squared:  0.606 
## F-statistic:  307 on 1 and 198 DF,  p-value: <0.0000000000000002
tab_model(modelo1)
  colesterol
Predictors Estimates CI p
(Intercept) 154.91 146.33 – 163.48 <0.001
edad 1.60 1.42 – 1.78 <0.001
Observations 200
R2 / R2 adjusted 0.608 / 0.606
confint(modelo1)
##              2.5 % 97.5 %
## (Intercept) 146.33 163.48
## edad          1.42   1.78

En este modelo B0 es el intercept. Es el valor de Y en donde la recta de regresión cruza dicho eje y coincide con que X vale 0. Por lo tanto, B0=154.9, es el valor promedio de colesterol para una persona de 0 años. Esto no tiene interpretación clínica ni tampoco se puede inferir el valor de colesterol que corresponda a valores de X por fuera del rango de valores que se utilizaron para realizar la recta de regresión. (en este ejemplo, 30 a 70 años). Es decir, no puedo utilizar el cálculo de este modelo para predecir el colesterol de una persona de 80 ni de 20 años. B1= 1.60. El coeficiente B1 corresponde a cuánto se modifica en promedio el valor de Y por cada aumento de una unidad de la variable X. En nuestro caso, por cada año que aumenta la edad de la persona, el colesterol aumentará en promedio 1.98 mgdL. Este valor puede variar entre 1.42 mgdL y 1.78 mgdL en el 95% de los casos si el experimento se repitiera. Esta relación es estadísticamente significativa (la p del coeficiente es menor a 0.05). El R2 ajustado indica que la variabilidad de la edad explica el 61% de la variabilidad del colesterol y que el otro 39% de la misma se explica por factores que no fueron incluidos en el modelo. Teniendo en cuenta la fórmula de la regresión lineal, el valor promedio de colesterol de una persona de 50 años sería Valor de colesterol= 138.72 + 1.98 * 50 Valor de colesterol= 237.7 mgdl

QUE SON LOS RESIDUOS?

modelo1 <- lm(colesterol ~ edad, data = COL)

plot(COL$edad, COL$colesterol,
     xlab = "Edad",
     ylab = "Colesterol")
abline(lm(colesterol ~ edad, data = COL), col = "red", lwd = 2)
# Valores

i1 <- 43
i2 <- 50
x1 <- COL$edad[i1]
x2 <- COL$edad[i2]
# Observados
y_obs1 <- COL$colesterol[i1]
y_obs2 <- COL$colesterol[i2]

# Predichos (en la recta)
y_pred1 <- predict(modelo1)[i1]
y_pred2 <- predict(modelo1)[i2]

# X
# Crear la tabla
tabla_residuos <- data.frame(
  paciente = c(i1, i2),
  edad = c(x1, x2),
  colesterol_observado = c(y_obs1, y_obs2),
  colesterol_predicho = c(y_pred1, y_pred2)
)

# Calcular residuo
tabla_residuos$residuo <- tabla_residuos$colesterol_observado - tabla_residuos$colesterol_predicho

tabla_residuos
##    paciente edad colesterol_observado colesterol_predicho residuo
## 43       43   28                  222                 200    21.9
## 50       50   62                  240                 254   -14.9
segments(x0 = x1, y0 = y_pred1,
         x1 = x1, y1 = y_obs1,
         col = "blue", lwd = 2)

segments(x0 = x2, y0 = y_pred2,
         x1 = x2, y1 = y_obs2,
         col = "blue", lwd = 2)

La recta de regresión es la línea que mejor representa la relación entre una variable independiente (por ejemplo, la edad) y una variable dependiente (por ejemplo, el colesterol). Su objetivo es resumir la tendencia promedio de los datos y permitir estimar el valor esperado de la variable de interés para cada valor de la variable explicativa. Esta recta se calcula mediante el método de los mínimos cuadrados, que consiste en elegir la línea que minimiza la suma de los cuadrados de las diferencias entre los valores observados y los valores predichos por el modelo. Es decir, busca que los errores sean lo más pequeños posibles en conjunto.

Los residuos son esas diferencias individuales: representan la distancia vertical entre el valor observado de cada paciente y el valor que predice la recta de regresión.

Evaluación de supuestos de la regresión lineal.

#Normalidad
#Linealidad
#Homocedasticidad
#Independencia

#Generacion de valores predichos
predichos <- fitted.values(modelo1)

#generación de residuos crudos y estandarizados
res <- residuals(modelo1)
#generación de residuos estandarizados:
standres <-rstandard(modelo1)

Los supuestos de la regresión lineal son normalidad, linealidad, homocedasticidad e independecia. Se miden sonbre los residuos

#Normalidad de los residuos
densityplot(modelo1$residuals)

hist(modelo1$residuals)

boxplot(modelo1$residuals)

qqnorm(standres)
qqline(standres, col = "red", lwd = 2)

shapiro.test(modelo1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 1, p-value = 0.06
describe(standres)
##    vars   n mean sd median trimmed  mad   min  max range skew kurtosis   se
## X1    1 200    0  1      0    0.02 1.17 -2.72 2.32  5.04 -0.1    -0.69 0.07

Histograma: se evalúa su forma en campana de Gauss. Si bien puede no ser perfecta, se evalúa también el n (mayor de 100) y los demás parámetros Descripcion: Verificar asimetría y kurtosis. Coeficientes entre -1 y +1 la distribución es normal. Cuando es mayor a 3 o menor a -3 es no normal. Para valores intermedios, evaluar las demás características. Comparar media con mediana, en distribuciones normales es similar. En distribucion normal, la media no es menor a 2 DS. Al aplicar la prueba Shapiro Wilks, un valor p>0.05 nos indica que la distribución es normal. Un valor menor p<0.05, nos indica que la distribución es no normal. Observacion del qqplot: La mayoría de los valores centrales deben apoyar en la línea del medio. Otra vez la coincidencia no es perfecta, pero se acercan. Los valores que se alejan son las colas del histograma.

#gráfico de linealidad y homocedasticidad

plot(y=COL$colesterol, x= COL$edad)
abline(modelo1)

plot(y=modelo1$residuals,x=modelo1$fitted.values)
abline(h=0)

bptest(modelo1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 0.02, df = 1, p-value = 0.9
#Independencia
dwtest(modelo1)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 2, p-value = 0.7
## alternative hypothesis: true autocorrelation is greater than 0

Linealidad: En el gráfico de residuos, se evalua la distribución de los residuos en forma similar arriba y abajo de la recta del valor 0 a lo largo de todas las variables x, es decir, que la nube de puntos sea similar a ambos lados del 0 a lo largo de todo el eje x. Homocedasticidad: Este supuesto implica que la varianza de los errores debe ser constante en todos los niveles de las variables predictoras. Cuando se viola este supuesto, se produce heterocedasticidad, lo que significa que la dispersión de los errores varía en diferentes rangos de las variables predictoras. El supuesto de homocedasticidad se cumple si los residuos tienen la misma dispersión a lo largo de los diferentes valores predichos. Test de heterocedasticidad de Breusch–Pagan debe ser mayor a 0.05 El test de Breusch-Pagan evalúa heterocedasticidad:

H0: varianza constante (bien ) H1: varianza no constante (problema️) p > 0.05 → no evidencia de heterocedasticidad p < 0.05 → hay heterocedasticidad Independencia se evalua por el modelo y por el test de Dubin Watson

#modelo multivariado
modelo <- lm(colesterol ~ edad + sexo, data = COL)
summary(modelo)
## 
## Call:
## lm(formula = colesterol ~ edad + sexo, data = COL)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -36.99  -9.06   0.79   9.25  33.59 
## 
## Coefficients:
##             Estimate Std. Error t value            Pr(>|t|)    
## (Intercept) 144.9302     3.0970    46.8 <0.0000000000000002 ***
## edad          1.5469     0.0637    24.3 <0.0000000000000002 ***
## sexoM        25.9249     1.7766    14.6 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 12.5 on 197 degrees of freedom
## Multiple R-squared:  0.812,  Adjusted R-squared:  0.81 
## F-statistic:  425 on 2 and 197 DF,  p-value: <0.0000000000000002
tab_model(modelo)
  colesterol
Predictors Estimates CI p
(Intercept) 144.93 138.82 – 151.04 <0.001
edad 1.55 1.42 – 1.67 <0.001
sexo [M] 25.92 22.42 – 29.43 <0.001
Observations 200
R2 / R2 adjusted 0.812 / 0.810
confint(modelo)
##              2.5 % 97.5 %
## (Intercept) 138.82 151.04
## edad          1.42   1.67
## sexoM        22.42  29.43

Interpretación: Intercept 144.9: es el valor del colesterol cuando la edad es 0 y el sexo es femenino edad: por cada año que aumenta la edad, el colesterol aumenta en promedio 1.54 puntos (1.42 a 1.67) independientemente del sexo El sexo masculino tiene en promedio 25.9 mgdl (22.4-29.4) de colesterol más que el femenino independientemente de la edad

Evaluación de supuestos

#Normalidad
#Linealidad
#Homocedasticidad
#independencia

#Generacion de valores predichos
predichos <- fitted.values(modelo)

#generación de residuos crudos y estandarizados
res <- residuals(modelo)
#generación de residuos estandarizados Se estandarizan para poder ser comparables
standres <-rstandard(modelo)

#gráfico de linealidad

plot(y=COL$colesterol, x= COL$edad)
abline(modelo)
## Warning in abline(modelo): only using the first two of 3 regression
## coefficients

plot(y=modelo$residuals,x=modelo$fitted.values)
abline(h=0)

#evaluacion de normalidad

densityplot(modelo$residuals)

hist(modelo$residuals)

boxplot(modelo$residuals)

qqnorm(standres)
qqline(standres, col = "red", lwd = 2)

library(car)
## Cargando paquete requerido: carData
## 
## Adjuntando el paquete: 'carData'
## The following object is masked from 'package:vcdExtra':
## 
##     Burt
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:psych':
## 
##     logit
## The following objects are masked from 'package:rms':
## 
##     Predict, vif
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
avPlots(modelo)

shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 1, p-value = 0.2
describe(standres)
##    vars   n mean sd median trimmed  mad   min  max range  skew kurtosis   se
## X1    1 200    0  1   0.06    0.02 1.06 -2.97 2.71  5.68 -0.22    -0.03 0.07

avPlots: Eje X: Residuo de la variable explicativa (ajustada por las otras). Eje Y Residuo del outcome (colesterol) (ajustado por las mismas variables). Relaccion entre x e y ajustando por la otra variable

#homocedasticidad

plot(y=modelo$residuals, x=modelo$fitted.values)
abline(h=0)

bptest(modelo$residuals ~ modelo$fitted.values, data=COL)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo$residuals ~ modelo$fitted.values
## BP = 2, df = 1, p-value = 0.1
#identificación de outliers

standres <-rstandard(modelo)
predichos <- modelo$fitted.values
plot(y=standres, x=predichos)
abline(h = c(-2, 2), col = "red", lwd = 2, lty = 2)
abline(h=0)

standres[standres > 2 | standres < -2]
##    14    23    82   134   144   145   169   187   199 
## -2.93  2.71  2.29 -2.63  2.38 -2.97 -2.14  2.20 -2.06

Outlier: es una observación cuyo valor real de la variable dependiente (Y) se desvía considerablemente del valor que predice el modelo. Un outlier en regresión lineal es una observación que presenta un residuo (error) grande, es decir, la diferencia entre el valor observado y el valor ajustado por el modelo es inusualmente alta, comparado con las demás observaciones. Son un problema menor. Son observaciones que se comportan distinto. Tienen un residuo grande. Cuán grande? mayor a 3SD En nuestro ejemplo vamos a usar 2 DS para ver en el gráfico. Se identifica la observación en la base de datos y se caracteriza el outlier según todas las características. Evaluar si es un error de carga por ejemplo o si no cumple los criterios de inclusión.

#identificacion de valores influyentes
leverage <- as.data.frame(hatvalues(modelo))
cooksd <- cooks.distance(modelo)
cooksd[cooksd>(4/150)]#n es el tamaño muestral
##     14     23    134    144    145 
## 0.0290 0.0605 0.0293 0.0437 0.0406
#dubin watson independeencia

dwtest(modelo)
## 
##  Durbin-Watson test
## 
## data:  modelo
## DW = 2, p-value = 0.9
## alternative hypothesis: true autocorrelation is greater than 0

Observaciones influyentes: son aquellas que dependiendo de que estén o no, modifican de manera importante el B1 correspondiente a la variable.(más del 10 o del 20%). Lo convierte en un modelo inestable. Es un problema grave. Las Observaciones influyentes modifican sustancialmente el ajuste del modelo (por ejemplo, si tienen alto leverage y alta distancia de Cook). Depende del residuo (outlier) pero principalmente del leverage. (la distancia a la cual se encuentra la observación de la media de la variable X). Distancia a la media del eje horizontal. Distancia de cook. considera residuo y leverage. A más distancia, más influencia. Punto de corte 4/n. Para N grande es muy sensible Si se modifica el B1 de la variable en más del 10 al 20%, es una observación influyente. Calculo distancia de cook para todas las observaciones y luego tomo las potencialmente influyentes y las pruebo con el modelo. Distancia de cook: punto de corte es mayor a 4/n siendo n el número de observaciones. Pero si son muchas (n grande) , se utiliza como punto de corte mayor a 0.5 o mayor a 1.