library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
frecuencia <- data.frame( read_excel("frecuencia.xlsx"))
head(frecuencia)
##   Peso Frecuencia
## 1   75        127
## 2   46        101
## 3   79        127
## 4   97        143
## 5   48        104
## 6   46        107
str(frecuencia)
## 'data.frame':    99 obs. of  2 variables:
##  $ Peso      : num  75 46 79 97 48 46 46 57 82 55 ...
##  $ Frecuencia: num  127 101 127 143 104 107 102 113 132 112 ...

Gráfica de dispersión

library(ggplot2)
ggplot(frecuencia, aes(x = Peso, y = Frecuencia)) +
  geom_point(color = "skyblue") +
  ggtitle("Frecuencia Cardiaca vs Peso")

Se evidencia en el gráfico de dispersión, que ha medida que aumenta el peso corporal de las personas aumenta la frecuencia cardiaca, podemos inicialmente detallar una relación positiva.

  1. Proponga un modelo estadístico para explicar el valor de la frecuencia cardiaca en función del peso corporal. Describa las componentes aleatoria y sistemática del modelo propuesto.

Solución.

El modelo que se propone es:

\[y{i}-\beta_{0}+\beta_{1}*x_{i}\] \[\epsilon~N(0,\sigma^{2})\]

Donde\(y_{i}\)= Frecuencia cardiaca en reposo de i-esimo de la muestra. Mientras, que \(x_{i}\)= Peso corporal de i-ésimo individuo de la muestra.

Creacion del modelo

Los modelos lineales se ejecutan a traves de la función lm, que esta de base en R.

Mode_rs<-lm(Frecuencia~Peso, data=frecuencia)

Mode_rs
## 
## Call:
## lm(formula = Frecuencia ~ Peso, data = frecuencia)
## 
## Coefficients:
## (Intercept)         Peso  
##     68.2482       0.7629
summary(Mode_rs)
## 
## Call:
## lm(formula = Frecuencia ~ Peso, data = frecuencia)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -13.9734  -2.5950   0.8194   3.0306  13.3532 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 68.24820    1.98810   34.33   <2e-16 ***
## Peso         0.76295    0.02616   29.16   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.86 on 97 degrees of freedom
## Multiple R-squared:  0.8976, Adjusted R-squared:  0.8966 
## F-statistic: 850.3 on 1 and 97 DF,  p-value: < 2.2e-16

Interpretación

El modelo de regresión lineal muestra que hay una relación significativa y positiva entre el peso y la frecuencia cardíaca, lo que significa que a medida que el peso aumenta, la frecuencia cardíaca tiende a aumentar también. El coeficiente de determinación es de 0.8976, lo que indica que aproximadamente el 89.76% de la variabilidad en la variable de respuesta puede ser explicada por la variable de Peso.

B_0=coef(Mode_rs)[1]
B_0
## (Intercept) 
##     68.2482
B_1=coef(Mode_rs)[2]
B_1
##      Peso 
## 0.7629496
coef(Mode_rs)
## (Intercept)        Peso 
##  68.2481978   0.7629496

La pendiente es aproximadamente 0.76295.indicaria que por cada kg de aumento en el peso corporal de las personas, la frecuencia cardíaca aumenta en promedio aproximadamente 0.76295 unidades.

Grafica con el modelo

library(ggplot2)
graf1 <- ggplot(frecuencia, aes(x = Peso, y = Frecuencia)) +
         geom_point(color = "green") +
         labs(x = "Peso corporal en Kg", y = "Frecuencia cardiaca en Reposo (Latidos)")

# Agregar una línea de tendencia
graf1 + geom_smooth(method = 'lm', se = FALSE, color = "blue")
## `geom_smooth()` using formula = 'y ~ x'

#  graf1<-qplot(Peso, Frecuencia, xlab="Peso corporal en Kg", ylab="Frecuencia cardiaca en Resposo (Latidos)", data=frecuencia, color="green")
#  graf1
# graf1+geom_smooth(method ='lm', se=F, color="blue")

Distancia promedio entre la frecuencia cardiaca observada de un individuo en reposo y el valor promdeio para todas las personas que tiene su mismo peso corporal, y distancia promedio de 4.86 (sigma)

  1. Es sensato pensar que el modelo cumple los supuestos? Verifique esto a un nivel de significancia del 5%

###Solucion

library(MASS)
library(car)
## Loading required package: carData
# Obtener los residuales del modelo

res=studres(Mode_rs)
#Creacion de la distribucion normal
x<-seq(-3,3, length=100)
y<-dnorm(x)

#Grafica de los residuales

plot(density(res), main="Densidad de los residuales", lwd=2)
lines(x,y, lty=2, col="brown")
leyenda<-c("Densidad de residuales", "Densidad normal estandar")
legend(-4,0.3,leyenda, col=c("grey","purple"), lty=c(1,2),lwd=2, bty="n")

## Gráfoca

Inicialmente vemos que los residuales tendrian una distribución normal.

qqPlot(res)

## [1] 41 26

Prueba de normalidad

#Shapiro- Wil test de normalidad sobre los residuales

La funcion es shapiro.test

Ho: Los valores siguen una distribucion normal (>0.05) H1: Los valores no se distribuyen foma normal (0<0.05)

shapiro.test(res)
## 
##  Shapiro-Wilk normality test
## 
## data:  res
## W = 0.97816, p-value = 0.09876

Con un nivel de confianza del, 95 % se puede inferir que los residuales siguen una distribucion normal.El valor p obtenido es 0.09876, que es mayor que el nivel de significancia, no hay suficiente evidencia para rechazar la hipótesis nula de normalidad

Supuesto de Homocedasticidad

Establecer la condicion de que la varianza de los errores de modelo(residuos), sean constante en todas las observaciones.Esto implica que la dispersion de los errores prefereiblemente debe ser la misma para todos los resultados de la variable dependientes(x).

Este supuesto resulte fundamental para la confiabilidad de los resultados del modelo.

Cuando no se cumple el supuesto de homoceradistidad (heterocedastico), esto imlica que los resultadosdel intertvalo de confianza para los parametros del modelo son insesgado(Pocos confiables).

Como arreglo de la no gomocedasticidad, se sugiere una transformacion de los datos (Estandarización, logaritmo, entre otras).

Para la pruebla de homoceradistidad se utilizo la funcion bptest.

H_(0): No hay heterocedasticidad, es decir, la varianza de los errores es constante a lo largo de todas las observaciones.

H_(1): Hay heterocedasticidad, es decir, la varianza de los errores no es constante y depende de una o mas variables independientes.

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
bptest(Mode_rs)
## 
##  studentized Breusch-Pagan test
## 
## data:  Mode_rs
## BP = 0.29529, df = 1, p-value = 0.5868

El valor p obtenido es 0.5868, que es mayor que un nivel de significancia 0.05. Por lo tanto, no hay suficiente evidencia para rechazar la hipótesis nula de homocedasticidad. Esto sugiere que la varianza de los errores en el modelo de regresión puede considerarse constante.

Para comprobar que la varianza es constante utiloizamos la funcion ncvTest, donde:

H0: Varianza constante H1: Varianza no es constante

ncvTest(Mode_rs)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 0.3202906, Df = 1, p = 0.57143

El valor p obtenido es 0.57143, que es mayor que un nivel de significancia de 0.05. Es decir, no hay suficiente evidencia para rechazar la hipótesis nula de homocedasticidad. Esto sugiere que la varianza de los errores en el modelo de regresión puede considerarse constante.

Supuesto de Independencia

Se quiere probar que las observaciones \(y\) son indepedientes esto ocurre cuando no eciste una correlacion entre ellas. Es decir, que no hay correlación entre la observacion actual y la inmediatamente anterior, a esto se le conoce como autocorrelacion de primer grado. Las autocorrelaciones puedes ser positivas o negativas.

La prueba de independencia se hace a traves del test de Durbin-Watson con la función dwtest.

H0: No hay autocorrelacion de primer grado entre los residuos del modelo. Es decir, la autocorrelación es cero.

H1:Hay autocorrelacion de primer grado entre los residuos del modelo. Es decir, la autocorrelación es distinta de cero.

dwtest(Mode_rs)
## 
##  Durbin-Watson test
## 
## data:  Mode_rs
## DW = 1.6894, p-value = 0.1548
## alternative hypothesis: true autocorrelation is greater than 0

El valor p obtenido es 0.1548, que es mayor que el nivel de significancia de 0.05.No se encontró evidencia suficiente para afirmar que hay autocorrelación positiva en los residuos del modelo de regresión.

A partir del cumplimiento de los supestos procedemos hacer inferencia sobre el modelo. ()Estimar intervalos para los paramteros)

#Calcular un intervalo de confianza del 95% para los parametros del modelo.

Calcule e INTERPRETE intervalos de 95% de confianza para los parámetros de localización. Se utiliza la función confint(nombre del modelo,level= nivel de confianza)

int_95<-confint(Mode_rs, level=0.95)
int_95
##                  2.5 %    97.5 %
## (Intercept) 64.3023726 72.194023
## Peso         0.7110212  0.814878

Con un nivel de confianza del 95%, esperaríamos que el valor real del coeficiente Bo del modelo este entre 64.3 y 72.1. De igual forma, con un nivel de confianza del 95%, esperaríamos que el valor real del coeficiente B1 del modelo este entre 0.71 y 0.81.

Cree usted que la muestra de 99 personas proporciona evidencia estadísticamente significativa de que la frecuencia cardiaca en reposo depende del peso corporal? Justifique su respuesta.

Para contestar la pregunta se debe plantear las siguientes hipotesis.

\(H0:\beta_1=0\) \(H1:\beta_1 \neq 0\)

summary(Mode_rs)
## 
## Call:
## lm(formula = Frecuencia ~ Peso, data = frecuencia)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -13.9734  -2.5950   0.8194   3.0306  13.3532 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 68.24820    1.98810   34.33   <2e-16 ***
## Peso         0.76295    0.02616   29.16   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.86 on 97 degrees of freedom
## Multiple R-squared:  0.8976, Adjusted R-squared:  0.8966 
## F-statistic: 850.3 on 1 and 97 DF,  p-value: < 2.2e-16

El valor del estadístico F es 850.3, con un valor de p-valor extremadamente bajo (< 2.2e-16). Esto indica que el modelo en su conjunto es altamente significativo y que la variables predictora “Peso” está relacionada con la frecuencia en reposo. Adicional, a la significancia del B1.

Antes de realizarse el estudio se creía que, por cada kilogramo adicional en el peso corporal la frecuencia cardiaca en reposo promedio aumenta más de 0.3 latidos. La evidencia en la muestra de 99 pacientes reafirma o contradice lo que se creía? Justifique su respuesta.

Planteamos una hipotesis

\(H0:\beta_1=0.3\) \(H1: \beta_1>neq0.3\)

beta1_estimado <- 0.76295
beta1_hipotesis <- 0.3
error_estandar <- 0.02616


n <- 99
p <- 1  

grados_libertad <- n - p - 1

t_valor <- (beta1_estimado - beta1_hipotesis) / error_estandar

t_critico <- qt(0.95, df = grados_libertad, lower.tail = FALSE)

if (t_valor > t_critico) {
  print("Rechazamos la hipótesis nula. Hay evidencia suficiente para afirmar que la frecuencia cardíaca en reposo aumenta más de 0.3 latidos por cada kilogramo adicional en el peso corporal.")
} else {
  print("No tenemos suficiente evidencia para afirmar que la frecuencia cardíaca en reposo aumenta más de 0.3 latidos por cada kilogramo adicional en el peso corporal.")
}
## [1] "Rechazamos la hipótesis nula. Hay evidencia suficiente para afirmar que la frecuencia cardíaca en reposo aumenta más de 0.3 latidos por cada kilogramo adicional en el peso corporal."

Calcule e INTERPRETE un intervalo de 90% de confianza para frecuencia cardiaca en reposo promedio de las personas con 70 kilogramos de peso.

Prediciones del modelo com la funcion predict(modelo, el valor que se predecir, nivel de confianza)

Persona que tiene 70 kilos

predict(Mode_rs,list(Peso=c(55,60,65,70)),level=0.90, interval="confidence")
##        fit      lwr      upr
## 1 110.2104 109.0636 111.3573
## 2 114.0252 113.0201 115.0303
## 3 117.8399 116.9457 118.7341
## 4 121.6547 120.8280 122.4813

Para un peso de 55 kg, se estima que la frecuencia cardíaca en reposo es de aproximadamente 110.21 latidos por minuto.

Para un peso de 70 kg, se estima que la frecuencia cardíaca en reposo es de aproximadamente 121.65 latidos por minuto.

Calcule e INTERPRETE un intervalo de 99% de confianza para frecuencia cardiaca en reposo de una persona que pesa 85 kilogramos y que NO pertenece a la muestra de 99 pacientes.

predict(Mode_rs, newdata = data.frame(Peso = 85), level = 0.99, interval = "confidence")
##        fit      lwr      upr
## 1 133.0989 131.5971 134.6007

Con un nivel de confianza del 99%, de que la frecuencia cardíaca en reposo para una persona que pesa 85 kilogramos se encuentra en el rango de aproximadamente 131.60 a 134.60 latidos por minuto

Realice un análisis de diagnóstico e identifique (si es que existen) observaciones con alto leverage, influyentes y extremas en la respuesta.

Diagnostico de los residuales Para ello se construye una función que permita verificar la existencia de valres de alto leverage, se entiende como observaciones que tienen valres extremos y generar influencia desproporcionada en las estimaciones afeando la precision.

Leverage.normal <- function(objeto){
y <- objeto$residuals + fitted(objeto)
H <- lm.influence(objeto)$hat
X <- model.matrix(objeto)
maxy <- max(max(H),2*mean(H))
plot(H, main="Puntos de alto Leverage", xlab="Índice", ylim=c(0,maxy), ylab="h", cex=0.3, lwd=3)
abline(2*mean(H),0,lty=3)
alto.leverage=ifelse(H>2*mean(H),TRUE,FALSE)
identificador=1:length(y)
identificador[alto.leverage]
}

Aplicar la función

Laverange<-Leverage.normal(Mode_rs)

Identificar los puntos

frecuencia[Laverange,]
##    Peso Frecuencia
## 25   41         99
## 26  108        164
## 31  109        153
## 45  109        153
## 56  108        148
## 71   41         99

Para un peso de 41 kg, la frecuencia cardíaca más alta registrada es de 99 latidos por minuto. Para un peso de 108 kg, se han registrado varias frecuencias cardíacas altas: 164, 153, 153 y 148 latidos por minuto.

Puntos.Ap=rep("NO",nrow(frecuencia))
Puntos.Ap[Laverange]="SI"
p <- qplot(Peso,Frecuencia,xlab="Peso corporal (en kg)",
      ylab="Frecuencia cardiaca en reposo (en latidos)",
      data=frecuencia,colour=Puntos.Ap)
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
p + geom_smooth(method="lm",se=FALSE,color="black")
## `geom_smooth()` using formula = 'y ~ x'

Falta observaciones extremas e influentes.