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.
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:
Covid19 <- read.csv("COVID-19 Global Statistics Dataset.csv") #Leemos los datos
#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
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)
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..)
107112.5
mean(malaria$Defunciones)
## [1] 107112.5
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 |
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
age_max_smoke <- subset(lc, Smokes == max(Smokes), Age) # selecciona del data frame lc, el valor maximo de cigarrillos y la edad asociada.
paciente_result_0 <- subset(lc, lc$Result == 0)
paciente_result_0<- as.data.frame(paciente_result_0)
meses <- c(1:10) #La funcion concatenate
prod_manzanas <- c(100, 90.5, 91.03, 68.14, 45.6, 25.45, 12.05,16.48, 34.58,88.5)
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()
Suma de naranjas totales
sum(prod_manzanas)
## [1] 572.33
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.
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.
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
#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.
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
muestra1 <- students[1:4, 3:5]
#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.
#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`.
#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)
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.