Ejercicio

Rendimiento en toneladas teniendo como único factor la materia orgánica del suelo

set.seed(123)
data = expand.grid(x=1:10, y=1:10)
data$rto = rnorm(100, 3, 0.3)
data$rto = sort(data$rto) + runif(100, 0 ,0.1)
data$mo = rnorm(100, 2.5, 0.1)
data$mo = sort(data$mo) + runif (100, 0 , 0.1)
library(ggplot2)
library(gridExtra)
Warning: package ‘gridExtra’ was built under R version 4.2.3
g1 = ggplot(data)+
  aes(x,y, fill=rto)+
  geom_tile()

g2 = ggplot(data)+
  aes(x,y, fill=mo)+
  geom_tile()

gridExtra::grid.arrange(g1, g2, nrow=1)

ANALISIS DE REGRESIÓN LINEAL SIMPLE

Scatter o diagrama de puntos para familiarizarse con el ejercicio (nube de puntos)

plot(x = data$mo, y = data$rto, pch = 16)

Buscar la ecuación de una recta que sea lo más parecida posible a los datos representados en la nube de puntos (menores distancias posibles)

La recta no representa un modelo matemático. El experimento tiene un error intrinseco (el matematico es exacto), por eso se dice que hace referencia a un modelo estadístico.

Modelo objetivo:

\[\hat{y} = \beta_0 + \beta_1x + \epsilon \\\]

\[Y = a + bx + \epsilon_i \\ Y = rendimiento \\ a = i\\ b = p \\ x = H_0 \\ \epsilon_i = error\]

Encontrar el epsilon menor posible. Para ello vamos a realizar los Mínimos cuadrados, con el objetivo de hallar los valores de la ecuación de la recta.

mod1 = lm(rto ~ mo, data)
summary(mod1)

Call:
lm(formula = rto ~ mo, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.34934 -0.05963 -0.00802  0.06565  0.21694 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.47622    0.24748  -14.05   <2e-16 ***
mo           2.56595    0.09685   26.49   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.09624 on 98 degrees of freedom
Multiple R-squared:  0.8775,    Adjusted R-squared:  0.8762 
F-statistic:   702 on 1 and 98 DF,  p-value: < 2.2e-16
plot(data$mo, data$rto, pch=16)
abline(mod1, col='green', lwd=3)

Interpretación de los resultados de summary (mod1)

Intercept estimado \(a\) = -3.47

pendiente \(b\) = 2.56

La pendiente se puede interpretar en este caso como la proporción de aumento del rendimiento por cada punto de aumento de la materia orgánica en el suelo; por cada aumento en 1 de la materia orgánica el rendimiento debería aumentar en 2.57 Toneladas.

\[\widehat{RTO} = -3.48 + 2.57*MO\] Pvalor Pr(>|t|) de mo

En la pendiente (intercept mo) es relevante el valor del p valor <2e-16

Como la pendiente es 2.57 < 0.05 se rechaza la hipótesis nula que dice que la pendiente es 0.

Multiple R-squared: 0.8775, Adjusted R-squared: 0.8762

El 87.62% es que tan real es la relación entre la línea recta planteada y los datos.

70% > es un buen modelo.

Revisión de supuestos

# 1) Normalidad de residuos
#Shapiro Test
#Se espera que los residuos tengan comportamiento normal
shapiro.test(mod1$residuals)

    Shapiro-Wilk normality test

data:  mod1$residuals
W = 0.98357, p-value = 0.2495
#Homosedasticidad u homogeneidad de las varianzas
plot(mod1$residuals, pch=16)

ANALISIS DE COVARIANZA

set.seed(123)
data = expand.grid(x=1:10, y=1:10)
data$rto = rnorm(100, 3, 0.3)
data$rto = sort(data$rto) + runif(100, 0 ,0.1)
data$mo = rnorm(100, 2.5, 0.1)
data$mo = sort(data$mo) + runif (100, 0 , 0.1)


# 4 Tratamientos 4 tipos de preparación para la semilla

data$trt = gl(4, 25, 100, 
              c('s0','sf','si','sfi'))
data

MODELO QUE SE ESPERARÍA

\[y_{ij} = \mu + \tau_i + \epsilon_{ij} \\ y_{ij} = \text{rendimiento} \\ \mu = \text{media global} \\ \tau_i = \text{tratamientos} \\ \epsilon_{ij} = \text{error}\]

MODELO REAL

\[y_{ij} = \mu + \tau_i + \theta(x_{ij} - \bar{x}) + \epsilon_{ij}\] Aparición de la covariable MO, efectos de la materia orgánica sobre el rendimiento, a pesar de estar estudiando los tratamientos.

HIPÓTESIS

\[H_0 : \mu_{s0} = \mu_{sf} = \mu_{si} = \mu_{sfi} \]

#rendimiento como funcion de la covariable
mod2 = aov(rto ~ mo + trt, data)
summary(mod2)
            Df Sum Sq Mean Sq F value   Pr(>F)    
mo           1  6.502   6.502  989.51  < 2e-16 ***
trt          3  0.283   0.094   14.38 8.45e-08 ***
Residuals   95  0.624   0.007                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
boxplot(rto ~ trt, data)

P VALOR MO = 2e-16 2e-16 < 0.05 Por lo tanto se rechaza la hipótesis nula, estadisticamente hay evidencia para determinar que la materia orgánica tiene efecto positivo sobre el rendimiento obtenido en cada una de las parcelas

P VALOR DE LOS TRATAMIENTOS trt 8.45e-08 < 0.05 Por lo tanto se rechaza la hipótesis nula, hay evidencia estadistica para determinar que los tratamientos generan efecto sobre el rendimiento.

REVISIÓN DE SUPUESTOS

#Normalidad
#Shapiro Test
shapiro.test(mod2$residuals)

    Shapiro-Wilk normality test

data:  mod2$residuals
W = 0.96113, p-value = 0.004843
hist(mod2$residuals)

REVISIÓN DE UN POSIBLE DATO ATÍPICO

boxplot(mod2$residuals)

which.min(data$rto)
[1] 1
minimo = data[which.min(data$rto),]
minimo
NA
library(outliers)
#Prueba de Grubbs para determinar si un dato es atípico
grubbs.test(mod2$residuals)

    Grubbs test for one outlier

data:  mod2$residuals
G.1 = 4.36012, U = 0.80603, p-value = 0.0002265
alternative hypothesis: lowest value -0.346216964518421 is an outlier

La prueba nos permite confirmar que ese dato es atípico.

CAMINOS REMEDIALES PARA TRATAR EL DATO ATÍPICO

  1. Imputar
  2. Eliminar
  3. Repetir el experimento para esa parcela
#Media de cada tratamiento
med_trt = tapply(data$rto, data$trt, mean)
med_trt
      s0       sf       si      sfi 
2.740161 2.979286 3.155851 3.427611 
#IMPUTAR
#Sustituir el valor anormal por la media de su grupo

data2 = data
data2$rto[1] = med_trt['s0']
head(data2)
NA
boxplot(rto~ trt, data2)

mod3 = aov(rto ~ mo + trt, data2)
summary(mod3)
            Df Sum Sq Mean Sq F value   Pr(>F)    
mo           1  6.182   6.182 1174.12  < 2e-16 ***
trt          3  0.283   0.094   17.93 2.65e-09 ***
Residuals   95  0.500   0.005                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

NORMALIDAD DE LOS RESIDUALES PARA EL MODELO CON EL DATO IMPUTADO

#Normalidad con dato imputado
# Test de Shapiro
shapiro.test(mod3$residuals)

    Shapiro-Wilk normality test

data:  mod3$residuals
W = 0.98906, p-value = 0.5891
LS0tDQp0aXRsZTogIkRFIG1hcnRlcyAwMiBkZSBtYXlvIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6ICJBbmRyw6lzIEZlbGlwZSBIaW5jYXBpw6kgQ2FzdGHDsWVkYSINCkNsYXNzOiAiQW5hbGlzaXMgZGUgUmVncmVzacOzbiBMaW5lYWwgU2ltcGxlIHkgQW5hbGlzaXMgZGUgQ292YXJpYW56YSINCi0tLQ0KDQoNCg0KIyAqRWplcmNpY2lvKg0KUmVuZGltaWVudG8gZW4gdG9uZWxhZGFzIHRlbmllbmRvIGNvbW8gw7puaWNvIGZhY3RvciBsYSBtYXRlcmlhIG9yZ8OhbmljYSBkZWwgc3VlbG8gDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KZGF0YSA9IGV4cGFuZC5ncmlkKHg9MToxMCwgeT0xOjEwKQ0KZGF0YSRydG8gPSBybm9ybSgxMDAsIDMsIDAuMykNCmRhdGEkcnRvID0gc29ydChkYXRhJHJ0bykgKyBydW5pZigxMDAsIDAgLDAuMSkNCmRhdGEkbW8gPSBybm9ybSgxMDAsIDIuNSwgMC4xKQ0KZGF0YSRtbyA9IHNvcnQoZGF0YSRtbykgKyBydW5pZiAoMTAwLCAwICwgMC4xKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpgYGANCmBgYHtyfQ0KZzEgPSBnZ3Bsb3QoZGF0YSkrDQogIGFlcyh4LHksIGZpbGw9cnRvKSsNCiAgZ2VvbV90aWxlKCkNCg0KZzIgPSBnZ3Bsb3QoZGF0YSkrDQogIGFlcyh4LHksIGZpbGw9bW8pKw0KICBnZW9tX3RpbGUoKQ0KDQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMSwgZzIsIG5yb3c9MSkNCmBgYA0KDQojIEFOQUxJU0lTIERFIFJFR1JFU0nDk04gTElORUFMIFNJTVBMRQ0KDQpTY2F0dGVyIG8gZGlhZ3JhbWEgZGUgcHVudG9zIHBhcmEgZmFtaWxpYXJpemFyc2UgY29uIGVsIGVqZXJjaWNpbyAobnViZSBkZSBwdW50b3MpDQoNCmBgYHtyfQ0KcGxvdCh4ID0gZGF0YSRtbywgeSA9IGRhdGEkcnRvLCBwY2ggPSAxNikNCmBgYA0KDQpCdXNjYXIgbGEgZWN1YWNpw7NuIGRlIHVuYSByZWN0YSBxdWUgc2VhIGxvIG3DoXMgcGFyZWNpZGEgcG9zaWJsZSBhIGxvcyBkYXRvcyByZXByZXNlbnRhZG9zIGVuIGxhIG51YmUgZGUgcHVudG9zIChtZW5vcmVzIGRpc3RhbmNpYXMgcG9zaWJsZXMpDQoNCkxhIHJlY3RhIG5vIHJlcHJlc2VudGEgdW4gbW9kZWxvIG1hdGVtw6F0aWNvLiBFbCBleHBlcmltZW50byB0aWVuZSB1biBlcnJvciBpbnRyaW5zZWNvIChlbCBtYXRlbWF0aWNvIGVzIGV4YWN0byksIHBvciBlc28gc2UgZGljZSBxdWUgaGFjZSByZWZlcmVuY2lhIGEgdW4gbW9kZWxvIGVzdGFkw61zdGljby4NCg0KDQojIE1vZGVsbyBvYmpldGl2bzoNCg0KJCRcaGF0e3l9ID0gXGJldGFfMCArIFxiZXRhXzF4ICsgXGVwc2lsb24gXFwkJA0KDQokJFkgPSBhICsgYnggKyBcZXBzaWxvbl9pIFxcDQpZID0gcmVuZGltaWVudG8gXFwNCmEgPSBpXFwNCmIgPSBwIFxcDQp4ID0gSF8wIFxcDQpcZXBzaWxvbl9pID0gZXJyb3IkJA0KDQoNCg0KRW5jb250cmFyIGVsIGVwc2lsb24gbWVub3IgcG9zaWJsZS4NClBhcmEgZWxsbyB2YW1vcyBhIHJlYWxpemFyIGxvcyAqTcOtbmltb3MgY3VhZHJhZG9zKiwgY29uIGVsIG9iamV0aXZvIGRlIGhhbGxhciBsb3MgdmFsb3JlcyBkZSBsYSBlY3VhY2nDs24gZGUgbGEgcmVjdGEuDQoNCg0KDQpgYGB7cn0NCm1vZDEgPSBsbShydG8gfiBtbywgZGF0YSkNCnN1bW1hcnkobW9kMSkNCg0KYGBgDQpgYGB7cn0NCnBsb3QoZGF0YSRtbywgZGF0YSRydG8sIHBjaD0xNikNCmFibGluZShtb2QxLCBjb2w9J2dyZWVuJywgbHdkPTMpDQpgYGANCg0KIyBJbnRlcnByZXRhY2nDs24gZGUgbG9zIHJlc3VsdGFkb3MgZGUgc3VtbWFyeSAobW9kMSkNCg0KSW50ZXJjZXB0IGVzdGltYWRvICRhJCA9IC0zLjQ3DQoNCnBlbmRpZW50ZSAkYiQgPSAyLjU2DQoNCg0KTGEgcGVuZGllbnRlIHNlIHB1ZWRlIGludGVycHJldGFyIGVuIGVzdGUgY2FzbyBjb21vIGxhIHByb3BvcmNpw7NuIGRlIGF1bWVudG8gZGVsIHJlbmRpbWllbnRvIHBvciBjYWRhIHB1bnRvIGRlIGF1bWVudG8gZGUgbGEgbWF0ZXJpYSBvcmfDoW5pY2EgZW4gZWwgc3VlbG87IHBvciBjYWRhIGF1bWVudG8gZW4gMSBkZSBsYSBtYXRlcmlhIG9yZ8OhbmljYSBlbCByZW5kaW1pZW50byBkZWJlcsOtYSBhdW1lbnRhciBlbiAyLjU3IFRvbmVsYWRhcy4NCg0KJCRcd2lkZWhhdHtSVE99ID0gLTMuNDggKyAyLjU3Kk1PJCQNCipQdmFsb3IgUHIoPnx0fCkgZGUgbW8qDQoNCkVuIGxhIHBlbmRpZW50ZSAoaW50ZXJjZXB0IG1vKSBlcyByZWxldmFudGUgZWwgdmFsb3IgZGVsIHAgdmFsb3IgKjwyZS0xNiogDQoNCkNvbW8gbGEgcGVuZGllbnRlIGVzIDIuNTcgPCAwLjA1IHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhIHF1ZSBkaWNlIHF1ZSBsYSBwZW5kaWVudGUgZXMgMC4NCg0KKk11bHRpcGxlIFItc3F1YXJlZDogIDAuODc3NSwJQWRqdXN0ZWQgUi1zcXVhcmVkOiAgMC44NzYyKg0KDQpFbCA4Ny42MiUgZXMgcXVlIHRhbiByZWFsIGVzIGxhIHJlbGFjacOzbiBlbnRyZSBsYSBsw61uZWEgcmVjdGEgcGxhbnRlYWRhIHkgbG9zIGRhdG9zLiANCg0KKjcwJSA+IGVzIHVuIGJ1ZW4gbW9kZWxvLiogDQoNCiMgUmV2aXNpw7NuIGRlIHN1cHVlc3Rvcw0KYGBge3J9DQojIDEpIE5vcm1hbGlkYWQgZGUgcmVzaWR1b3MNCiNTaGFwaXJvIFRlc3QNCiNTZSBlc3BlcmEgcXVlIGxvcyByZXNpZHVvcyB0ZW5nYW4gY29tcG9ydGFtaWVudG8gbm9ybWFsDQpzaGFwaXJvLnRlc3QobW9kMSRyZXNpZHVhbHMpDQpgYGANCmBgYHtyfQ0KI0hvbW9zZWRhc3RpY2lkYWQgdSBob21vZ2VuZWlkYWQgZGUgbGFzIHZhcmlhbnphcw0KcGxvdChtb2QxJHJlc2lkdWFscywgcGNoPTE2KQ0KYGBgDQoNCiMgQU5BTElTSVMgREUgQ09WQVJJQU5aQQ0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCmRhdGEgPSBleHBhbmQuZ3JpZCh4PTE6MTAsIHk9MToxMCkNCmRhdGEkcnRvID0gcm5vcm0oMTAwLCAzLCAwLjMpDQpkYXRhJHJ0byA9IHNvcnQoZGF0YSRydG8pICsgcnVuaWYoMTAwLCAwICwwLjEpDQpkYXRhJG1vID0gcm5vcm0oMTAwLCAyLjUsIDAuMSkNCmRhdGEkbW8gPSBzb3J0KGRhdGEkbW8pICsgcnVuaWYgKDEwMCwgMCAsIDAuMSkNCg0KDQojIDQgVHJhdGFtaWVudG9zIDQgdGlwb3MgZGUgcHJlcGFyYWNpw7NuIHBhcmEgbGEgc2VtaWxsYQ0KDQpkYXRhJHRydCA9IGdsKDQsIDI1LCAxMDAsIA0KICAgICAgICAgICAgICBjKCdzMCcsJ3NmJywnc2knLCdzZmknKSkNCmRhdGENCmBgYA0KDQpNT0RFTE8gUVVFIFNFIEVTUEVSQVLDjUENCg0KJCR5X3tpan0gPSBcbXUgKyBcdGF1X2kgKyBcZXBzaWxvbl97aWp9IFxcDQp5X3tpan0gPSBcdGV4dHtyZW5kaW1pZW50b30gXFwNClxtdSA9IFx0ZXh0e21lZGlhIGdsb2JhbH0gXFwNClx0YXVfaSA9IFx0ZXh0e3RyYXRhbWllbnRvc30gXFwNClxlcHNpbG9uX3tpan0gPSBcdGV4dHtlcnJvcn0kJA0KDQojIE1PREVMTyBSRUFMDQoNCiQkeV97aWp9ID0gXG11ICsgXHRhdV9pICsgXHRoZXRhKHhfe2lqfSAtIFxiYXJ7eH0pICsgXGVwc2lsb25fe2lqfSQkDQpBcGFyaWNpw7NuIGRlIGxhIGNvdmFyaWFibGUgTU8sIGVmZWN0b3MgZGUgbGEgbWF0ZXJpYSBvcmfDoW5pY2Egc29icmUgZWwgcmVuZGltaWVudG8sIGEgcGVzYXIgZGUgZXN0YXIgZXN0dWRpYW5kbyBsb3MgdHJhdGFtaWVudG9zLg0KDQoNCkhJUMOTVEVTSVMNCg0KJCRIXzAgOiBcbXVfe3MwfSA9IFxtdV97c2Z9ID0gXG11X3tzaX0gPSBcbXVfe3NmaX0gJCQNCg0KYGBge3J9DQojcmVuZGltaWVudG8gY29tbyBmdW5jaW9uIGRlIGxhIGNvdmFyaWFibGUNCm1vZDIgPSBhb3YocnRvIH4gbW8gKyB0cnQsIGRhdGEpDQpzdW1tYXJ5KG1vZDIpDQpgYGANCmBgYHtyfQ0KYm94cGxvdChydG8gfiB0cnQsIGRhdGEpDQpgYGANCg0KKlAgVkFMT1IgTU8gPSAyZS0xNioNCjJlLTE2IDwgMC4wNSBQb3IgbG8gdGFudG8gc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEsIGVzdGFkaXN0aWNhbWVudGUgaGF5IGV2aWRlbmNpYSBwYXJhIGRldGVybWluYXIgcXVlIGxhIG1hdGVyaWEgb3Jnw6FuaWNhIHRpZW5lIGVmZWN0byBwb3NpdGl2byBzb2JyZSBlbCByZW5kaW1pZW50byBvYnRlbmlkbyBlbiBjYWRhIHVuYSBkZSBsYXMgcGFyY2VsYXMNCg0KKlAgVkFMT1IgREUgTE9TIFRSQVRBTUlFTlRPUyB0cnQqDQo4LjQ1ZS0wOCA8IDAuMDUgUG9yIGxvIHRhbnRvIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhLCBoYXkgZXZpZGVuY2lhIGVzdGFkaXN0aWNhIHBhcmEgZGV0ZXJtaW5hciBxdWUgbG9zIHRyYXRhbWllbnRvcyBnZW5lcmFuIGVmZWN0byBzb2JyZSBlbCByZW5kaW1pZW50by4NCg0KIyBSRVZJU0nDk04gREUgU1VQVUVTVE9TDQoNCmBgYHtyfQ0KI05vcm1hbGlkYWQNCiNTaGFwaXJvIFRlc3QNCnNoYXBpcm8udGVzdChtb2QyJHJlc2lkdWFscykNCmBgYA0KYGBge3J9DQpoaXN0KG1vZDIkcmVzaWR1YWxzKQ0KYGBgDQojIFJFVklTScOTTiBERSBVTiBQT1NJQkxFIERBVE8gQVTDjVBJQ08NCg0KYGBge3J9DQpib3hwbG90KG1vZDIkcmVzaWR1YWxzKQ0KYGBgDQoNCmBgYHtyfQ0Kd2hpY2gubWluKGRhdGEkcnRvKQ0KbWluaW1vID0gZGF0YVt3aGljaC5taW4oZGF0YSRydG8pLF0NCm1pbmltbw0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShvdXRsaWVycykNCmBgYA0KYGBge3J9DQojUHJ1ZWJhIGRlIEdydWJicyBwYXJhIGRldGVybWluYXIgc2kgdW4gZGF0byBlcyBhdMOtcGljbw0KZ3J1YmJzLnRlc3QobW9kMiRyZXNpZHVhbHMpDQpgYGANCkxhIHBydWViYSBub3MgcGVybWl0ZSBjb25maXJtYXIgcXVlIGVzZSBkYXRvIGVzIGF0w61waWNvLg0KDQoqQ0FNSU5PUyBSRU1FRElBTEVTIFBBUkEgVFJBVEFSIEVMIERBVE8gQVTDjVBJQ08qDQoNCjEuIEltcHV0YXINCjIuIEVsaW1pbmFyDQozLiBSZXBldGlyIGVsIGV4cGVyaW1lbnRvIHBhcmEgZXNhIHBhcmNlbGENCg0KYGBge3J9DQojTWVkaWEgZGUgY2FkYSB0cmF0YW1pZW50bw0KbWVkX3RydCA9IHRhcHBseShkYXRhJHJ0bywgZGF0YSR0cnQsIG1lYW4pDQptZWRfdHJ0DQoNCmBgYA0KYGBge3J9DQojSU1QVVRBUg0KI1N1c3RpdHVpciBlbCB2YWxvciBhbm9ybWFsIHBvciBsYSBtZWRpYSBkZSBzdSBncnVwbw0KDQpkYXRhMiA9IGRhdGENCmRhdGEyJHJ0b1sxXSA9IG1lZF90cnRbJ3MwJ10NCmhlYWQoZGF0YTIpDQoNCmBgYA0KYGBge3J9DQpib3hwbG90KHJ0b34gdHJ0LCBkYXRhMikNCg0KYGBgDQoNCmBgYHtyfQ0KbW9kMyA9IGFvdihydG8gfiBtbyArIHRydCwgZGF0YTIpDQpzdW1tYXJ5KG1vZDMpDQpgYGANCiMgTk9STUFMSURBRCBERSBMT1MgUkVTSURVQUxFUyBQQVJBIEVMIE1PREVMTyBDT04gRUwgREFUTyBJTVBVVEFETw0KDQpgYGB7cn0NCiNOb3JtYWxpZGFkIGNvbiBkYXRvIGltcHV0YWRvDQojIFRlc3QgZGUgU2hhcGlybw0Kc2hhcGlyby50ZXN0KG1vZDMkcmVzaWR1YWxzKQ0KYGBgDQoNCg0K