Sección 1. R Markdown (1, 5 puntos)

Ejercicio 1

En el LAB1 se explica cómo incorporar títulos, formatos, enlaces, imágenes y tablas en tu documento. En este ejercicio practicaremos con este lenguaje Reproduce en tu documento ejecutado, de la forma más parecida posible, lo que ves en la imagen siguiente con RMarkdown.

Máster en Bioestadística y Bioinformática SAD

Si quieres acceder a la UOC haz click al enlace http:wwww.uoc.edu.

En esta tabla encontrarás el listado de profesores y sus correos electrónicos.

Consultor Aula Correo electronico
Mª Angels Carbonell Aula 4 acarbonellto@uoc.edu
Victor Peña Aula 3 vpenapi@uoc.edu
Alicia Vila Aula 2 acvilag@uoc.edu
Marta Casals Aula 1 martacasalsf@uoc.edu

Los Laboratorios que usaremos en esta PEC1 son:

  1. LAB 1. Instroducción a R, RStudio y RMarkdown.
  2. LAB 2. Estadística descriptiva y gráficos con R

Sección 2. Importación, exportación y gestión de datos (3 puntos)

Ejercicio 1

a) Importad los datos del “COVID-19 Global Statistics Dataset.csv “ correspondientes a datos globales estadísticos sobre la Covid en el mundo. El nombre del dataset para trabajar deberá Covid19.

Covid19 <- read.csv("COVID-19 Global Statistics Dataset.csv") #Leemos los datos

b) A partir del conjunto datos definido en el apartado anterior(Covid19),mostrad algunas de las características del conjunto de datos como:

  • Nombre de las variables y los primeros registros que forman el conjunto de datos. El conjunto de datos contiene 239 observaciones de 14 variables. Las variables incluye: Pais, Casos totales, Nuevos casos, muertes totales, nuevos fallecimientos, recuperaciones totales, nuevas recuperaciones, casos activos, casos criticos, casos totales por millon de población, fallecimientos por millon de habitantes, numero de tests totales, tests por millon de poblacion y poblacion Las primeras variables se muestran aqui:
#Structura del dataset
head(Covid19)
##    Country Total.Cases New.Cases Total.Deaths New.Deaths Total.Recovered
## 1      USA 111,367,209              1,199,031         NA     109,053,249
## 2    India  45,028,429       161      533,475          2             N/A
## 3   France  40,138,560                167,642         NA      39,970,918
## 4  Germany  38,819,284       574      182,439         28      38,240,600
## 5   Brazil  38,407,327                709,765         NA      36,249,161
## 6 S. Korea  34,571,873                 35,934         NA      34,535,939
##   New.Recovered Active.Cases Serious..Critical Tot.Cases.1M.pop Deaths.1M.pop
## 1                  1,114,929             1,771          332,633         3,581
## 2           N/A          N/A               N/A           32,012           379
## 3                          0                            612,013         2,556
## 4                    396,245               N/A          462,776         2,175
## 5                  1,448,401               N/A          178,345         3,296
## 6                          0                            673,523           700
##     Total.Tests Tests.1M.pop    Population
## 1 1,186,742,917    3,544,577   334,805,269
## 2   935,879,495      665,334 1,406,631,776
## 3   271,490,188    4,139,547    65,584,518
## 4   122,332,384    1,458,359    83,883,596
## 5    63,776,166      296,146   215,353,593
## 6    15,804,065      307,892    51,329,899
  • Estructura del conjunto de datos en cuanto a descripción de los tipos de variables.

La mayoria de variables son caracteres o factores. Aunque alguna variable como “New deaths” es un integer (número entero)

str(Covid19)
  • Tamaño de la muestra y número de variables (número de registros, número de columnas, …). Descrito en el primer apartado.

  • Valoración de la existencia de valores nulos o ‘missing values’.

Solo la variable “New deaths” contiene missing values

is.na(Covid19)

Ejercicio 2

a) A partir del conjunto de datos correspondientes al fichero malaria.csv, se pide: Cambiad los nombres de las 3 variables por “Región”, Año y Defunciones”.

malaria <- read.csv("malaria.csv")
view(malaria)

library(dplyr)
malaria <- malaria %>%
  rename(Region = Entity, Año = Year, Defunciones = Malaria.Deaths.by.World.Region..WHO..2016..)

b) ¿Cuál es la media de la variable Defunciones, del conjunto de datos?

107112.5

mean(malaria$Defunciones)
## [1] 107112.5

c) Cread una tabla de contingencia entre las variables Año y Defunciones. ¿Tiene sentido la tabla resultante? ¿La podrías mejorar con algún cambio?

La tabla no es muy informativa

kable(table(malaria$Año, malaria$Defunciones))
0 500 1100 1200 1600 3200 3500 4200 7000 7300 8100 15000 32000 44000 48000 51000 395000 499000 670000 764000
2000 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1
2005 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0
2010 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
2015 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0

La tabla no es muy informativa, seria mejor mostrar una tabla con la totalidad de las defunciones por año.

# creo el df con el total deaths per year
death_totals <- malaria %>%
  group_by(Año) %>% #agrupar la variable año 
  summarize(Total_Deaths = sum(Defunciones)) #crear un resumen de la suma de las muertes asociadas a cada año

kable(death_totals)     
Año Total_Deaths
2000 839700
2005 738400
2010 554600
2015 438000

d)A partir del conjunto de datos lung_cancer_examples.csv, se pide:¿Cuál es la media de edad, que definiremos como age_mean, de los pacientes de la

muestra de datos?

La edad media de los pacientes es 42.62712

lc <- read.csv("lung_cancer_examples.csv")
mean(lc$Age)
## [1] 42.62712

Definir una variable, “age_max_smoke”, que guarde la edad del paciente que registra el máximo valor de cigarros fumados por día.

age_max_smoke <- subset(lc, Smokes == max(Smokes), Age) # selecciona del data frame lc, el valor maximo de cigarrillos y la edad asociada.

f) Define un dat frame, “paciente_result_0”, que contenga los pacientes que no están afectados (Result=0)

paciente_result_0 <- subset(lc, lc$Result == 0)
paciente_result_0<- as.data.frame(paciente_result_0)

Ejercicio 3

a) En esta tabla se considera la producción de naranjas durante los 10 meses.¿Construir un vector meses que contenga los números de 1 a 10 asignados a los meses. ¿Qué función puedes usar para este efecto?

meses <- c(1:10) #La funcion concatenate

b) ¿Construir un vector llamado prod_naranjas que contenga la producción mensual de esta fruta, a partir de la tabla anterior.

prod_manzanas <- c(100, 90.5, 91.03, 68.14, 45.6, 25.45, 12.05,16.48, 34.58,88.5)

c) Representar gráficamente la producción mensual de manzanas. Usando línea continua y color azul: plot (meses, manzanas, type=‘b’, col=‘blue’). Explorar otros posibles tipos de línea Etiquetar los ejes como: ‘Meses del año’ (abscisas), ‘Toneladas demanzanas’ (ordenadas). Se usará xlab=’’, ylab=’’para tal fin.

manzanas<- data.frame(meses, prod_manzanas)

ggplot(manzanas, aes(meses,prod_manzanas))+
  geom_line(color = "darkblue")+ labs (y = "Toneladas de manzanas", x= "Meses del año")+
     scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 10))+
  scale_x_continuous(limits = c(1,10), breaks = seq(1,10, by =1))+
  theme_bw()

d) Buscad la suma de la producción de naranjas a los meses.

Suma de naranjas totales

sum(prod_manzanas)
## [1] 572.33

Sección 3: Estadística descriptiva y gráficos (4 puntos)

Ejercicio 1

a) A partir del dataframe sleep_health, realizad un breve estudio de regresión y correlación lineal, resolviendo las siguientes cuestiones.Realizad un diagrama de cajas sobre las variables Sleep_duration y Stress_level. ¿Qué se puede extraer de este gráfico?

data <- read_csv("Sleep_health_and_lifestyle_dataset.csv")
## Rows: 374 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): Gender, Occupation, BMI Category, Blood Pressure, Sleep Disorder
## dbl (8): Person ID, Age, Sleep Duration, Quality of Sleep, Physical Activity...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
boxplot(data$`Sleep Duration`, data$`Stress Level`, col = c("lightpink", "lightblue"), names = c("Sleep duration", "Stress level")) 

ggplot(data, aes(x=factor(1), y = `Sleep Duration`))+
         geom_boxplot(fill = "lightpink")+
         geom_boxplot(aes(x = factor(2), y = `Stress Level`), fill= "lightblue")+
         labs(x= "", y="")+
        scale_x_discrete(labels = c("Sleep duration", "Stress level"))+
      theme_bw()

De los diagramas de cajas podemos decir que la variable sleep duration tiene una dispersión menor que la variable stress level. Las medianas parecen muy diferentes entre si.

b) Realizad un modelo de regresión para las dos variables anteriores y un diagrama de puntos que ajuste al modelo anterior. ¿Qué conclusiones pueden obtenerse?

summary(data$`Sleep Duration`, data$`Stress Level`)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   5.800   6.400   7.200   7.132   7.800   8.500
plot(data$`Stress Level`, data$`Sleep Duration`) #Parece que hay una correlacion negativa

kable(cor(data$`Stress Level`, data$`Sleep Duration`)) #en efecto hay una fuerte correlaccion negativa con un coeficiente de -0.81
x
-0.811023
modelo_sleep <- lm(`Sleep Duration`~ `Stress Level`, data = data)
summary(modelo_sleep)
## 
## Call:
## lm(formula = `Sleep Duration` ~ `Stress Level`, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.13574 -0.18117 -0.04481  0.32790  0.99155 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      9.0903     0.0771  117.90   <2e-16 ***
## `Stress Level`  -0.3636     0.0136  -26.74   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4661 on 372 degrees of freedom
## Multiple R-squared:  0.6578, Adjusted R-squared:  0.6568 
## F-statistic:   715 on 1 and 372 DF,  p-value: < 2.2e-16
ggplot(data, aes(`Stress Level` ,  `Sleep Duration` ))+
         geom_point(color = "darkorchid2")+ 
         theme_bw()+
         geom_abline(intercept = coef(modelo_sleep)[1] , slope = coef(modelo_sleep)[2], col= "darkred")

Efectivamente se cumple que existe una correlación negativa entre las dos variables. A medida que aumenta el estrés, disminuye la duración del sueñ0. Por otro lado nuestro modelo de regresión lineal se ajusta bastahte bien a los datos( R= 0.6578), siendo la formula de la recta ( y = -0.3636x + 9.0903). El standard error es 0.4661.

c) Realizado la matriz de correlación del conjunto de datos sleep_health. ¿Qué se puede afirmar?

data_df <- data.frame(data)
kable(head(data_df))
Person.ID Gender Age Occupation Sleep.Duration Quality.of.Sleep Physical.Activity.Level Stress.Level BMI.Category Blood.Pressure Heart.Rate Daily.Steps Sleep.Disorder
1 Male 27 Software Engineer 6.1 6 42 6 Overweight 126/83 77 4200 None
2 Male 28 Doctor 6.2 6 60 8 Normal 125/80 75 10000 None
3 Male 28 Doctor 6.2 6 60 8 Normal 125/80 75 10000 None
4 Male 28 Sales Representative 5.9 4 30 8 Obese 140/90 85 3000 Sleep Apnea
5 Male 28 Sales Representative 5.9 4 30 8 Obese 140/90 85 3000 Sleep Apnea
6 Male 28 Software Engineer 5.9 4 30 8 Obese 140/90 85 3000 Insomnia
#cor(data_df) #No podemos hacer la matriz de correlaciones porque no todas las variables son numericas. Asique creare la matriz de correlaccion solo con las variables numericas


number_df <- data[, c("Age", "Sleep Duration", "Quality of Sleep", 
                     "Physical Activity Level", "Stress Level", 
                      "Heart Rate", "Daily Steps")]

corr_matrix <- cor(number_df)
as.data.frame(corr_matrix)
##                                Age Sleep Duration Quality of Sleep
## Age                      1.0000000     0.34470936       0.47373388
## Sleep Duration           0.3447094     1.00000000       0.88321300
## Quality of Sleep         0.4737339     0.88321300       1.00000000
## Physical Activity Level  0.1789927     0.21236031       0.19289645
## Stress Level            -0.4223445    -0.81102303      -0.89875203
## Heart Rate              -0.2256062    -0.51645489      -0.65986473
## Daily Steps              0.0579734    -0.03953254       0.01679141
##                         Physical Activity Level Stress Level  Heart Rate
## Age                                  0.17899272  -0.42234448 -0.22560619
## Sleep Duration                       0.21236031  -0.81102303 -0.51645489
## Quality of Sleep                     0.19289645  -0.89875203 -0.65986473
## Physical Activity Level              1.00000000  -0.03413446  0.13697098
## Stress Level                        -0.03413446   1.00000000  0.67002646
## Heart Rate                           0.13697098   0.67002646  1.00000000
## Daily Steps                          0.77272305   0.18682895 -0.03030858
##                         Daily Steps
## Age                      0.05797340
## Sleep Duration          -0.03953254
## Quality of Sleep         0.01679141
## Physical Activity Level  0.77272305
## Stress Level             0.18682895
## Heart Rate              -0.03030858
## Daily Steps              1.00000000

De la matriz de correlacciones se puede extraer que existe una relación positiva entre la duración y la calidad del sueño. Por otro lado el estrés esta ligado negativamente también a la duración y calidad del sueño. Además aunque no muy alta, existe una relacion positiva entre los niveles de estrés y la frequencia cardiaca.Por otro lado y aunque es de esperar, hay una relación positiva entre el número de pasos y la actividad diaria

d) Calculad los residuos del modelo ajustado anterior y realizad un gráfico de normalidad.

#Calculamos los residuos estandarizaods y los valores ajustadoa
residuos <- rstandard(modelo_sleep)
valores.ajustados <- fitted(modelo_sleep)
plot(valores.ajustados, residuos)

#comprobamos la normalidad.

qqnorm(residuos)
qqline(residuos)

Observamos que aunque el modelo no es perfecto, parece que si que cumple la homocedasticidad de la varianza (no hay ningún patrón claro). Además los residuos parece que siguen una distribución normal.

Ejercicio 2

a) A partir del A partir del conjunto de datos Estudiantes.xls que adjuntamos en los ficheros de la PEC.Realizad un resumen estadístico que muestre los parámetros básicos más importantes de este conjunto de datos. Comentad los resultados y si es necesario realizar algún cambio en el tipo de variables, etc

library(readxl)
students <- read_excel("Estudiantes.xlsx")

kable(head(students))
Observación ID Sexo SexoNum Edad Fuma Estatura Colegio
1 SB11201910010401 Femenino 0 21.36 No Alta Privado
2 SB11201910010402 Masculino 1 21.07 Si Baja Privado
3 SB11201910010403 Masculino 1 20.92 Si Alta Publico
4 SB11201910010404 Masculino 1 18.41 Si Alta Publico
5 SB11201910010405 Femenino 0 16.64 Si Alta Publico
6 SB11201910010406 Femenino 0 16.02 No Baja Publico

Observamos que tenemos un conjunto de datos con 50 observaciones de 8 variables.Cada observación corresponde a un estudiante donde se recogen las ocho variables (ID, sexo, sexo en numerico,edad, si fuma o no, estatura y el tipo de colegio al que el estudiante esta registrado) La única variable que creo que necesita ser modificada es la variable edad, ya que viene con decimales y la cambiare a número entero. No voy a quitar la variable sexo en ninguna de sus formas por si luego tengo que usarla de forma categorica o numérica.

students$Edad<- as.integer(students$Edad)

Para obtener un resumen de los estadisticos más importantes usaré el package “psych”, de tal forma que mostraré los estadisticos mas importantes de cada variable.

library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
describe.by(students)
## Warning: describe.by is deprecated.  Please use the describeBy function
## Warning in describeBy(x = x, group = group, mat = mat, type = type, ...): no
## grouping variable requested
##             vars  n  mean    sd median trimmed   mad min max range  skew
## Observación    1 50 25.50 14.58   25.5   25.50 18.53   1  50    49  0.00
## ID*            2 50 25.50 14.58   25.5   25.50 18.53   1  50    49  0.00
## Sexo*          3 50  1.46  0.50    1.0    1.45  0.00   1   2     1  0.16
## SexoNum        4 50  0.44  0.50    0.0    0.42  0.00   0   1     1  0.23
## Edad           5 50 18.34  2.38   18.0   18.38  2.97  14  22     8  0.01
## Fuma*          6 50  1.64  0.48    2.0    1.68  0.00   1   2     1 -0.57
## Estatura*      7 50  1.96  0.83    2.0    1.95  1.48   1   3     2  0.07
## Colegio*       8 50  1.56  0.50    2.0    1.57  0.00   1   2     1 -0.23
##             kurtosis   se
## Observación    -1.27 2.06
## ID*            -1.27 2.06
## Sexo*          -2.01 0.07
## SexoNum        -1.98 0.07
## Edad           -1.41 0.34
## Fuma*          -1.71 0.07
## Estatura*      -1.58 0.12
## Colegio*       -1.98 0.07

b) Supongamos que necesito una muestra seleccionando de mi conjunto de datos que contenga las observaciones de 1 a 4, con las columnas 3 a 5. Le llamaremos Muestra1.

muestra1 <- students[1:4, 3:5]

c) Construid una tabla de frecuencias para analizar la distribución de la variable categórica Sexo. También una Tabla de contingencia para analizar la distribución conjunta de las variables categóricas Sexo y Fuma. Las definimos como factores ¿Qué podemos ver en estas tablas?

#tabla de frequencias sexo
 tsexo<- table(students$Sexo)

#tabla contigencia con sexo y fuma
tsexo.fuma <-table (students$Sexo, students$Fuma)

De las tablas podemos extraer que hay un total de 27 chicas de las cuales 17 fuman y 23 chicos totales de los cuales 15 fuman.

d) Vamos a crear un par de gráficos.

  • A partir de las tablas del apartado anterior genera un gráfico de barras donde podamos ver por Sexo los estudiantes que fuman y no fuman. Incluye una leyenda para el gráfico.
#Primero transformo mi table en un data frame
tsexo.fuma<- as.data.frame(tsexo.fuma)

#creo el plot donde la x es el sexo, la y la frequencia y relleno segun fuma o no-

ggplot(tsexo.fuma, aes(x = Var1, y = Freq, fill = Var2)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(x = "Sex", y = "Frequency", fill = "Fuma") +
  ggtitle("Frequency of Smoking by Sex")+
  theme_bw()

Realizad un histograma de la variable edad. Podéis decidir el número de clases. Utilizad diversos recursos visuales para su representación.

#creo una nueva variable para determinar si los estudiantes son menores o mayores de edad
students$Age_Group <- ifelse(students$Edad <= 18, "Minors", "Adults")

#creo el plot y coloreo segun la nueva variable
ggplot(students, aes(x = Edad, fill = Age_Group)) +
  geom_histogram( alpha = 0.5) +
  labs(x = "Age", y = "Frequency", fill = "Age Group") +
  ggtitle("Histogram of Age by Age Group") +
  scale_fill_manual(values = c("Minors" = "blue", "Adults" = "red")) +
  theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

e) Utilizando el paquete de gráficos ggplot2, generar un gráfico de tipo qplot de la variable edad. Escoged 2 variables más del dataset para generar un gráfico de pastel y un gráfico de tallo y hojas. Utilizad los diversos recursos visuales para su representación y comentad los resultados.

#Grafico de pastel

ggplot(students, aes(x = "", fill = Colegio)) +
  geom_bar(width = 1) +
  coord_polar("y", start = 0) +
  labs(fill = "Colegio") +
  ggtitle("Grafico pastel segun el tipo de colegio") +
  theme_void()

En el primer gráfico pastel se puede observar que hay mas proporción de alumnos que van al colegio público.El segundo grafico (tallo y hoja no me ha quedado muy claro como se hace)

Sección 5: Competencia sobre Ética y valores en la Investigación

Redacta una breve reflexión (10 líneas) sobre los aspectos éticos de utilizar datos reales en las investigaciones.

Los cientificos tenemos el deber moral de encontrar nuevos conocimientos que puedan ser útiles para la sociedad. Para ello, se deben de cumplir una serie de requisitos (el código de Nuremberg) a la hora de experimentar con pacientes reales para garantizar la calidad y la seguridad de los participantes. En este código se incluyen pautas no solo para la experimentación en sí, sino también para la utilización de los datos obtenidos de dichos experimentos. Algunas de estas pautas remarcan lo siguiente:

  • Tenemos el deber moral de abstenernos de dañar o de correr el riesgo de dañar a los participantes. Esto no solo se refiere al daño fisico, sino que por ejemplo, debemos respetar la confidencialidad. Para ello es importante anonimizar los datos para que sea imposible vincularlos con el paciente en cuestión y evitar así cualquier tipo de sesgo.

  • Si usamos los datos de una investigación, los participantes de dicha investigación deben de haber dado su consentimiento de antemano.

  • Asi mismo debemos abstenernos de estudiar una población vulnerable solo para beneficiar al resto de la población.

  • Los científicos debemos abstenernos de obligar o manipular al paciente para participar en un estudio o compartir sus datos. Debemos ser totalmente transparentes con el paciente y dejar que este decida que hacer.