#en el modelado tengo tres respuestas, en 10 trt, cual incentiva mas el crc de las bacterias?
#Hacer el analisis hipotesis x H2 x H3 X H4, suele estar mal hacer el analisis variable x variable
#Cargar datos de papa
library(readxl)
Datos_papa <- read_excel("C:/2024/Semestre III/Metodos Multivariados/Datos_papa.xlsx")
df=Datos_papa
#vamos a hacer una matrix de correlaciones, para entender xk el analisis debe ser covariado
library(corrplot)
## corrplot 0.92 loaded
cl = cor(df[ ,1:3]) #una coma con espacio vacio antes, en el data.frame tengo filas y columnas, si quiero leer todas las filas, dejo el espacio vacio, pero lease las columnas 1 a 3, la 4 son los trt
corrplot(cl, method = "n",
         number.cex = 3)

library(ggplot2)
ggplot(df, aes(x = LR, y = VR))+
  geom_point()+
  geom_boxplot(aes(fill = trt))

ggplot(df, aes(x = LR, y = PSR))+
  geom_point()+
  geom_boxplot(aes(fill = trt))

ggplot(df, aes(x = VR, y = PSR))+
  geom_point()+
  geom_boxplot(aes(fill = trt))

#relacionamos volumen y largo de raiz, y se ve una tendencia entre los puntos, es posible que tenga correlaciones
#el control se me puede dibujar en otra zona, mostrando que este se porto mas malito
#en el grafico de PSR x VR el largo de raices puede estar en el ancho de las cajas
#hagamos la nube de puntos
library(rgl)
cols=c("brown","red","blue","coral1", "green", "black", "cyan", "yellow","deeppink", "orange")

col = cols[as.factor(df$trt)]
legend3d("topright",
         legend = unique(df$trt), pch=19,
         col=cols[as.factor(unique(df$trt))], 
         cex=0.9, inset=c(0.03))
plot3d(df$LR ,df$VR ,df$PSR, type="s",
       col=col, radius = .1, data=df,
       size = 10)
#descripcion de la estadistica de los datos
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
psych::describeBy(x = df[ , 1:3],
                  group = df$trt)
## 
##  Descriptive statistics by group 
## group: BC
##     vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis
## LR     1 12 29.27 1.83  29.67   29.31 1.27 26.03 32.09  6.07 -0.46    -0.97
## VR     2 12  5.89 0.94   6.02    5.90 0.94  4.32  7.34  3.02 -0.29    -1.20
## PSR    3 12  5.23 1.02   5.34    5.29 1.14  3.33  6.47  3.13 -0.53    -1.12
##       se
## LR  0.53
## VR  0.27
## PSR 0.29
## ------------------------------------------------------------ 
## group: BM
##     vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis
## LR     1 12 31.49 2.04  32.07   31.71 1.67 26.69 34.07  7.39 -0.89     0.01
## VR     2 12  6.00 0.75   6.00    6.04 0.53  4.48  7.20  2.71 -0.25    -0.65
## PSR    3 12  5.52 0.89   5.75    5.51 0.29  3.88  7.19  3.31 -0.35    -0.32
##       se
## LR  0.59
## VR  0.22
## PSR 0.26
## ------------------------------------------------------------ 
## group: BMM
##     vars  n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
## LR     1 12 31.18 1.26  31.04   31.17 0.85 28.64 33.74  5.10 0.09    -0.07 0.36
## VR     2 12  5.88 0.56   5.79    5.88 0.47  4.87  6.93  2.06 0.24    -0.61 0.16
## PSR    3 12  5.04 0.91   4.96    4.94 0.80  3.85  7.22  3.37 0.89     0.21 0.26
## ------------------------------------------------------------ 
## group: EA
##     vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis
## LR     1 12 32.57 1.49  32.80   32.52 1.27 30.31 35.33  5.02  0.07    -0.94
## VR     2 12  6.29 1.07   6.39    6.25 0.91  4.49  8.43  3.94  0.08    -0.57
## PSR    3 12  5.53 1.02   5.87    5.56 1.11  3.78  6.99  3.21 -0.34    -1.29
##       se
## LR  0.43
## VR  0.31
## PSR 0.29
## ------------------------------------------------------------ 
## group: M
##     vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis
## LR     1 12 32.74 0.96  32.88   32.77 1.00 31.06 34.11  3.06 -0.27    -1.30
## VR     2 12  6.48 0.57   6.28    6.44 0.54  5.68  7.62  1.94  0.47    -1.04
## PSR    3 12  6.42 0.82   6.44    6.36 0.68  5.06  8.36  3.30  0.70     0.34
##       se
## LR  0.28
## VR  0.17
## PSR 0.24
## ------------------------------------------------------------ 
## group: MT
##     vars  n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
## LR     1 12 31.79 1.15  31.91   31.73 1.43 30.37 33.78  3.41 0.11    -1.52 0.33
## VR     2 12  6.07 0.58   6.13    6.05 0.62  5.22  7.09  1.88 0.07    -1.28 0.17
## PSR    3 12  5.78 0.79   5.73    5.76 0.37  4.34  7.39  3.06 0.22    -0.30 0.23
## ------------------------------------------------------------ 
## group: OS
##     vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis
## LR     1 12 32.47 1.30  32.74   32.62 1.41 29.65 33.81  4.16 -0.73    -0.65
## VR     2 12  6.22 0.67   6.32    6.19 0.62  5.31  7.41  2.11  0.00    -1.29
## PSR    3 12  5.48 0.80   5.44    5.43 0.56  4.26  7.18  2.92  0.47    -0.49
##       se
## LR  0.37
## VR  0.19
## PSR 0.23
## ------------------------------------------------------------ 
## group: PF
##     vars  n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
## LR     1 12 29.16 1.23  29.45   29.11 0.41 26.82 31.97  5.14 0.33     0.38 0.36
## VR     2 12  6.00 0.67   5.91    5.94 0.57  5.13  7.44  2.30 0.63    -0.57 0.19
## PSR    3 12  5.23 0.74   5.14    5.23 0.88  3.93  6.56  2.62 0.01    -1.02 0.21
## ------------------------------------------------------------ 
## group: PFM
##     vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis
## LR     1 12 28.86 1.56  28.26   28.73 0.85 26.77 32.18  5.41  0.69    -0.73
## VR     2 12  6.07 0.54   6.17    6.10 0.60  5.07  6.79  1.73 -0.40    -1.21
## PSR    3 12  5.08 0.65   4.93    5.08 0.74  4.14  5.98  1.83  0.13    -1.58
##       se
## LR  0.45
## VR  0.16
## PSR 0.19
## ------------------------------------------------------------ 
## group: T0
##     vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis
## LR     1 12 22.13 0.92  22.11   22.12 1.24 20.85 23.56  2.71  0.15    -1.59
## VR     2 12  5.07 0.61   5.11    5.07 0.70  4.06  6.12  2.06  0.02    -1.19
## PSR    3 12  4.90 0.79   5.17    4.95 0.50  3.38  5.90  2.53 -0.73    -0.89
##       se
## LR  0.26
## VR  0.18
## PSR 0.23
#esta la estadistica por cada trt
#Kurtosis, 
#medidas de dispersión, desviacion estadar, media, rango
#localizacion: min, max, cuartiles, percentiles
#forma: forma de la curva: kurtosis y simetria, 
#skew, simetria, hasta que punto tengo datos simetricos, que es lo normal
##meso curtica, planicurtica, platicurtica 
#libreria de datos
library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## ################################### WARNING ###################################
## # We noticed you have dplyr installed. The dplyr lag() function breaks how    #
## # base R's lag() function is supposed to work, which breaks lag(my_xts).      #
## #                                                                             #
## # Calls to lag(my_xts) that you enter or source() into this session won't     #
## # work correctly.                                                             #
## #                                                                             #
## # All package code is unaffected because it is protected by the R namespace   #
## # mechanism.                                                                  #
## #                                                                             #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## # You can use stats::lag() to make sure you're not using dplyr::lag(), or you #
## # can add conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop   #
## # dplyr from breaking base R's lag() function.                                #
## ################################### WARNING ###################################
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
PerformanceAnalytics::chart.Correlation(R = df[ ,1:3])
## Warning in par(usr): argument 1 does not name a graphical parameter

## Warning in par(usr): argument 1 does not name a graphical parameter

## Warning in par(usr): argument 1 does not name a graphical parameter

##grafica 1 pareciera ser bimodal, la grafica de la mitad se ve normal
#el grafico me dice que es evidente que las variables estan relacionadas
#aunque se observa la normalidad de VR, debo hacer analisis multivariado
#PERO ESTAS GRAFICAS ME ESTAN AGRUPANDO DATOS DE LOS 10 TRT, aca veo el comportamiento de todos los datos
#Si hubiese hecho los graficos por trt, tengo un problema, solo 12 resultados por trt, tengo poca exactitud
#
#trt por color
plot(df$LR, df$VR, pch = 16,
     col = as.factor(df$trt))

#veo colores en sitios diferentes, se diferencia el control a la izq, una agrupacion entre negro y gris, y los demás a la derecha
#tendría 3 trt, o agrupación
#hagamoslos en las otras variables
plot(df$PSR, df$VR, pch = 16,
     col = as.factor(df$trt))

#aca no se ve separacion de control

plot(df$LR, df$PSR, pch = 16,
     col = as.factor(df$trt))

#aca vuelven a verse 3 trt (3 xk los agrupe)
#hagamos un pipe 
#partirme por trt
df |> 
  group_by(trt) |>
  summarise(Media_LR = mean(LR),
            Desv_LR = sd(LR),
            CV_LR = Desv_LR/Media_LR, 
            Media_VR = mean(VR),
            Desv_VR = sd(VR),
            CV_VR = Desv_VR/Media_VR,
            Media_PSR = mean(PSR),
            Desv_PSR = sd(PSR),
            CV_PSR = Desv_PSR/Media_PSR) 
## # A tibble: 10 × 10
##    trt   Media_LR Desv_LR  CV_LR Media_VR Desv_VR  CV_VR Media_PSR Desv_PSR
##    <chr>    <dbl>   <dbl>  <dbl>    <dbl>   <dbl>  <dbl>     <dbl>    <dbl>
##  1 BC        29.3   1.83  0.0624     5.89   0.945 0.160       5.23    1.02 
##  2 BM        31.5   2.04  0.0646     6.00   0.748 0.125       5.52    0.891
##  3 BMM       31.2   1.26  0.0405     5.88   0.560 0.0953      5.04    0.908
##  4 EA        32.6   1.49  0.0459     6.29   1.07  0.170       5.53    1.02 
##  5 M         32.7   0.964 0.0295     6.48   0.573 0.0885      6.42    0.822
##  6 MT        31.8   1.15  0.0362     6.07   0.577 0.0952      5.78    0.795
##  7 OS        32.5   1.30  0.0400     6.22   0.666 0.107       5.48    0.805
##  8 PF        29.2   1.23  0.0423     6.00   0.670 0.112       5.23    0.744
##  9 PFM       28.9   1.56  0.0541     6.07   0.537 0.0884      5.08    0.651
## 10 T0        22.1   0.916 0.0414     5.07   0.607 0.120       4.90    0.788
## # ℹ 1 more variable: CV_PSR <dbl>
#hagamos la parte descriptiva
#PSR, en micorrizas se lleva los 3 promedios mas altos, pareciera que micorrizas lo induce
#Medir, tabular y 
#1 compenente descriptivo, 2 componente inferencial (de analisis)

Modelo \[Y_{ij} = \mu + \tau_i + \epsilon_{ij}\] \[i= 1,...,10\] \[j= 1,...,12\]

Analisis de varianza

#Diseño experimental: Factoral simple en arreglo completamente al azar (no tengo bloques)
#modelo si hago el analisis variable por variable - barra inversa\ - 
#Modelo Largo raices
mod_LR = aov(formula = LR ~ trt, data = df)
summary(mod_LR)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## trt           9 1093.8   121.5   60.63 <2e-16 ***
## Residuals   110  220.5     2.0                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#el largo de las raices, es funcion de los tratamientos, esto se hace con virgulilla
#Analisis de varianza alt 126
#en la tabla anterior, hubo alta significancia, P= 2x10 a la -16, esto se aproxima a 0 xk es el numero mas bajito de R, deberiamos ponerlo similar o igual a 0
#rechazo H0, pero error, tengo 3 hipotesis, entonces el valor P ya no es 0.05
#este ANOVA me dice que rechazo, entonces al menos 1 de los valores es diferente
#Ahora cambio de variable, lo llamo modelo 2 (VR) y lo corro
mod_VR = aov(formula = VR ~ trt, data = df)
summary(mod_VR)
##              Df Sum Sq Mean Sq F value  Pr(>F)   
## trt           9  15.11  1.6786   3.277 0.00143 **
## Residuals   110  56.34  0.5122                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
mod_PSR = aov(formula = PSR ~ trt, data = df)
summary(mod_PSR)
##              Df Sum Sq Mean Sq F value  Pr(>F)   
## trt           9  21.12   2.346   3.241 0.00158 **
## Residuals   110  79.64   0.724                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#En los 3 modelos parece que los trt difieren, pero no sabemos quien es el diferente
#estoy omitiendo las correlaciones
#estoy omitiendo el p valor ajustado por la relacion entre variables
#supuestos de normalidad
#metodo parametrico que poco se enseña: kruskal wallis
#prueba shapiro-wilks
shapiro.test(mod_LR$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod_LR$residuals
## W = 0.98599, p-value = 0.2515
shapiro.test(mod_VR$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod_VR$residuals
## W = 0.99371, p-value = 0.87
shapiro.test(mod_PSR$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod_PSR$residuals
## W = 0.99061, p-value = 0.5896
#la diferencia entre lo ajustado (proyectado vs real?) es el residual
#las tres variables ya casi son normales... PEEEERO la normalidad variable por variable no garantizar que sea normal, pero tengo que evaluarlo trivariantemente
#si hay normalidad variable x variable, no significa que la normalidad bivariante o trivariante tmbn lo sea
#bivariante, la grafica parece una espinilla, trivariante ya ni se puede graficar
#otro supuesto, homostacilidad, que los trt tengan la misma variabilidad
#hagamos un boxplot 
#prueba de Homocedasticidad, igualdad de varianza
boxplot(LR ~ trt, df)

#si las varianzas no son iguales?
#comparo las medias, pero la varianza de uno es 5 veces mas grande que la otra, 
#me significa que las varianzas son desiguales, las medias no son comparables
#si varia mucho, ni siquiera puedo creer en su promedio, ni los puedo comparar
#si quiero comparar, debo iniciar con condiciones inicales
#estas grandes varianzas, las estandarizo, penalizo, se hacen promedios ponderados, se ajusta para que haya razonabilidad en las comparaciones
#dos dupuestos que se volvieron costumbre: normalidad y analisis de varianza
#tmbn el efecto borde me daña mi estadsitica: poligonos de Voronoi o teselacion: se generan datos virtuales para completar 1 a 1 dato y poder graficar o comparar, pero hay mucho error aqui
#test de barlet para verificar homocedasticidad
bartlett.test(df$LR, df$trt)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  df$LR and df$trt
## Bartlett's K-squared = 12.677, df = 9, p-value = 0.1778
bartlett.test(df$VR, df$trt)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  df$VR and df$trt
## Bartlett's K-squared = 11.685, df = 9, p-value = 0.2316
bartlett.test(df$PSR, df$trt)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  df$PSR and df$trt
## Bartlett's K-squared = 3.6044, df = 9, p-value = 0.9355
#errores de la estadistica, hacer analisis por separado
#varianzas VR 0.2 varianzas iguales, PSR 0.9 o 90% 
#entonces alguien normalmente diria que hay poca o alta homocedasticidad haría lo siguiente para encontrar que trt difiere
#libreria mulcom, es para deterctar la diferencia
####el siguiente codigo no se pudo correr
#par(mai=c(1,1,1.25,1))
#library(multcomp)
#df.aov1 = aov (LR ~ as.factor(trt), df)
#tukey1 = glht(df.aov1, linfct = mcp(trt="Tukey"))
#cld(tukey1)
#plot(cld(tukey1))
####se retoma desde aca
s = TukeyHSD(mod_LR)
plot(s, las = 2)

#se tiene una linea continua que es mi linea 0, los intervalos que esten en esta linea, no difieren entre si
library(agricolae)
## 
## Attaching package: 'agricolae'
## The following objects are masked from 'package:PerformanceAnalytics':
## 
##     kurtosis, skewness
out_LR = duncan.test(mod_LR, "trt")
plot(out_LR, variation = "IQR")

out_VR = duncan.test(mod_VR, "trt")
plot(out_VR, variation = "IQR")

out_PSR = duncan.test(mod_PSR, "trt")
plot(out_PSR, variation = "IQR")

#Segun estas graficas, hay varios grupos
#Aca finaliza en enfoque univariado, el que solemos hacer por tradicion, el que no deberiamos hacer
#Multivariado
#analisis de varianza multivariante:MANOVA
#sitioweb para codigo en R: chatgpt y quick-R
Y = cbind(df$LR, df$VR, df$PSR) #meter en una variable todo, en este caso, las 3 variables
modelo = manova(Y ~ df$trt)
summary(modelo, test="Wilks")
##            Df    Wilks approx F num Df den Df    Pr(>F)    
## df$trt      9 0.086679   15.338     27 316.06 < 2.2e-16 ***
## Residuals 110                                              
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#aca el valor p me rechaza la igualdada de trt en todas las variables, dado p = 2x10 a la -16
#lo que se es que los trt difieren para las 3
#si tuviera mas variables, puedo poner aqui modelo = manova(Y ~ df$trt) + factor + factor para que me tome los cultivos o genotipos
#si aparece un error de singular, me esta diciendo que tengo combiancion lineal de mis variables, por ejemplo:
#metí arena, arcilla y limo, si la suma es 100, si tengo dos, la tercera sale por diferencia
##una variable es la otra multiplicado por una constante
#si el determinante me da 0, no se puede invertir... 
#singularidad, tenemos variables que sobran o no estan aportando
#PARENTESIS MOSTRAR SINGULARIDAD (ESTO NO SE PUEDE CORRER, SON EJEMPLOS DE COMO R DETECTA SINGULARIDAD Y NO FUNCIONA, LO PONGO EN ###)
#ml = matrix(c( 1, -1, 3, 2, -2, 6, 7, 5, 1),
#            nrow = 3, ncol = 3, byrow = F )
#det(ml)
#solve(ml)
#la segunda columna es la primera multiplicada x 2
#PARENTESIS MOSTRAR SINGULARIDAD
#ml = matrix(c( 1, -1, 3, 8, 4, 4, 7, 5, 1), 
#            nrow = 3, ncol = 3, byrow = F )
#det(ml)
#solve(ml)
#la segunda columna es la primera multiplicada x 2 #ejemplo arena arcilla limo
#tiene singularidad, no se puede resolver el problema
#hagamos prueba de normalidad multivariante
library(mvnTest)
## Loading required package: mvtnorm
mvnTest::R.test(df[ ,1:3]) 
##             Royston test for Multivariate Normality 
## 
##   data : df[, 1:3] 
## 
##   R               : 32.69715 
##   p-value         : 3.361028e-07 
## 
##   Result  : Data are not multivariate normal (sig.level = 0.05)
#este p valor me dice que no hay normalidad en mis variables, y aca a llorar al monte? tenemos prueba

\[H_0: \Sigma_0 = \Sigma_1 = \dots = \Sigma...{10}\]

#homogenidad de covarianzas
library(biotools)
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
## ---
## biotools version 4.2
boxM(df[ , 1:3], df$trt)
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  df[, 1:3]
## Chi-Sq (approx.) = 46.713, df = 54, p-value = 0.7487
#cumpli las varianzas (P = 0.74), pero no la normalidad
#no deberia ponerme a mirar los datos para ver como arreglo mi normalidad
#dejé el tiempo de germinación por fuera, estoy grave con la normalidad, ajustemos los datos a ver si con la covariable me sirva, probemos
df$t_germ = round(sort(rnorm(n = 120, mean = 20, sd =5)))
#tiempo de germinación
#ANALISIS DE COVARIANZA UNIVARIANTE/MULTIVARIANTE
#correr un modelo involucrando la germinacion
mod_co_LR = aov(df$LR ~ df$t_germ + df$trt)
summary(mod_co_LR)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## df$t_germ     1  788.6   788.6  402.75 <2e-16 ***
## df$trt        9  312.3    34.7   17.72 <2e-16 ***
## Residuals   109  213.4     2.0                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#no voy a correr tres ancovas, 
#MANCOVA, aca ya metemos germinacion en el modelo
mod_co_LR2 = cbind(df$LR, df$VR, df$PSR) #meter en una variable todo, en este caso, las 3 variables
modelo2 = manova(Y ~ df$t_germ + df$trt)
summary(modelo2, test="Wilks")
##            Df   Wilks approx F num Df den Df    Pr(>F)    
## df$t_germ   1 0.14923  203.343      3 107.00 < 2.2e-16 ***
## df$trt      9 0.23619    7.412     27 313.14 < 2.2e-16 ***
## Residuals 109                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#acostumbremonos primero a tener las covariables y luego los factores
#probemos la normalidad
#se le prueba a las variables o a los residuales? es a los RESIDUALES
#Extraemos los residuales y le hacemos la prueba de normalidad
#xk los residuales... complementar con el audio

mod_co_LR = cbind(df$LR,df$VR,df$PSR)
modelo <- manova(Y ~ df$t_germ + df$trt  )
summary(modelo, test="Wilks")
##            Df   Wilks approx F num Df den Df    Pr(>F)    
## df$t_germ   1 0.14923  203.343      3 107.00 < 2.2e-16 ***
## df$trt      9 0.23619    7.412     27 313.14 < 2.2e-16 ***
## Residuals 109                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#multivariable
mvnTest::R.test(modelo$residuals)
##             Royston test for Multivariate Normality 
## 
##   data : modelo$residuals 
## 
##   R               : 0.7377692 
##   p-value         : 0.8507392 
## 
##   Result  : Data are multivariate normal (sig.level = 0.05)
#p valor = 0.95, los residuales son normales