data("iris")
summary(iris) # Busquem el resum estadístic
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
data("Orange")
summary(Orange) # Busquem el resum estadístic
## Tree age circumference
## 3:7 Min. : 118.0 Min. : 30.0
## 1:7 1st Qu.: 484.0 1st Qu.: 65.5
## 5:7 Median :1004.0 Median :115.0
## 2:7 Mean : 922.1 Mean :115.9
## 4:7 3rd Qu.:1372.0 3rd Qu.:161.5
## Max. :1582.0 Max. :214.0
En aquest cas, de les taules generades, només la de les espècies (variable categòrica) ens aporta informació ràpidament, indicant que de la mostra total, hi ha una repartició igual entre les tres espècies. Pel que fa a les altres quatre variants, no ens aporten una informació tant ràpid (ja que son variables numèriques contínues), tot i que es pot observar, principalment en Sepal.Length i .Width, que hi ha una distribució normal (campana de Gauss) en les mesures. Tot i això, en aquest cas seria molt més útil representar les dades en un histograma que no pas en una taula.
# Carreguem les dades
data("iris")
# Carreguem la llibreria knitr per usar la funció kable
library(knitr) # kable s'usa per millorar el format de la taula, doncs sense ella,
# els resultats es presenten de forma poc ordenada
# Generem taules per cadascuna de les variables d'iris
kable(table(iris$Species))
| Var1 | Freq |
|---|---|
| setosa | 50 |
| versicolor | 50 |
| virginica | 50 |
kable(table(iris$Sepal.Length))
| Var1 | Freq |
|---|---|
| 4.3 | 1 |
| 4.4 | 3 |
| 4.5 | 1 |
| 4.6 | 4 |
| 4.7 | 2 |
| 4.8 | 5 |
| 4.9 | 6 |
| 5 | 10 |
| 5.1 | 9 |
| 5.2 | 4 |
| 5.3 | 1 |
| 5.4 | 6 |
| 5.5 | 7 |
| 5.6 | 6 |
| 5.7 | 8 |
| 5.8 | 7 |
| 5.9 | 3 |
| 6 | 6 |
| 6.1 | 6 |
| 6.2 | 4 |
| 6.3 | 9 |
| 6.4 | 7 |
| 6.5 | 5 |
| 6.6 | 2 |
| 6.7 | 8 |
| 6.8 | 3 |
| 6.9 | 4 |
| 7 | 1 |
| 7.1 | 1 |
| 7.2 | 3 |
| 7.3 | 1 |
| 7.4 | 1 |
| 7.6 | 1 |
| 7.7 | 4 |
| 7.9 | 1 |
kable(table(iris$Sepal.Width))
| Var1 | Freq |
|---|---|
| 2 | 1 |
| 2.2 | 3 |
| 2.3 | 4 |
| 2.4 | 3 |
| 2.5 | 8 |
| 2.6 | 5 |
| 2.7 | 9 |
| 2.8 | 14 |
| 2.9 | 10 |
| 3 | 26 |
| 3.1 | 11 |
| 3.2 | 13 |
| 3.3 | 6 |
| 3.4 | 12 |
| 3.5 | 6 |
| 3.6 | 4 |
| 3.7 | 3 |
| 3.8 | 6 |
| 3.9 | 2 |
| 4 | 1 |
| 4.1 | 1 |
| 4.2 | 1 |
| 4.4 | 1 |
kable(table(iris$Petal.Length))
| Var1 | Freq |
|---|---|
| 1 | 1 |
| 1.1 | 1 |
| 1.2 | 2 |
| 1.3 | 7 |
| 1.4 | 13 |
| 1.5 | 13 |
| 1.6 | 7 |
| 1.7 | 4 |
| 1.9 | 2 |
| 3 | 1 |
| 3.3 | 2 |
| 3.5 | 2 |
| 3.6 | 1 |
| 3.7 | 1 |
| 3.8 | 1 |
| 3.9 | 3 |
| 4 | 5 |
| 4.1 | 3 |
| 4.2 | 4 |
| 4.3 | 2 |
| 4.4 | 4 |
| 4.5 | 8 |
| 4.6 | 3 |
| 4.7 | 5 |
| 4.8 | 4 |
| 4.9 | 5 |
| 5 | 4 |
| 5.1 | 8 |
| 5.2 | 2 |
| 5.3 | 2 |
| 5.4 | 2 |
| 5.5 | 3 |
| 5.6 | 6 |
| 5.7 | 3 |
| 5.8 | 3 |
| 5.9 | 2 |
| 6 | 2 |
| 6.1 | 3 |
| 6.3 | 1 |
| 6.4 | 1 |
| 6.6 | 1 |
| 6.7 | 2 |
| 6.9 | 1 |
kable(table(iris$Petal.Width))
| Var1 | Freq |
|---|---|
| 0.1 | 5 |
| 0.2 | 29 |
| 0.3 | 7 |
| 0.4 | 7 |
| 0.5 | 1 |
| 0.6 | 1 |
| 1 | 7 |
| 1.1 | 3 |
| 1.2 | 5 |
| 1.3 | 13 |
| 1.4 | 8 |
| 1.5 | 12 |
| 1.6 | 4 |
| 1.7 | 2 |
| 1.8 | 12 |
| 1.9 | 5 |
| 2 | 6 |
| 2.1 | 6 |
| 2.2 | 3 |
| 2.3 | 8 |
| 2.4 | 3 |
| 2.5 | 3 |
# I per les mateixes variables generem la taula de freqüències relativa
kable(prop.table(table(iris$Species)))
| Var1 | Freq |
|---|---|
| setosa | 0.3333333 |
| versicolor | 0.3333333 |
| virginica | 0.3333333 |
kable(prop.table(table(iris$Sepal.Length)))
| Var1 | Freq |
|---|---|
| 4.3 | 0.0066667 |
| 4.4 | 0.0200000 |
| 4.5 | 0.0066667 |
| 4.6 | 0.0266667 |
| 4.7 | 0.0133333 |
| 4.8 | 0.0333333 |
| 4.9 | 0.0400000 |
| 5 | 0.0666667 |
| 5.1 | 0.0600000 |
| 5.2 | 0.0266667 |
| 5.3 | 0.0066667 |
| 5.4 | 0.0400000 |
| 5.5 | 0.0466667 |
| 5.6 | 0.0400000 |
| 5.7 | 0.0533333 |
| 5.8 | 0.0466667 |
| 5.9 | 0.0200000 |
| 6 | 0.0400000 |
| 6.1 | 0.0400000 |
| 6.2 | 0.0266667 |
| 6.3 | 0.0600000 |
| 6.4 | 0.0466667 |
| 6.5 | 0.0333333 |
| 6.6 | 0.0133333 |
| 6.7 | 0.0533333 |
| 6.8 | 0.0200000 |
| 6.9 | 0.0266667 |
| 7 | 0.0066667 |
| 7.1 | 0.0066667 |
| 7.2 | 0.0200000 |
| 7.3 | 0.0066667 |
| 7.4 | 0.0066667 |
| 7.6 | 0.0066667 |
| 7.7 | 0.0266667 |
| 7.9 | 0.0066667 |
kable(prop.table(table(iris$Sepal.Width)))
| Var1 | Freq |
|---|---|
| 2 | 0.0066667 |
| 2.2 | 0.0200000 |
| 2.3 | 0.0266667 |
| 2.4 | 0.0200000 |
| 2.5 | 0.0533333 |
| 2.6 | 0.0333333 |
| 2.7 | 0.0600000 |
| 2.8 | 0.0933333 |
| 2.9 | 0.0666667 |
| 3 | 0.1733333 |
| 3.1 | 0.0733333 |
| 3.2 | 0.0866667 |
| 3.3 | 0.0400000 |
| 3.4 | 0.0800000 |
| 3.5 | 0.0400000 |
| 3.6 | 0.0266667 |
| 3.7 | 0.0200000 |
| 3.8 | 0.0400000 |
| 3.9 | 0.0133333 |
| 4 | 0.0066667 |
| 4.1 | 0.0066667 |
| 4.2 | 0.0066667 |
| 4.4 | 0.0066667 |
kable(prop.table(table(iris$Petal.Length)))
| Var1 | Freq |
|---|---|
| 1 | 0.0066667 |
| 1.1 | 0.0066667 |
| 1.2 | 0.0133333 |
| 1.3 | 0.0466667 |
| 1.4 | 0.0866667 |
| 1.5 | 0.0866667 |
| 1.6 | 0.0466667 |
| 1.7 | 0.0266667 |
| 1.9 | 0.0133333 |
| 3 | 0.0066667 |
| 3.3 | 0.0133333 |
| 3.5 | 0.0133333 |
| 3.6 | 0.0066667 |
| 3.7 | 0.0066667 |
| 3.8 | 0.0066667 |
| 3.9 | 0.0200000 |
| 4 | 0.0333333 |
| 4.1 | 0.0200000 |
| 4.2 | 0.0266667 |
| 4.3 | 0.0133333 |
| 4.4 | 0.0266667 |
| 4.5 | 0.0533333 |
| 4.6 | 0.0200000 |
| 4.7 | 0.0333333 |
| 4.8 | 0.0266667 |
| 4.9 | 0.0333333 |
| 5 | 0.0266667 |
| 5.1 | 0.0533333 |
| 5.2 | 0.0133333 |
| 5.3 | 0.0133333 |
| 5.4 | 0.0133333 |
| 5.5 | 0.0200000 |
| 5.6 | 0.0400000 |
| 5.7 | 0.0200000 |
| 5.8 | 0.0200000 |
| 5.9 | 0.0133333 |
| 6 | 0.0133333 |
| 6.1 | 0.0200000 |
| 6.3 | 0.0066667 |
| 6.4 | 0.0066667 |
| 6.6 | 0.0066667 |
| 6.7 | 0.0133333 |
| 6.9 | 0.0066667 |
kable(prop.table(table(iris$Petal.Width)))
| Var1 | Freq |
|---|---|
| 0.1 | 0.0333333 |
| 0.2 | 0.1933333 |
| 0.3 | 0.0466667 |
| 0.4 | 0.0466667 |
| 0.5 | 0.0066667 |
| 0.6 | 0.0066667 |
| 1 | 0.0466667 |
| 1.1 | 0.0200000 |
| 1.2 | 0.0333333 |
| 1.3 | 0.0866667 |
| 1.4 | 0.0533333 |
| 1.5 | 0.0800000 |
| 1.6 | 0.0266667 |
| 1.7 | 0.0133333 |
| 1.8 | 0.0800000 |
| 1.9 | 0.0333333 |
| 2 | 0.0400000 |
| 2.1 | 0.0400000 |
| 2.2 | 0.0200000 |
| 2.3 | 0.0533333 |
| 2.4 | 0.0200000 |
| 2.5 | 0.0200000 |
No, no totes les taules tenen sentit. Si bé les resultants d’analitzar ‘Tree’ i ‘Age’ poden ser útils (Tree és una variable categòrica, que indica que tenim 5 arbres i cada un ha sigut mesurat 7 cops; i Age, que indica els 7 dies en que es van prendre mesures, i cada dia es van fer mesures a 5 arbres). La taula que representa els resultats de circumferència no aporta cap informació addicional. Al ser una variable numèrica i continua, cada arbre té un valor diferent i rarament es repeteixen, pel que per comptes d’agrupar els arbres entre si, els deixa tal i com estan.
data("Orange")
kable(table(Orange$Tree))
| Var1 | Freq |
|---|---|
| 3 | 7 |
| 1 | 7 |
| 5 | 7 |
| 2 | 7 |
| 4 | 7 |
kable(table(Orange$age))
| Var1 | Freq |
|---|---|
| 118 | 5 |
| 484 | 5 |
| 664 | 5 |
| 1004 | 5 |
| 1231 | 5 |
| 1372 | 5 |
| 1582 | 5 |
kable(table(Orange$circumference))
| Var1 | Freq |
|---|---|
| 30 | 3 |
| 32 | 1 |
| 33 | 1 |
| 49 | 1 |
| 51 | 1 |
| 58 | 1 |
| 62 | 1 |
| 69 | 1 |
| 75 | 1 |
| 81 | 1 |
| 87 | 1 |
| 108 | 1 |
| 111 | 1 |
| 112 | 1 |
| 115 | 2 |
| 120 | 1 |
| 125 | 1 |
| 139 | 1 |
| 140 | 1 |
| 142 | 2 |
| 145 | 1 |
| 156 | 1 |
| 167 | 1 |
| 172 | 1 |
| 174 | 1 |
| 177 | 1 |
| 179 | 1 |
| 203 | 2 |
| 209 | 1 |
| 214 | 1 |
data("Orange")
kable(table(Orange$Tree, Orange$age))
| 118 | 484 | 664 | 1004 | 1231 | 1372 | 1582 | |
|---|---|---|---|---|---|---|---|
| 3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
vect1 <- c(1,2,1,2,1,2,1,2,1,2,1,1,1,1,2,2,1,1,2,1)
vect2 <- c(1,1,2,2,2,1,2,1,1,2,1,2,1,1,1,2,1,1,1,1)
# a)
vect1 <- c(1,2,1,2,1,2,1,2,1,2,1,1,1,1,2,2,1,1,2,1)
vect2 <- c(1,1,2,2,2,1,2,1,1,2,1,2,1,1,1,2,1,1,1,1)
Baix_pes <- factor(vect1,levels=c("1","2"),labels=c("Baix Pes", "Pes Normal"))
# b)
Fumador <- factor(vect2,levels=c("1","2"),labels=c("Fuma","No Fuma"))
# c)
Taula <- table(Baix_pes,Fumador)
Taula
## Fumador
## Baix_pes Fuma No Fuma
## Baix Pes 8 4
## Pes Normal 5 3
# d)
chisq.test(Taula)
## Warning in chisq.test(Taula): Chi-squared approximation may be incorrect
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: Taula
## X-squared = 0, df = 1, p-value = 1
# e)
fisher.test(Taula)
##
## Fisher's Exact Test for Count Data
##
## data: Taula
## p-value = 1
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.1200513 10.9278345
## sample estimates:
## odds ratio
## 1.189031
Havent obtingut els resultats, es pot determinar que no hi ha motius suficients per demostrar una relació entre el fet de fumar i una disminució de pes. Un p-value = 1 ens indica que no podem rebutjar la hipòtesi nul·la, i per tant, per la mostra actual diriem que el pes i el tabaquisme son variables independents.
# c) Per a generar els 4 gràfics junts hem de posar aquest fragment de codi a l'inici com a un canvas que s'anirà omplint amb els diferents gràfics que anem creant
par(mfrow=c(2,2)) # Informació agafada de: https://nathanieldphillips-yarrr.share.connect.posit.cloud/arranging-plots-with-parmfrow-and-layout.html
# a)
data("airquality")
# Generem el primer punt, de la variable Ozone amb els valors representats mitjançant coixinets (#)
plot(airquality$Ozone, col="cadetblue2", pch="#")
# Generem el segon punt, el gràfic de caixa de la variable Temp
boxplot(airquality$Temp, col="red", main="Temperatura (en graus Fahrenheit)")
# b)
data("airmiles")
# Generem el gràfic de línies per airmiles. En l'eix de les x deixem el títol que ens indiquen, però sembla que representa els anys.
plot(airmiles, col="cadetblue2", main="Dades de passatgers en vols comercials (en milers)", xlab="Milers de passatgers", lwd=3) # La línia era molt prima, així que seguint els apunts he fet servir la variable lwd, per augmentar el gruix
# Generem l'histograma
hist(airmiles, col="chocolate2")
set.seed(909)
# Simulem les variables
x1 <- rnorm (400)
y1 <- ((4.32 * x1) / 10) +rnorm (400)
# Generem el gràfic de dispersió que conté una recta de regressió
plot(x1, y1, main="Gràfic de dispersió")
abline(lm(y1~x1), col="chocolate4")
# Generem el gràfic de densitats per x1 i y1
plot(density(x1), main = " Densitat d'X1")
lines(density(y1), col="blue")
# Carreguem la llibreria tidyverse i activem les dades
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
data("airquality")
# a)
ggplot(data = airquality, aes(x = Ozone, y = Temp)) + geom_point(size=2) + geom_smooth(method = "lm", color = "darkred") + labs(title = "Relació entre l'Ozó i la Temperatura") # La funció labs ens serveix per posar text a xlab, ylab o main(title)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 37 rows containing missing values or values outside the scale range
## (`geom_point()`).
# b)
ggplot(data = airquality, aes(x = Solar.R, y = Temp, col=factor(Month),shape=factor(Month))) + geom_point() + labs(title="Relació entre Solar.R i Temperatura", x = "Solar.R", y = "Temperatura (en Fahrenheit)")
## Warning: Removed 7 rows containing missing values or values outside the scale range
## (`geom_point()`).
# c)
# Carreguem i activem les dades
library("MASS")
##
## Adjuntando el paquete: 'MASS'
##
## The following object is masked from 'package:dplyr':
##
## select
data("birthwt")
ggplot(data = birthwt, aes(x = age)) + geom_histogram(col = "black", fill = "blue")
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
# d)
ggplot(data = birthwt, aes(x = age)) + geom_histogram(col = "black", fill = "blue") + facet_wrap(~smoke)
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
data("faithful")
jpeg("migrafic1.jpg")
pdf("migrafic2.pdf")
plot(faithful, main = "Correlació entre els minuts d'erupció del gèiser i espera fins la següent", xlab = "Durada de l'erupció (en minuts)", ylab= "Espera (en minuts)", col = blues9)
dev.off()
## png
## 2
jpeg("migrafic1.jpg")
plot(faithful, main = "Correlació entre els minuts d'erupció del gèiser i espera fins la següent", xlab = "Durada de l'erupció (en minuts)", ylab= "Espera (en minuts)", col = blues9)
dev.off()
## png
## 2
Els documents s’han generat correctament, tal com es mostra en la captura de pantalla:
# Pas 1. Carreguem i activem les dades
library(tidyverse)
data("Orange")
# Pas 2. Fem un resum estadístic
summary(Orange)
## Tree age circumference
## 3:7 Min. : 118.0 Min. : 30.0
## 1:7 1st Qu.: 484.0 1st Qu.: 65.5
## 5:7 Median :1004.0 Median :115.0
## 2:7 Mean : 922.1 Mean :115.9
## 4:7 3rd Qu.:1372.0 3rd Qu.:161.5
## Max. :1582.0 Max. :214.0
# Pas 3. Generem un diagrama de dispersió
pairs(Orange) # Observant els gràfics generats, sembla que hi ha una relació bastant clara entre l'edat i la circumferència.
# Pas 4. Mirem el grau de relació entre les dues variables
kable(cor(Orange$age, Orange$circumference))
| x |
|---|
| 0.9135189 |
# Hem obtingut una relació de 0.9135189, que al ser molt propera a 1, ens indica que molt segurament hi ha una relació entre les dues variables
# Pas 5. Generem el nou model
nou_model <- lm(circumference ~ age, data = Orange)
summary(nou_model)
##
## Call:
## lm(formula = circumference ~ age, data = Orange)
##
## Residuals:
## Min 1Q Median 3Q Max
## -46.310 -14.946 -0.076 19.697 45.111
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 17.399650 8.622660 2.018 0.0518 .
## age 0.106770 0.008277 12.900 1.93e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 23.74 on 33 degrees of freedom
## Multiple R-squared: 0.8345, Adjusted R-squared: 0.8295
## F-statistic: 166.4 on 1 and 33 DF, p-value: 1.931e-14
# A partir d'aquest Summary() hem obtingut l'equació de la recta, que serà:
# y = 17.399650 + 0.106770x
# Pas 6. Generem el gràfic de dispersió
plot(Orange$age, Orange$circumference, xlab = "Age", ylab = "Circumferència del tronc")
abline(nou_model)
# Pas 7. Fem la validació del model
residus <- rstandard(nou_model)
valors.ajustats <- fitted(nou_model)
plot(valors.ajustats, residus)
# En aquest cas si que podem observar una mena de patró en la validació, que ens pot indicar que seguir un model linear pot no ser la millor opció, tot i tenir un R^2 elevat. Per a que la validació fós efectiva, hauriem de veure un núvol de punts que semblen posats a l'atzar.
# Pas 8. Fem test de normalitat
qqnorm(residus)
qqline(residus)
# Pas 9. Finalment fem la predicció per a 600 dies
prediccio <- data.frame(age = seq(600))
resultats <- predict(nou_model, prediccio)
tail(resultats, 10) # Per tal d'evitar tenir la llista de 600 mesures, fem que només mostri els últims 10
## 591 592 593 594 595 596 597 598
## 80.50091 80.60768 80.71445 80.82122 80.92799 81.03476 81.14153 81.24830
## 599 600
## 81.35507 81.46185
# La predicció als 600 dies és que faci 81.46185 mm
# Pas 10. Fem un interval de confiança pels resultats que ens ha donat
confint(nou_model)
## 2.5 % 97.5 %
## (Intercept) -0.14328303 34.9425835
## age 0.08993141 0.1236092
# Carreguem i activem les dades
library(tidyverse)
data("Orange")
nou_model <- lm(circumference ~ age, data = Orange)
# Generem el gràfic de dispersió del Pas 6.
ggplot(Orange, aes(x = age, y = circumference)) + geom_point(size = 2) + geom_smooth(method = "lm", color = "darkred") + labs(title = "Regressió Lineal Ajustada",
subtitle = "y = 17.40 + 0.1068x",
x = "Edat (dies)", y = "Circumferència (mm)")
## `geom_smooth()` using formula = 'y ~ x'
# Per al gràfic de la validació del model hem de crear un dataframe. Pas 7.
df_residus <- data.frame(
residus <- rstandard(nou_model),
valors.ajustats <- fitted(nou_model)
)
ggplot(df_residus, aes(x= valors.ajustats, y= residus)) + geom_point(size = 2, col= "blue")
Com hem pogut observar en el boxplot, hi ha diferències significatives entre els tractaments. Tenim que el grup que ha rebut el tractament 1, ha tingut un augment de pes sec inferior al grup control, mentre que el grup que ha rebut el tractament 2 ha tingut un augment de pes superior al grup control
Per aplicar ANOVA s’han de complir tres condicions:
- Independència. Se suposa que per com s’ha plantejat l’experiment, hi ha independència entre les mostres
- Normalitat. Analitzarem els residus del model lineal pel Test de Shapiro-Wilk
- Homoscedasticitat. Comprovem si les variàncies entre els grups són iguals pel Test de Bartlett
Si les tres condicions es compleixen, podrem aplicar ANOVA
library(ggplot2)
# Activem les dades
data("PlantGrowth")
# Fem un resum de les dades
summary(PlantGrowth) # Veiem que tenim tres grups, ctrl, trt1 i trt2.
## weight group
## Min. :3.590 ctrl:10
## 1st Qu.:4.550 trt1:10
## Median :5.155 trt2:10
## Mean :5.073
## 3rd Qu.:5.530
## Max. :6.310
# Fem un gràfic per establir les diferències entre els tractaments visualment
ggplot(PlantGrowth, aes(x = group, y = weight)) + geom_boxplot() + labs(title = "Distribució del pes per grup de tractament",
x = "Grup", y = "Pes sec (weight)")
# Pel segon apartat, començarem determinant la normalitat, amb el test de Shapiro-Wilk
by(PlantGrowth$weight, PlantGrowth$group, shapiro.test)
## PlantGrowth$group: ctrl
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.95668, p-value = 0.7475
##
## ------------------------------------------------------------
## PlantGrowth$group: trt1
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.93041, p-value = 0.4519
##
## ------------------------------------------------------------
## PlantGrowth$group: trt2
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.94101, p-value = 0.5643
# I per la heterocedasticitat fem el test de Bartlett
bartlett.test(PlantGrowth$weight, PlantGrowth$group)
##
## Bartlett test of homogeneity of variances
##
## data: PlantGrowth$weight and PlantGrowth$group
## Bartlett's K-squared = 2.8786, df = 2, p-value = 0.2371
# En tots els casos obtenim que p > 0.05, pel que no hauriem de tenir problemes d'heterocedasticitat ni de normalitat
# Finalment, apliquem ANOVA
anv <- aov(weight ~ group, data = PlantGrowth)
summary(anv)
## Df Sum Sq Mean Sq F value Pr(>F)
## group 2 3.766 1.8832 4.846 0.0159 *
## Residuals 27 10.492 0.3886
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Podem fer Tukey per determinar entre quins grups hi ha diferències ( p-value < 0.05 en ANOVA ens indica que hi ha diferències significatives entre almenys dos grups)
TukeyHSD(anv)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = weight ~ group, data = PlantGrowth)
##
## $group
## diff lwr upr p adj
## trt1-ctrl -0.371 -1.0622161 0.3202161 0.3908711
## trt2-ctrl 0.494 -0.1972161 1.1852161 0.1979960
## trt2-trt1 0.865 0.1737839 1.5562161 0.0120064
# Veiem que la diferència principal és entre el tractament 1 i tractament 2 (p-value = 0.012)
El paquet Plotly permet crear gràfics on qualsevol usuari pot moure el ratolí per sobre dels punts per veure quins valors tenen, o pots fer zoom en els diferents elements del gràfic i filtrar dades
library(plotly)
##
## Adjuntando el paquete: 'plotly'
## The following object is masked from 'package:MASS':
##
## select
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(tidyverse)
data("iris")
histograma <- plot_ly(data = iris, x= iris$Sepal.Length, type = "histogram")
histograma
En aquest gràfic creat per Plotly podem:
Etiquetes: Si posem el ratolí sobre una barra, apareix un requadre amb informació dels valors que representa a l’eix de les x, aixi com al de les y.
Zoom: Mantenint el clic esquerre i dibuixant un rectangle podem fer zoom sobre les dades, si estiguessin molt juntes.
Exportar: A la barra superior hi tenim un icone d’una càmera, que permet exportar el gràfic a PDF.
Box Select. Ens serveix per seleccionar subconjunts, ressaltar visualment alguns d’aquests o filtrar dinàmicament
Seleccionaré les dades “Plasma_Retinol” de la biblioteca StatLib datasets archive, Carnegie-Mellon University.
library(tidyverse)
library(readr)
# Importem les dades corresponents a Plasma_Retinol
data_retinol <- read_table("C:/Users/carle/Documents/r_files/Plasma_Retinol.txt", skip = 34, col_names = FALSE, col_types = cols(.default = "d")) # Importem el database sense les primeres 34 linies, que corresponen a text, i no a les dades com a tal. Faig col_types perque no em detectava les primeres 4 columnes com a números, i no em feia el resum estadístic, amb aquesta variable li indico que totes les columnes son double (numèriques)
## Warning: 19 parsing failures.
## row col expected actual file
## 312 X1 a double Therese 'C:/Users/carle/Documents/r_files/Plasma_Retinol.txt'
## 312 X2 a double Stukel 'C:/Users/carle/Documents/r_files/Plasma_Retinol.txt'
## 312 -- 14 columns 2 columns 'C:/Users/carle/Documents/r_files/Plasma_Retinol.txt'
## 313 X1 a double Dartmouth 'C:/Users/carle/Documents/r_files/Plasma_Retinol.txt'
## 313 X2 a double Hitchcock 'C:/Users/carle/Documents/r_files/Plasma_Retinol.txt'
## ... ... .......... ......... .....................................................
## See problems(...) for more details.
# Definim les diferents columnes i la seva categoria
colnames(data_retinol) <- c(
"Edat", # AGE: Age (years)
"Sexe", # SEX: Sex (1=Male, 2=Female).
"Tabac", # SMOKSTAT: Smoking status (1=Never, 2=Former, 3=Current Smoker)
"IMC", # QUETELET: Quetelet (weight/(height^2))
"Vitamines", # VITUSE: Vitamin Use (1=Yes, fairly often, 2=Yes, not often, 3=No)
"Calories", # CALORIES: Number of calories consumed per day.
"Greix", # FAT: Grams of fat consumed per day.
"Fibra", # FIBER: Grams of fiber consumed per day.
"Alcohol", # ALCOHOL: Number of alcoholic drinks consumed per week.
"Colesterol", # CHOLESTEROL: Cholesterol consumed (mg per day).
"Beta_dieta", # BETADIET: Dietary beta-carotene consumed (mcg per day).
"Retinol", # RETDIET: Dietary retinol consumed (mcg per day)
"Beta_plasma", # BETAPLASMA: Plasma beta-carotene (ng/ml)
"Retinol_plasma"# RETPLASMA: Plasma Retinol (ng/ml)
)
# Netegem files buides
data_retinol <- na.omit(data_retinol)
# Fem el resum estadístic de tot el dataset
summary(data_retinol)
## Edat Sexe Tabac IMC
## Min. :19.00 Min. :1.000 Min. :1.000 Min. :16.33
## 1st Qu.:39.00 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:21.82
## Median :48.00 Median :2.000 Median :1.000 Median :24.74
## Mean :50.09 Mean :1.865 Mean :1.637 Mean :26.20
## 3rd Qu.:62.00 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:28.98
## Max. :83.00 Max. :2.000 Max. :3.000 Max. :50.40
## Vitamines Calories Greix Fibra
## Min. :1.000 Min. : 445.2 Min. : 14.40 Min. : 3.10
## 1st Qu.:1.000 1st Qu.:1354.4 1st Qu.: 53.95 1st Qu.: 9.15
## Median :2.000 Median :1666.8 Median : 72.90 Median :12.10
## Mean :1.968 Mean :1796.8 Mean : 77.10 Mean :12.74
## 3rd Qu.:3.000 3rd Qu.:2090.6 3rd Qu.: 95.25 3rd Qu.:15.35
## Max. :3.000 Max. :6662.2 Max. :235.90 Max. :36.80
## Alcohol Colesterol Beta_dieta Retinol
## Min. : 0.000 Min. : 37.7 Min. : 214 Min. : 30.0
## 1st Qu.: 0.000 1st Qu.:155.0 1st Qu.:1116 1st Qu.: 480.0
## Median : 0.300 Median :206.3 Median :1788 Median : 707.0
## Mean : 3.275 Mean :242.9 Mean :2175 Mean : 834.2
## 3rd Qu.: 3.200 3rd Qu.:308.9 3rd Qu.:2836 3rd Qu.:1047.5
## Max. :203.000 Max. :900.7 Max. :9642 Max. :6901.0
## Beta_plasma Retinol_plasma
## Min. : 0.0 Min. : 179.0
## 1st Qu.: 89.0 1st Qu.: 466.0
## Median : 138.0 Median : 564.0
## Mean : 189.7 Mean : 601.0
## 3rd Qu.: 230.0 3rd Qu.: 709.5
## Max. :1415.0 Max. :1727.0
# El resultat d'aquest ens indica, per exemple, que tenim més dones que homes en les mostres (Sexe té una mitjana més propera a 2), que més de la meitat de les persones no son fumadores (Median = 1, per tant, el 50% dels valors son 1), i a més ens indiquen el rang de valors per totes les diferents variables, a més de les seves mitjanes, medianes i quartils.
# Procedim a fer 5 gràfics bàsics i els guardem en format imatge
jpeg("01_hist.jpg")
hist(data_retinol$Edat)
dev.off()
## png
## 2
jpeg("02_boxplot.jpg")
boxplot(data_retinol$Sexe, data_retinol$Greix)
dev.off()
## png
## 2
jpeg("03_plot.jpg")
plot(data_retinol$Beta_dieta, data_retinol$Retinol_plasma)
dev.off()
## png
## 2
jpeg("04_barplot.jpg")
barplot(table(data_retinol$Tabac))
dev.off()
## png
## 2
jpeg("05_hist.jpg")
hist(data_retinol$Fibra)
dev.off()
## png
## 2
# Generem dos gràfics amb ggplot2:
# Analitzem els nivells d'ingesta de greix segons l'edat
jpeg("05_ggplot1.jpg")
ggplot(data_retinol, aes(x = Edat, y = Greix)) + geom_point(size = 2) + geom_smooth(method = "lm", color = "darkred") + labs(title = "Regressió Lineal Ajustada",
x = "Edat (anys)", y = "Greix consumit per dia")
## `geom_smooth()` using formula = 'y ~ x'
dev.off()
## png
## 2
# Analitzem els nivells de retinol en plasma segons els tres tipus de suplementació amb vitamines.
jpeg("06_ggplot2.jpg")
ggplot(data_retinol, aes(x = factor(Vitamines), y = Retinol_plasma, fill = factor(Vitamines))) + geom_violin(alpha=0.7) + labs(title = "Nivells de Retinol segons Vitamines", x = "Ús de Vitamines", y = "Retinol (ng/ml)")
dev.off()
## png
## 2
# Finalment, fem una regressió lineal entre les variables Edat i Retinol en plasma
kable(cor(data_retinol$Retinol_plasma, data_retinol$Edat))
| x |
|---|
| 0.2080947 |
modelreg <- lm(Retinol_plasma~Edat, data = data_retinol)
summary(modelreg)
##
## Call:
## lm(formula = Retinol_plasma ~ Edat, data = data_retinol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -458.60 -126.77 -32.79 101.70 1105.35
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 451.0212 41.7456 10.80 < 2e-16 ***
## Edat 2.9935 0.8004 3.74 0.000219 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 205 on 309 degrees of freedom
## Multiple R-squared: 0.0433, Adjusted R-squared: 0.04021
## F-statistic: 13.99 on 1 and 309 DF, p-value: 0.0002194
plot(data_retinol$Edat, data_retinol$Retinol_plasma, xlab = "Edat", ylab = "Nivells de retinol en plasma")
abline(modelreg)
residus <- rstandard(modelreg)
valors.ajustats <- fitted(modelreg)
plot(valors.ajustats, residus)
qqnorm(residus)
qqline(residus)
# Volem predir quins seran els nivells de Retinol en plasma en una persona de 75-80 anys
pred_edat <- data.frame(Edat=seq(75, 80))
predict(modelreg, pred_edat)
## 1 2 3 4 5 6
## 675.5369 678.5304 681.5240 684.5175 687.5111 690.5046
# Calculem l'interval de confiaça al 95%
confint(modelreg)
## 2.5 % 97.5 %
## (Intercept) 368.879578 533.162783
## Edat 1.418527 4.568559
# Amb l'anàlisi dut a terme, veient que R^2 (0.04) i la correlació (0.2) son tant baixes, podiem determinar que no hi ha relació (o aquesta és insuficient) entre les dues variables.
Confirmació de que els 5 gràfics bàsics s’han generat i guardat
correctament: