Last updated: 2021-07-24
Checks: 7 0
Knit directory: 2021/
This reproducible R Markdown analysis was created with workflowr (version 1.6.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.
Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.
Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.
The command set.seed(20210412)
was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.
Great job! Recording the operating system, R version, and package versions is critical for reproducibility.
Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.
Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.
Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.
The results in this page were generated with repository version 4f1cff5. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.
Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish
or wflow_git_commit
). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:
Ignored files:
Ignored: .Rhistory
Ignored: .Rproj.user/
Untracked files:
Untracked: Curso_Bioestadistica_MTripp_cuatriII.docx
Untracked: Curso_Bioestadistica_MTripp_cuatriII.pdf
Untracked: Diapositivas/
Untracked: Prueba_markdown.Rmd
Untracked: Prueba_markdown.pdf
Untracked: README.html
Untracked: Resources/
Untracked: Tarea_Tstudent.Rmd
Untracked: Tarea_Tstudent.docx
Untracked: Tarea_Tstudent.html
Untracked: Tarea_Tstudent.pdf
Untracked: analysis/Clase13_noParam.Rmd
Untracked: analysis/images/
Untracked: code/tarea_macrograd.R
Untracked: data/CS_subset.csv
Untracked: data/Consumo_oxigeno_wide.csv
Untracked: data/Darwin_esp.csv
Untracked: data/Data_enzimas_Experimento1.txt
Untracked: data/Data_enzimas_Experimento2.txt
Untracked: data/Data_enzimas_Experimento3.txt
Untracked: data/Data_enzimas_Experimento4.txt
Untracked: data/DownloadFestival(No Outlier).dat
Untracked: data/Festival.csv
Untracked: data/Hful_metabolitos_ver2.csv
Untracked: data/Longitud_noParam.csv
Untracked: data/LungCapData.txt
Untracked: data/LungCapDataEsp.csv
Untracked: data/RExam.dat
Untracked: data/Rexamendat.csv
Untracked: data/Tabla1_Muestreo.txt
Untracked: data/Transcriptome_Anotacion.csv
Untracked: data/Transcriptome_DGE.csv
Untracked: data/Vinogradov_2004_Titanic.tab
Untracked: data/Vinogradov_2004_Titanic.tab.csv
Untracked: data/data_tukey.txt
Untracked: data/datasets_Pokemon.csv
Untracked: data/datasets_Pokemon.xls
Untracked: data/exp_macrogard_growth.tab
Untracked: data/exp_macrogard_rna-dna.tab
Untracked: data/fertilizantes_luz.csv
Untracked: data/gatos_sueno.csv
Untracked: data/macrogard_crecimiento.csv
Untracked: data/penguins_size.csv
Untracked: data/pokemon_extended.csv
Untracked: output/Plot_all_penguins.pdf
Untracked: output/Plot_all_penguins.tiff
Untracked: output/graficos/
Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.
These are the previous versions of the repository in which changes were made to the R Markdown (analysis/Clase11_regresion.Rmd
) and HTML (docs/Clase11_regresion.html
) files. If you’ve configured a remote Git repository (see ?wflow_git_remote
), click on the hyperlinks in the table below to view the files as they were in that past version.
File | Version | Author | Date | Message |
---|---|---|---|---|
html | 9d09420 | Miguel Tripp | 2021-07-22 | Build site. |
html | 0f7eb2d | Miguel Tripp | 2021-07-12 | Build site. |
html | 82e4deb | Miguel Tripp | 2021-07-08 | Build site. |
html | bc7c1d7 | Miguel Tripp | 2021-07-07 | Build site. |
Rmd | 66fe2bf | Miguel Tripp | 2021-07-07 | Publish the initial files for myproject |
La correlación lineal y la regresión lineal simple son métodos estadísticos que estudian la relación lineal existente entre dos variables.Sin embargo, es importante recalcar las diferencias entre ambos métodos:
En la correlación no es necesario pensar en la relación causa y efecto, solamente nos interesa saber como dos variables están relacionadas entre ellas. Por otro lado, en la regresión si debemos pensar en causa y efecto. La regresión encuentra la línea que mejor prediga Y a partir de X, y que esa linea no es la misma que la predicción de X a partir de Y.
A nivel experimental, la correlación se suele emplear cuando ninguna de las variables se ha controlado, simplemente se han medido ambas y se desea saber si están relacionadas. En el caso de estudios de regresión lineal, es más común que una de las variables se controle (tiempo, concentración de reactivo, temperatura…) y se mida la otra.
Normalmente los estudios de correlación lineal preceden a la generación de modelos de regresión lineal. Primero se analiza si ambas variables están correlacionadas y, en caso de estarlo, se procede a generar el modelo de regresión.
En la descripción de la ANOVA, vimos como los minimos cuadrados son implementaods dentro la función lm() para ajustar un modelo con variables categoricas (factores). A diferencia de la ANOVA y la T de Student, el objetivo de la regresión no es probar una hipótesis sino estimar una relación que pueda ser usado para predicción.
La construcción de un modelo nos permite entender las relaciones entre las variables y hacer predicciones usando futuras observaciones.
La regresión lineal simple consiste en generar un modelo de regresión (ecuación de una recta) que permita explicar la relación lineal que existe entre dos variables. A la variable dependiente o respuesta se le identifica como \(Y\) y a la variable predictora o independiente como \(X\).
El modelo de regresión lineal simple se describe de acuerdo a la ecuación:
\(Y=\beta_0 + \beta_1 X_i + \epsilon\)
Siendo \(\beta_0\) la ordenada en el origen, \(\beta_1\) la pendiente y \(\epsilon\) el error aleatorio. Este último representa la diferencia entre el valor ajustado por la recta y el valor real. Recoge el efecto de todas aquellas variables que influyen en Y pero que no se incluyen en el modelo como predictores. Al error aleatorio también se le conoce como residuo.
Usualmente los estudios de regresión tienen el objetivo de estimar un modelo que explique la relación entre dos variables de una población, lo cual se realiza a partir de la relación que se observa en la muestra y que, por lo tanto, esta sujeta a variaciones. Por lo tanto, para cada uno de los parámetros de la ecuación de regresión lineal simple (\(\beta_0\) y \(\beta_1\)) se alcula su significancia (valor p) y su intervalo de confianza. El test estadístico más empleado es el t-test (existen alternativas no paramétricas).
De esta manera, el test de significancia para la pendiente (\(\beta_1\)) del modelo lineal considera como hipótesis:
\(H_0\): No hay relación lineal entre ambas variables por lo que la pendiente del modelo lineal es cero. \(\beta_1 = 0\)
\(H_A\): Sí hay relación lineal entre ambas variables por lo que la pendiente del modelo lineal es distinta de cero. \(\beta_1 \neq 0\)
De esta misma forma también se aplica a (\(\beta_0\))
Estos datos son una adaptación del ejemplo descrito en Navarro, Learning statistics with R: A tutorial for psychology students and other beginners.. Supongan que queremos saber que tanto afecta los hábitos de sueño de mi gato en mi estado de animo. Para esto, se califica mi nivel de irritabilidad en una escala de 0 (nada irritado) al 100 (muy irritado). Supongan también que se ha medido mi estado de animo, las horas de sueño del gato y mis horas de sueños por 100 días.
library(tidyverse)
gatos_url <- "https://raw.githubusercontent.com/trippv/Miguel_Tripp/master/gatos_sueno.csv"
gatos <- read_csv(gatos_url)
El primer paso antes de generar un modelo de regresión es representar los datos para poder intuir si existe una relación y cuantificar dicha relación mediante un coeficiente de correlación. Si en este paso no se detecta la posible relación lineal, no tiene sentido seguir adelante generando un modelo lineal (se tendrían que probar otros modelos).
ggplot(gatos, aes(x = horas_sueno, y = irritabilidad))+
geom_point()+
labs(x = "Horas de sueño", y = "Irritabilidad",
title = "Relación entre mis horas de sueño y mi irritabildiad")
cor.test(gatos$horas_sueno, gatos$irritabilidad, method = "pearson")
Pearson's product-moment correlation
data: gatos$horas_sueno and gatos$irritabilidad
t = -20.854, df = 98, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.9340614 -0.8594714
sample estimates:
cor
-0.903384
El gráfico y la prueba de correlación muestran una relación lineal negativa (r = -0.90) y significativa (p < 0.0001). Tiene sentido generar un modelo de regresión lineal que permita predecir mi irritabildiad en función de mis horas de sueño.
regresion.1 <- lm(irritabilidad ~ horas_sueno, data = gatos)
Como vimos en el capitulo de ANOVA, el objeto lm()
contiene una gran cantidad de información con respecto a los coeficientes. Pero podemos obtener la información básica si simplemente ejemcutamos
print(regresion.1)
Call:
lm(formula = irritabilidad ~ horas_sueno, data = gatos)
Coefficients:
(Intercept) horas_sueno
125.956 -8.937
Esto nos proporciona información de (1) el modelo que le especificamos a R y (2) los valores de intercepto (\(\beta_0 = 125.956\)) y la pendiente (\(\beta_1 = -8.93\)). Esto significa que el modelo lineal que mejor se ajusta a nuestro datos tiene la forma:
\(Y = -8.94 X_i + 125.96\)
es decir:
\(Irritabilidad = -8.94(horas sueño) + 125.96\)
En este modelo, \(\beta_1\) (la pendiente) implica que por cada unidad de sueño que se incremente, mi irritabilidad se disminuira por 8.94 puntos. Por otro lado \(\beta_0\) (el intercepto) corresponde al valor espeerado de \(Y_i\) cuando \(X_i = 0\), es decir, si tengo 0 horas de sueño, mi nivel de irritabilidad estará en niveles exorbitantes ($Y_i = 125.9)
Para ver la validez del modelo podemos usar la función summary()
summary(regresion.1)
Call:
lm(formula = irritabilidad ~ horas_sueno, data = gatos)
Residuals:
Min 1Q Median 3Q Max
-11.025 -2.213 -0.399 2.681 11.750
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 125.9563 3.0161 41.76 <2e-16 ***
horas_sueno -8.9368 0.4285 -20.85 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 4.332 on 98 degrees of freedom
Multiple R-squared: 0.8161, Adjusted R-squared: 0.8142
F-statistic: 434.9 on 1 and 98 DF, p-value: < 2.2e-16
La primera columna (Estimate) devuelve el valor estimado para los dos parámetros de la ecuación del modelo lineal (a y b) que equivalen a la ordenada en el origen y la pendiente.
Se muestran los errores estándar, el valor del estadístico t y el p-value (dos colas) de cada uno de los dos parámetros. Esto permite determinar si los parámetros son significativamente distintos de 0.
Para el modelo generado, tanto la ordenada en el origen (intercepto) como la pendiente son significativas (p-values < 0.001).
Es posibl eobtener los intervalos de confianza para los parámetros del modelo
confint(regresion.1)
2.5 % 97.5 %
(Intercept) 119.971000 131.94158
horas_sueno -9.787161 -8.08635
El valor de R2 indica que el modelo calculado explica el 81% de la variabilidad presente en la variable respuesta mediante la variable independiente.
El p-value obtenido en el test F determina que sí es significativamente superior la varianza explicada por el modelo en comparación a la varianza total. Es el parámetro que determina si el modelo es significativo y por lo tanto se puede aceptar.
Una vez generado un modelo es posible predecir el valor de la variable dependiente \(Y\) para un set nuevo de valores de nuestra variable predictroa \(X\). Sin embargo es importante considerar que las predicciones deben limitarse al intervalo de valores con los que se ha generado el modelo. Esto es importante puesto que solo en esta región se tiene certeza de que se cumplen las condiciones para que el modelo sea válido. Para calcular las predicciones se emplea la ecuación generada por regresión.
Para extraer los valores ajustados del modelo para cada valor observado podemos utilizar la función fitted()
fit <- fitted(regresion.1)
head(fit)
1 2 3 4 5 6
58.12631 55.26655 80.02137 57.05390 66.25876 72.42512
# Graficar los valores ajsutados. Recordar que nuestro modelo lo definimos como irritabilidad ~ horas de sueño
plot(gatos$horas_sueno, fit)
y de igual manera podemos extraer los residuales (diferencia entre el valor observado - el valor esperado) con la función residuals()
residuales <- residuals(regresion.1)
head(residuales)
1 2 3 4 5 6
-2.1263150 4.7334469 1.9786333 -2.0539043 0.7412372 -0.4251243
Para realizar la representación gráfica de nuestro modelo, podemos utilizar diferentes alternativas
plot(gatos$horas_sueno, gatos$irritabilidad, col = "firebrick", pch = 19, ylab = "Irritabilidad", xlab = "Horas sueño")
abline(regresion.1)
Alternativamente, Para poder representar el intervalo de confianza a lo largo de todo el modelo se recurre a la función predict()
. Con esto es posible generar una gráfica de regresión con los intervalos de confianza superiores e inferiores del 95%. Esto permite identificar la región en la que, según el modelo generado y para un determinado nivel de confianza, se encuentra el valor promedio de la variable dependiente.
Para poder representar el intervalo de confianza a lo largo de todo el modelo se recurre a la función predict()
para predecir valores que abarquen todo el eje \(X\).
xseq <- seq(from = min(gatos$horas_sueno),
to = max(gatos$horas_sueno),
length.out = 100)
# se genera la predicción de los valores de irritabilidad utilizando el modelo generado
irritabilidad_pred <- predict(object = regresion.1,
newdata = data.frame(horas_sueno = xseq),
interval = "confidence", level = 0.95)
head(irritabilidad_pred)
fit lwr upr
1 82.70239 80.70111 84.70368
2 82.32687 80.35779 84.29595
3 81.95134 80.01435 83.88834
4 81.57582 79.67079 83.48085
5 81.20030 79.32708 83.07351
6 80.82477 78.98324 82.66631
y añadimos al gráfico las lineas formadas por los limites inferior y superior
plot(gatos$horas_sueno, gatos$irritabilidad, col = "firebrick", pch = 19, ylab = "Irritabilidad", xlab = "Horas sueño")
abline(regresion.1)
lines(x = xseq, y = irritabilidad_pred[,2],type = "l", col = 2, lty = 3)
lines(x = xseq, y = irritabilidad_pred[,3],type = "l", col = 3, lty = 3)
ggplot(gatos, aes(x = horas_sueno, y = irritabilidad))+
geom_point(color = "firebrick")+
geom_smooth(method = "lm", se = TRUE, color = "black")+
labs(x = "Horas de sueño", y = "Irritabildiad")+
theme_classic()
`geom_smooth()` using formula 'y ~ x'
Tal como hemos visto hasta ahora, la función lm()
realiza un análisis de minimos cuadrados el cual asume que los residuales tienen una distribución cercana a la normal. La varianza (o desviación estandar) debe ser aproximadamente constante a lo largo de la variable de respuesta.
Podemos usar la función plot()
en nuestro modelo para evaluar visualmente si los residuales del modelo cumplen con estas condiciones.
par(mfrow = c(2,2))
plot(regresion.1)
dev.off()
null device
1
Ejercicio: Calcula de forma manual asi como con la función predict (incluye los intervalos de confianza) cual sería mi valor de irritabilidad cuando duermo 3 y 12 horas
#función predict
E1 <- data.frame(horas_sueno = c(3, 12))
predict(object = regresion.1,
newdata = E1,
interval = "confidence", level = 0.95)
# Manualmente
E1_3h <- coef(regresion.1)[2] * E1[1,1] + coef(regresion.1)[1]
E1_12h <- coef(regresion.1)[2] * E1[2,1] + coef(regresion.1)[1]
Para realizar esto, ggpubr tiene una función que nos va a facilitar mucho la vida la cual es stat_regline_equatio
y que se incluye como un nuevo layer dentro de ggplot. Puedes econtrar mas información de esta función aqui
library(ggpubr)
ggplot(gatos, aes(x = horas_sueno, y = irritabilidad))+
geom_point(color = "firebrick")+
geom_smooth(method = "lm", se = TRUE, color = "black")+
stat_cor(label.y = 105, geom = "label") +
stat_regline_equation(label.y = 98,
aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
geom = "label")+
labs(x = "Horas de sueño", y = "Irritabildiad")+
theme_classic()
`geom_smooth()` using formula 'y ~ x'
ggscatter(gatos, x = "horas_sueno", y = "irritabilidad", add = "reg.line", conf.int = TRUE)+
stat_regline_equation(label.y = 100)
`geom_smooth()` using formula 'y ~ x'
Ahora vamos ajustar un modelo lineal para predecir mi nivel de irritabilidad en función que de que tanto duerman los gatos en la noche
regresion.2 <- lm(irritabilidad ~ sueno_gatos, data = gatos)
summary(regresion.2)
Call:
lm(formula = irritabilidad ~ sueno_gatos, data = gatos)
Residuals:
Min 1Q Median 3Q Max
-21.4190 -5.0049 -0.0587 4.9567 23.7275
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 85.7817 3.3528 25.585 < 2e-16 ***
sueno_gatos -2.7421 0.4035 -6.796 8.45e-10 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 8.327 on 98 degrees of freedom
Multiple R-squared: 0.3203, Adjusted R-squared: 0.3134
F-statistic: 46.18 on 1 and 98 DF, p-value: 8.448e-10
Evaluación del modelo
par(mfrow = c(2,2))
plot(regresion.2)
y gráficamos la disperción de los datos con el modelo de regresión
ggplot(gatos, aes(x = sueno_gatos, y = irritabilidad))+
geom_point(color = "firebrick")+
geom_smooth(method = "lm", se = TRUE, color = "black")+
stat_cor(label.y = 105, geom = "label") +
stat_regline_equation(label.y = 98,
aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
geom = "label")+
labs(x = "Horas de sueño del gato", y = "Irritabildiad")+
theme_classic()
`geom_smooth()` using formula 'y ~ x'
Esta sección esta tomada del libro de Motuslky. Intuitive Biostatistics
La regresión lineal ajusta un modelo que predice \(Y\) a partir de \(X\). Si intercambiamos las definiciones de \(X\) y \(Y\) la línea de regresión será diferente a menos que los puntos esten alineados perfectamente. Sin embargo, intercambiar \(X\) y \(Y\) no cambiará el valor de \(R^2\)
\(R^2\) tendrá un valor de 0 si no hay ninguna tendencia en lo absoluto entre \(X\) y \(Y\) por lo que la línea de mejor ajuste será una línea horizontal. \(R^2\) no puede tener valores negativos en una regresión lineal pero es posible observarlos en regresiones no lineales.
Si elevas al cuadrado el coeficiente de correlacion (\(r\)), el valor será igual a \(R^2\) de una regresión lineal. El valor \(P\) de la hipótesis nula de que el coeficiente de correlación de la población es 0 será equivalente a el valor \(P\) de la hipótesis nula de que la pendiente de la poblacion es 0.
sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggpubr_0.4.0 forcats_0.5.1 stringr_1.4.0 dplyr_1.0.5
[5] purrr_0.3.4 readr_1.4.0 tidyr_1.1.3 tibble_3.0.4
[9] ggplot2_3.3.5 tidyverse_1.3.1 workflowr_1.6.2
loaded via a namespace (and not attached):
[1] httr_1.4.2 jsonlite_1.7.2 splines_4.0.5 carData_3.0-4
[5] modelr_0.1.8 assertthat_0.2.1 cellranger_1.1.0 yaml_2.2.1
[9] pillar_1.6.0 backports_1.2.1 lattice_0.20-41 glue_1.4.2
[13] digest_0.6.27 promises_1.1.1 ggsignif_0.6.0 rvest_1.0.0
[17] colorspace_2.0-0 htmltools_0.5.1.1 httpuv_1.5.4 Matrix_1.3-2
[21] pkgconfig_2.0.3 broom_0.7.6 haven_2.3.1 scales_1.1.1
[25] whisker_0.4 openxlsx_4.2.3 later_1.1.0.1 rio_0.5.16
[29] git2r_0.27.1 mgcv_1.8-33 generics_0.1.0 farver_2.0.3
[33] car_3.0-10 ellipsis_0.3.1 withr_2.4.2 cli_2.5.0
[37] magrittr_2.0.1 crayon_1.4.1 readxl_1.3.1 evaluate_0.14
[41] ps_1.5.0 fs_1.5.0 fansi_0.4.2 nlme_3.1-152
[45] foreign_0.8-81 rstatix_0.7.0 xml2_1.3.2 data.table_1.13.6
[49] tools_4.0.5 hms_1.0.0 lifecycle_1.0.0 munsell_0.5.0
[53] reprex_2.0.0 zip_2.1.1 compiler_4.0.5 rlang_0.4.11
[57] grid_4.0.5 rstudioapi_0.13 labeling_0.4.2 rmarkdown_2.6
[61] gtable_0.3.0 abind_1.4-5 DBI_1.1.0 curl_4.3
[65] polynom_1.4-0 R6_2.5.0 lubridate_1.7.10 knitr_1.30
[69] utf8_1.2.1 rprojroot_2.0.2 stringi_1.5.3 Rcpp_1.0.5
[73] vctrs_0.3.8 dbplyr_2.1.1 tidyselect_1.1.1 xfun_0.23