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 ...
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.
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.
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.
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)
###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
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.
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.