diff --git a/entregables/ent2/ent2.Rmd b/entregables/ent2/ent2.Rmd
new file mode 100644
index 0000000..f390a54
--- /dev/null
+++ b/entregables/ent2/ent2.Rmd
@@ -0,0 +1,357 @@
+---
+title: "Entregable 2 - Estadística"
+subtitle: "Grau de Matemàtiques, Curs 2020-21"
+author: "Vilanova Martínez, Adrià"
+output: html_document
+---
+
+```{r message=FALSE}
+# Libraries
+library(EnvStats)
+```
+
+## Configuració
+Aquí es pot configurar la pràctica depenent del que es pregunti:
+
+```{r}
+# Si |generate_random| és TRUE, en comptes d'utilitzar la mostra donada a la
+# variable |input|, es genera una mostra aleatòria seguint la distribució
+# binomial negativa de mida |random_n|, amb paràmetres |random_size| i
+# |random_prob|
+generate_random = FALSE
+
+# Dades de la mostra (s'usen si |generate_random| és FALSE)
+input = data.frame(
+  value = seq(0, 29),
+  freq = c(0, 0, 2, 5, 11, 34, 68, 77, 139, 152, 192, 211, 190, 170, 170, 155, 109, 98, 69, 59, 31, 23, 20, 6, 3, 1, 1, 2, 2, 0) # Adri
+  #freq = c(4, 26, 60, 85, 155, 177, 186, 197, 213, 202, 148, 123, 116, 74, 58, 55, 40, 31, 11, 11, 5, 11, 2, 6, 2, 1, 1, 0, 0, 0) # Pedro
+  #freq = c(0, 5, 20, 31, 71, 97, 143, 155, 202, 174, 193, 167, 166, 141, 115, 84, 59, 54, 37, 28, 20, 15, 8, 6, 5, 1, 2, 0, 0, 1) # Paula
+)
+
+# Paràmetres de la mostra aleatòria (s'usen si |generate_random| és TRUE)
+random_size = 10
+random_prob = 0.3
+random_n = 2000
+
+# == Adri ==
+# Probabilitat de la regió de predicció de la pregunta 11:
+prob_11 = 0.99
+
+# Paràmetres a, b i r de l'apartat c:
+a_c = -0.3
+b_c = -0.5
+r_c = 43
+
+# == Pedro ==
+# Probabilitat de la regió de predicció de la pregunta 11:
+#prob_11 = 0.95
+
+# Paràmetres a, b i r de l'apartat c:
+#a_c = 0.3
+#b_c = 2
+#r_c = 7
+
+# == Paula ==
+# Probabilitat de la regió de predicció de la pregunta 11:
+#prob_11 = 0.9
+
+# Paràmetres a, b i r de l'apartat c:
+#a_c = 0.2
+#b_c = 0.8
+#r_c = 15
+```
+
+```{r}
+if (generate_random == FALSE) {
+  dd = data.frame(
+    v = rep(input$value, input$freq)
+  )
+} else {
+  dd = data.frame(
+    v = rnbinom(random_n, size=random_size, prob=random_prob)
+  )
+}
+```
+
+Comprovació (el valor hauria de ser igual al del full de l'entregable): <ch>$\sum_{i=1}^{29} X^2 = `r format(sum(dd$v^2), scientific = FALSE)`$</ch>
+
+## Apartat a)
+**Estimeu pel mètode dels moments els paràmetres $p$ i $r$, utilitzant els dos primers moments. Per veure si l'estimació ajusta bé, dibuixeu i compareu la funció de distribució estimada $f_{mm}(x)$ amb l'empírica $F_{fr}(x)$ i contesteu les preguntes següents:**
+
+Els moments teòrics són:
+
+$$\begin{cases}
+  \mu_1 = \mathbb{E}[X] = \frac{r(1 - p)}{p} \\
+  \mu_2 = \mathbb{E}[X^2] = \mathbb{E}[X]^2 + Var(X) = \left( \frac{r(1 - p)}{p} \right)^2 + \frac{r(1 - p)}{p^2}
+\end{cases}$$
+
+Pel mètode dels moments, igualem els moments mostrals i teòrics:
+
+$$\begin{cases}
+  \hat{\mu}_1 = \frac{r(1 - p)}{p} \\
+  \hat{\mu}_2 = \left( \frac{r(1 - p)}{p} \right)^2 + \frac{r(1 - p)}{p^2} = \hat{\mu}_1^2 + \frac{\hat{\mu}_1}{p}
+\end{cases}$$
+
+De la segona equació podem aïllar $p$ i trobem:
+
+$$\hat{p}_{mm} = \frac{\hat{\mu}_1^2}{\hat{\mu}_2 - \hat{\mu}_1^2}$$
+
+Després substituim aquest resultat a la primera equació, i aïllant $r$ trobem que:
+
+$$\hat{r}_{mm} = \frac{\hat{\mu}_1^2}{\hat{\mu}_2 - \hat{\mu}_1^2 - \hat{\mu}_1}$$
+
+### Pregunta 1
+El valor estimat de $p$ és:
+
+```{r}
+mu1 = mean(dd$v)
+#mu2 = mean(dd$v)^2 + var(dd$v) # WRONG
+mu2 = sum(dd$v^2)/length(dd$v)
+pmm = mu1/(mu2 - mu1^2)
+pmm
+```
+
+### Pregunta 2
+El valor estimat de $r$ és:
+
+```{r}
+rmm = mu1^2/(mu2 - mu1^2 - mu1)
+rmm
+```
+
+### Pregunta 3
+El valor estimat de $\mathbb{E}[X]$ és:
+```{r}
+mu1
+```
+
+### Pregunta 4
+El valor estimat de $Var(X)$ és:
+```{r}
+# Although we could also calculate varx as |mu2 - mu1^2|, it is much cleaner to
+# do it this way
+#varx = var(dd$v) # WRONG
+#varx
+mu2 - mu1^2
+```
+
+### Pregunta 5
+El valor de $\max(|F_{mm}(x) - F_{fr}(x)|)$ és:
+
+```{r}
+pemp_x = function(x) {
+  return(pemp(x, dd$v, discrete=TRUE))
+}
+
+pnbinom_a = function(x) {
+  return(pnbinom(x, size=rmm, prob=pmm))
+}
+
+graph_max = max(dd$v) + 5
+
+curve(pemp_x, col="red", from=0, to=graph_max, n=3333)
+curve(pnbinom_a, col="blue", from=0, to=graph_max, n=3333, add=T)
+legend(1, 1, legend=c("pemp(x)", "pnbinom_mm(x)"), col=c("red", "blue"), lty=c(1, 1))
+```
+
+```{r}
+curve(abs(pemp_x(x) - pnbinom_a(x)), from=0, to=graph_max, ylab="abs(pemp(x) - pnbinom_mm(x))", n=3333)
+xeq = seq(-1, graph_max, 0.5)
+max(abs(pemp_x(xeq) - pnbinom_a(xeq)))
+```
+
+## Apartat b)
+**Estimeu pel mètode de la màxima versemblança els paràmetres $p$ i $r$. Per veure si l'estimació s'ajusta bé, dibuixeu i compareu la funció de distribució estimada $F_mm(x)$ amb l'empírica $F_{fr}(x)$ i contesteu les preguntes següents:**
+
+La funció de probabilitat de la distribució binomial negativa és:
+
+$$P(X = x) = \binom{r + x - 1}{x} p^r (1 - p)^x$$
+
+Per tant, la funció de versemblança és:
+
+$$L(p, r) \equiv L(p, r | \underset{\sim}{X}) = \prod_{i=1}^n \frac{\Gamma(r + x_i)}{\Gamma(r) \, x_i!} p^r (1 - p)^{x_i}$$
+
+L'estimador de màxima versemblança és el que maximitza $L(p, r)$, i ho fa si i només si maximitza la funció de log-versemblança:
+
+$$l(p, r) := \log(L(p, r)) = \sum_{i = 1}^n \left[ \log(\Gamma(r + x_i)) - \log(\Gamma(r)) - \log(x_i!) + r \log(p) + x_i \log(1 - p) \right]$$
+
+Si derivem la funció de la log-versemblança i igualem les derivades a 0 per trobar màxims o mínims locals, trobem les següents equacions:
+
+$$\begin{cases}
+  \displaystyle 0 = \frac{\partial l}{\partial r} = \sum_{i = 1}^n \psi(r + x_i) + n (\log(p) - \psi(r)) \\
+  \displaystyle 0 = \frac{\partial l}{\partial p} = n \left( \frac{r}{p} - \frac{\bar{X}}{1 - p} \right) \\
+\end{cases}$$
+
+on $\psi(x) = \frac{\partial}{\partial x} \log(\Gamma(x))$ és la funció digamma.
+
+Reordenant la segona equació tenim:
+
+$$p = \frac{r}{\bar{X} + r}$$
+
+I si substituïm aquesta darrera expressió a la primera equació, obtenim:
+
+$$0 = \sum_{i = 1}^n \psi(r + x_i) + n \left( \log\left( \frac{r}{\bar{X} + r} \right) - \psi(r) \right) =: F(r)$$
+
+Aquí hem seguit el procediment conegut com a "profiling": trobar la solució explícita per un dels paràmetres en funció dels altres, i substituir aquesta expressió a les altres equacions per rebaixar la dimensió.
+
+Com ens ha quedat una equació amb una incògnita, trobarem els zeros d'aquesta darrera funció per tal de trobar el valor de $r$, i mitjançant l'anterior expressió trobarem el valor de $p$.
+
+La gràfica de la funció anterior $F(r)$ és:
+
+```{r}
+fr_scalar = function (r, x) {
+  return(sum(psigamma(x + r)) + length(x)*(log(r/(mean(x) + r)) - psigamma(r)))
+}
+
+fr_list = function (r, x) {
+  val = lapply(r, fr_scalar, x)
+  return(val)
+}
+
+x_l = seq(0.01, 300, length.out=3333)
+y_l = fr_list(x_l, dd$v)
+
+plot(x_l, y_l, xlim=c(0.01, 125), ylim=c(-2, 2), ylab="F(r | x)", type="l")
+```
+
+### Pregunta 6
+El valor estimat de $p$ és:
+
+```{r}
+fr_uniparametric = function (r) {
+  return(fr_scalar(r, dd$v))
+}
+
+r_ml_result = uniroot(fr_uniparametric, lower=0.01, upper=1e5, tol=1e-10)
+r_ml = r_ml_result$root
+p_ml = r_ml/(mu1 + r_ml)
+p_ml
+```
+
+### Pregunta 7
+El valor estimat de $r$ és:
+
+```{r}
+r_ml
+```
+
+<span style="color: #aaa;">L'error estimat és de `r r_ml_result$estim.prec`</span>
+
+### Pregunta 8
+El valor estimat de $\mathbb{E}(X)$ és:
+```{r}
+mu1_ml = (r_ml*(1 - p_ml))/p_ml
+mu1_ml
+```
+
+### Pregunta 9
+El valor estimat de $Var(X)$ és:
+
+```{r}
+var_ml = (r_ml*(1 - p_ml))/(p_ml^2)
+var_ml
+```
+
+### Pregunta 10
+El valor de $\max(|F_{mv}(x) - F_{fr}(x)|)$ és:
+
+```{r}
+# |pemp_x| definida a la pregunta 5
+
+pnbinom_b = function(x) {
+  return(pnbinom(x, size=r_ml, prob=p_ml))
+}
+
+curve(pemp_x, col="red", from=0, to=graph_max, n=3333)
+curve(pnbinom_b, col="blue", from=0, to=graph_max, n=3333, add=T)
+legend(1, 1, legend=c("pemp(x)", "pnbinom_ml(x)"), col=c("red", "blue"), lty=c(1, 1))
+```
+
+```{r}
+curve(abs(pemp_x(x) - pnbinom_b(x)), from=0, to=graph_max, ylab="abs(pemp(x) - pnbinom_ml(x))", n=3333)
+# |xeq| definida a la pregunta 5
+max(abs(pemp_x(xeq) - pnbinom_b(xeq)))
+```
+
+### Pregunta 11
+Assumint que els valors dels paràmetres de $X$ fossin els valors estimats per màxima versemblança, trobeu $[a, b]$, la regió de predicció de $X$ (amb probabilitat ≥ <ch>`r prob_11`</ch> i dues cues equiprobables):
+
+**Resolució:**
+
+Volum una regió central amb probabilitat més gran o igual a `r prob_11` i per tant dues cues amb probabilitat menor o igual a $\alpha := \frac{1 - `r prob_11`}{2}$. A més a més, volem que les cues siguin el més gran possibles dins del rang de probabilitats que poden prendre.
+
+```{r}
+alpha_11 = (1-prob_11)/2
+#a_11 = qnbinom(alpha_11, size=r_ml, prob=p_ml) + 1
+
+a_prov = -1
+for (i in 0:10000) {
+  if (pnbinom(i, size=r_ml, prob=p_ml) <= alpha_11) {
+    a_prov = i + 1
+  } else {
+    break
+  }
+}
+a_11 = a_prov
+b_11 = qnbinom(1 - alpha_11, size=r_ml, prob=p_ml)
+```
+
+> $[`r a_11`, `r b_11`]$
+
+### Pregunta 12
+De la regió de l'apartat 11) calculeu $Pr(X \in [a, b])$:
+
+```{r}
+p_12 = pnbinom(b_11, size=r_ml, prob=p_ml) - pnbinom(a_11 - 1, size=r_ml, prob=p_ml)
+p_12
+```
+
+
+## Apartat c)
+**En el supòsit que considerem que $p$ és una v.a. amb funció de densitat proporcional a $f(p) \propto p^a (1 - p)^b$, amb <ch>$a = `r a_c`$</ch> i <ch>$b = `r b_c`$</ch> amb el valor de $r$ conegut i igual a <ch>$`r r_c`$</ch>. Un cop coneguda la vostra mostra, calculeu la funció de densitat a posteriori de $p$, dibuixeu-la i contesteu les preguntes següents:**
+
+### Pregunta 13
+L'esperança de la distribució a posteriori de $p$ és:
+
+```{r}
+# Paràmetres de la distribució a posteriori:
+alpha_post = a_c + length(dd$v)*r_c + 1
+beta_post = b_c + length(dd$v)*mean(dd$v) + 1
+
+esp_13 = (alpha_post)/(alpha_post + beta_post)
+esp_13
+```
+
+### Pregunta 14
+La variància de la distribució a posteriori de $p$ és:
+
+```{r}
+var_14 = (alpha_post*beta_post)/((alpha_post + beta_post)^2*(alpha_post + beta_post + 1))
+var_14
+```
+
+### Pregunta 15
+A posteriori, l'esperança de $X$ és:
+
+```{r}
+esp_15 = r_c*beta_post/(alpha_post - 1)
+esp_15
+```
+
+### Pregunta 16
+A posteriori, la variància de $X$ és:
+
+```{r}
+#var_16 = r_c*(r_c + 1)*(alpha_post + beta_post - 1)*beta_post/((alpha_post - 1)*(alpha_post - 2)) - esp_15^2
+#var_16
+
+r_c*(alpha_post + beta_post - 1)*beta_post/((alpha_post - 1)*(alpha_post - 2)) + r_c^2*beta_post*(beta_post + 1)/((alpha_post - 1)*(alpha_post - 2)) - r_c^2*beta_post^2/((alpha_post - 1)^2)
+```
+
+<!-- Custom styles -->
+<style>
+/* ch element (|ch| stands for check) */
+ch {
+  color: red;
+}
+</style>
