Creative Commons License

1 Comparison of \(g\) groups

  • Extend \(F\)-test from a one-way ANOVA to non-parametric alternatives.

2 DMH Voorbeeld

Assess genotoxicity of 1,2-dimethylhydrazine dihydrochloride (DMH) (EU directive)

  • 24 rats
  • four groups with daily DMH dose
    • control
    • low
    • medium
    • high
  • Genotoxicity in liver using comet assay on 150 liver cells per rat.
  • Are there differences in DNA damage due to DMH dose?

2.1 Comet Assay:

  • Visualise DNA strand breaks
  • Length comet tail is a proxy for strand breaks.

Comet assay

dna <- read_delim("https://raw.githubusercontent.com/GTPB/PSLS20/master/data/dna.txt",delim=" ")
dna$dose <- as.factor(dna$dose)
dna
dna %>% 
  ggplot(aes(x=dose,y=length,fill=dose))+
  geom_boxplot() +
  geom_point(position="jitter")

dna %>%
  ggplot(aes(sample=length)) +
  geom_qq() + 
  geom_qq_line() +
  facet_wrap(~dose)

  • Strong indication that data in control group has a lower variance.
  • 6 observations per group are too few to check the assumptions
plot(lm(length~dose,data=dna))

3 Kruskal-Wallis Rank Test

  • The Kruskal-Wallis Rank Test (KW-test) is a non-parameteric alternative for ANOVA F-test.

  • Classical \(F\)-teststatistic can be written as \[ F = \frac{\text{SST}/(g-1)}{\text{SSE}/(n-g)} = \frac{\text{SST}/(g-1)}{(\text{SSTot}-\text{SST})/(n-g)} , \]

  • with \(g\) the number of groups.

  • SSTot depends only on outcomes \(\mathbf{y}\) and will not vary in permutation test.

  • SST can be used as statistic \[\text{SST}=\sum_{j=1}^t n_j(\bar{Y}_j-\bar{Y})^2\]

  • The KW test statistic is based on SST on rank-transformed outcomes1, \[ \text{SST} = \sum_{j=1}^g n_j \left(\bar{R}_j - \bar{R}\right)^2 = \sum_{j=1}^t n_j \left(\bar{R}_j - \frac{n+1}{2}\right)^2 , \]

  • with \(\bar{R}_j\) the mean of the ranks in group \(j\), and \(\bar{R}\) the mean of all ranks, \[ \bar{R} = \frac{1}{n}(1+2+\cdots + n) = \frac{1}{n}\frac{1}{2}n(n+1) = \frac{n+1}{2}. \]

  • The KW teststatistic is given by \[ KW = \frac{12}{n(n+1)} \sum_{j=1}^g n_j \left(\bar{R}_j - \frac{n+1}{2}\right)^2. \]

  • The factor \(\frac{12}{n(n+1)}\) is used so that \(KW\) has a simple asymptotic null distribution. In particular under \(H_0\), given thart \(\min(n_1,\ldots, n_g)\rightarrow \infty\), \[ KW \rightarrow \chi^2_{t-1}. \]

  • The exact KW-test can be executed by calculating the permutation null distribution (that only depends on \(n_1, \ldots, n_g\)) to test \[H_0: f_1=\ldots=f_g \text{ vs } H_1: \text{ at least two means are different}.\]

  • In order to allow \(H_1\) to be formulated in terms of means, the assumption of locations shift should be valid.

  • For DMH example this is not the case.

  • If location-shift is invalid, we have to formulate \(H_1\) in terms of probabilistic indices: \[H_0: f_1=\ldots=f_g \text{ vs } H_1: \exists\ j,k \in \{1,\ldots,g\} : \text{P}\left[Y_j\geq Y_k\right]\neq 0.5\]

3.1 DNA Damage Example

kruskal.test(length~dose,data=dna)

    Kruskal-Wallis rank sum test

data:  length by dose
Kruskal-Wallis chi-squared = 14, df = 3, p-value = 0.002905
  • On the \(5\%\) level of significance we can reject the null hypothesis.

  • R-functie kruskal.test only returns the asymptotic approximation for \(p\)-values.

  • With only 6 observaties per groep, this is not a good approximation of the \(p\)-value

  • With the coin R package we can calculate the exacte \(p\)-value

library(coin)
kwPerm <- kruskal_test(length~dose,data=dna,
            distribution=approximate(B=100000))
kwPerm

    Approximative Kruskal-Wallis Test

data:  length by dose (0, 1.25, 2.5, 5)
chi-squared = 14, p-value = 0.00043
  • We conclude that the difference in the distribution of the DNA damages due to the DMH dose is extremely significantly different.

  • Posthoc analysis with WMW tests.

pairwise.wilcox.test(dna$length,dna$dose)

    Pairwise comparisons using Wilcoxon rank sum exact test 

data:  dna$length and dna$dose 

     0     1.25  2.5  
1.25 0.013 -     -    
2.5  0.013 0.818 -    
5    0.013 0.721 0.788

P value adjustment method: holm 
  • All DMH behandelingen are significantly different from the control.
  • The DMH are not significantly different from one another.
  • U1 does not occur in the pairwise.wilcox.test output. Point estimate on probability on higher DNA-damage?
nGroup <- table(dna$dose)
probInd <- combn(levels(dna$dose),2,function(x) 
         {
         test <- wilcox.test(length~dose,subset(dna,dose%in%x))
         return(test$statistic/prod(nGroup[x]))
         }
         )
names(probInd) <- combn(levels(dna$dose),2,paste,collapse="vs")
probInd
  0vs1.25    0vs2.5      0vs5 1.25vs2.5   1.25vs5    2.5vs5 
0.0000000 0.0000000 0.0000000 0.4444444 0.2777778 0.3333333 

Because there are doubts on the location-shift model we draw our conclusions in terms of the probabilistic index.

3.1.1 Conclusion

  • There is an extremely significant difference in in the distribution of the DNA-damage measurements due to the treatment with DMH (\(p<0.001\) KW-test).
  • DNA-damage is more likely upon DMH treatment than in the control treatment (all p=0.013, WMW-testen).
  • The probability on higher DNA-damage upon exposure to DMH is 100% (Calculation of a CI on the probabilistic index is beyond the scope of the course)
  • There are no significant differences in the distributions of the comit-lengths among the treatment with the different DMH concentrations (\(p=\) 0.72-0.82).
  • DMH shows already genotoxic effects at low dose.
  • (Alle paarswise tests are gecorrected for multiple testing using Holm’s methode).

  1. we assume that no ties are available↩︎

LS0tCnRpdGxlOiAiOS4gTm9uLXBhcmFtZXRyaWMgc3RhdGlzdGljcyAtIEtydXNrYWwgV2FsbGlzIiAgCmF1dGhvcjogIkxpZXZlbiBDbGVtZW50IgpkYXRlOiAic3RhdE9taWNzLCBHaGVudCBVbml2ZXJzaXR5IChodHRwczovL3N0YXRvbWljcy5naXRodWIuaW8pIgpvdXRwdXQ6CiAgICBodG1sX2RvY3VtZW50OgogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlICAgIAogICAgICB0aGVtZTogY29zbW8KICAgICAgdG9jOiB0cnVlCiAgICAgIHRvY19mbG9hdDogdHJ1ZQogICAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQotLS0KCjxhIHJlbD0ibGljZW5zZSIgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzQuMCI+PGltZyBhbHQ9IkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIgc3R5bGU9ImJvcmRlci13aWR0aDowIiBzcmM9Imh0dHBzOi8vaS5jcmVhdGl2ZWNvbW1vbnMub3JnL2wvYnktbmMtc2EvNC4wLzg4eDMxLnBuZyIgLz48L2E+CgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGUgPSBUUlVFLCBjb21tZW50ID0gTkEsIGVjaG8gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmxpYnJhcnkodGlkeXZlcnNlKQpzZXQuc2VlZCgxNDApCmBgYAoKCiMgQ29tcGFyaXNvbiBvZiAkZyQgZ3JvdXBzCgotIEV4dGVuZCAgJEYkLXRlc3QgZnJvbSBhIG9uZS13YXkgQU5PVkEgdG8gbm9uLXBhcmFtZXRyaWMgYWx0ZXJuYXRpdmVzLgoKIyBETUggVm9vcmJlZWxkCgpBc3Nlc3MgZ2Vub3RveGljaXR5IG9mIDEsMi1kaW1ldGh5bGh5ZHJhemluZSBkaWh5ZHJvY2hsb3JpZGUgKERNSCkgIChFVSBkaXJlY3RpdmUpCgotIDI0IHJhdHMgCi0gZm91ciBncm91cHMgd2l0aCBkYWlseSBETUggZG9zZQogIC0gY29udHJvbAogIC0gbG93CiAgLSBtZWRpdW0gCiAgLSBoaWdoCgotIEdlbm90b3hpY2l0eSBpbiBsaXZlciB1c2luZyBjb21ldCBhc3NheSBvbiAxNTAgbGl2ZXIgY2VsbHMgcGVyIHJhdC4KLSBBcmUgdGhlcmUgZGlmZmVyZW5jZXMgaW4gRE5BIGRhbWFnZSBkdWUgdG8gRE1IIGRvc2U/CgojIyBDb21ldCBBc3NheToKCi0gVmlzdWFsaXNlIEROQSBzdHJhbmQgYnJlYWtzCi0gTGVuZ3RoIGNvbWV0IHRhaWwgaXMgYSBwcm94eSBmb3Igc3RyYW5kIGJyZWFrcy4gCgohW0NvbWV0IGFzc2F5XShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vR1RQQi9QU0xTMjAvZ2gtcGFnZXMvYXNzZXRzL2ZpZ3MvY29tZXQuanBnKXsgd2lkdGg9NTAlIH0KCgpgYGB7cn0KZG5hIDwtIHJlYWRfZGVsaW0oImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9HVFBCL1BTTFMyMC9tYXN0ZXIvZGF0YS9kbmEudHh0IixkZWxpbT0iICIpCmRuYSRkb3NlIDwtIGFzLmZhY3RvcihkbmEkZG9zZSkKZG5hCmBgYAoKCmBgYHtyfQpkbmEgJT4lIAogIGdncGxvdChhZXMoeD1kb3NlLHk9bGVuZ3RoLGZpbGw9ZG9zZSkpKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uPSJqaXR0ZXIiKQoKZG5hICU+JQogIGdncGxvdChhZXMoc2FtcGxlPWxlbmd0aCkpICsKICBnZW9tX3FxKCkgKyAKICBnZW9tX3FxX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh+ZG9zZSkKYGBgCgotIFN0cm9uZyBpbmRpY2F0aW9uIHRoYXQgZGF0YSBpbiBjb250cm9sIGdyb3VwIGhhcyBhIGxvd2VyIHZhcmlhbmNlLgotIDYgb2JzZXJ2YXRpb25zIHBlciBncm91cCBhcmUgdG9vIGZldyB0byBjaGVjayB0aGUgYXNzdW1wdGlvbnMgCgpgYGB7cn0KcGxvdChsbShsZW5ndGh+ZG9zZSxkYXRhPWRuYSkpCmBgYAoKIyBLcnVza2FsLVdhbGxpcyBSYW5rIFRlc3QKCi0gVGhlIEtydXNrYWwtV2FsbGlzIFJhbmsgVGVzdCAoS1ctdGVzdCkgaXMgYSAgbm9uLXBhcmFtZXRlcmljIGFsdGVybmF0aXZlICBmb3IgQU5PVkEgRi10ZXN0LiAgCiAgCi0gIENsYXNzaWNhbCAkRiQtdGVzdHN0YXRpc3RpYyBjYW4gYmUgd3JpdHRlbiBhcwogIFxbCiAgICBGID0gXGZyYWN7XHRleHR7U1NUfS8oZy0xKX17XHRleHR7U1NFfS8obi1nKX0gPSBcZnJhY3tcdGV4dHtTU1R9LyhnLTEpfXsoXHRleHR7U1NUb3R9LVx0ZXh0e1NTVH0pLyhuLWcpfSAsCiAgXF0KLSAgd2l0aCAkZyQgdGhlIG51bWJlciBvZiBncm91cHMuIAogCi0gU1NUb3QgZGVwZW5kcyBvbmx5IG9uICBvdXRjb21lcyAkXG1hdGhiZnt5fSQgYW5kIHdpbGwgbm90IHZhcnkgaW4gcGVybXV0YXRpb24gdGVzdC4gCgotIFNTVCBjYW4gYmUgdXNlZCBhcyBzdGF0aXN0aWMKICQkXHRleHR7U1NUfT1cc3VtX3tqPTF9XnQgbl9qKFxiYXJ7WX1fai1cYmFye1l9KV4yJCQKCgotICBUaGUgS1cgdGVzdCBzdGF0aXN0aWMgaXMgYmFzZWQgb24gU1NUIG9uIHJhbmstdHJhbnNmb3JtZWQgb3V0Y29tZXNeW3dlIGFzc3VtZSB0aGF0IG5vICp0aWVzKiBhcmUgYXZhaWxhYmxlXSwKICBcWwogICAgIFx0ZXh0e1NTVH0gPSBcc3VtX3tqPTF9Xmcgbl9qIFxsZWZ0KFxiYXJ7Un1faiAtIFxiYXJ7Un1ccmlnaHQpXjIgPSBcc3VtX3tqPTF9XnQgbl9qIFxsZWZ0KFxiYXJ7Un1faiAtIFxmcmFje24rMX17Mn1ccmlnaHQpXjIgLAogIFxdCi0gIHdpdGggJFxiYXJ7Un1faiQgdGhlIG1lYW4gb2YgdGhlIHJhbmtzIGluIGdyb3VwICRqJCwgYW5kICRcYmFye1J9JCB0aGUgbWVhbiBvZiBhbGwgcmFua3MsCiAgXFsKICAgIFxiYXJ7Un0gPSBcZnJhY3sxfXtufSgxKzIrXGNkb3RzICsgbikgPSBcZnJhY3sxfXtufVxmcmFjezF9ezJ9bihuKzEpID0gXGZyYWN7bisxfXsyfS4KICBcXQotICBUaGUgS1cgdGVzdHN0YXRpc3RpYyBpcyBnaXZlbiBieQogIFxbCiAgICBLVyA9IFxmcmFjezEyfXtuKG4rMSl9ICBcc3VtX3tqPTF9Xmcgbl9qIFxsZWZ0KFxiYXJ7Un1faiAtIFxmcmFje24rMX17Mn1ccmlnaHQpXjIuCiAgXF0KLSAgVGhlIGZhY3RvciAkXGZyYWN7MTJ9e24obisxKX0kIGlzIHVzZWQgc28gdGhhdCAkS1ckIGhhcyBhIHNpbXBsZSBhc3ltcHRvdGljIG51bGwgZGlzdHJpYnV0aW9uLiBJbiBwYXJ0aWN1bGFyIHVuZGVyICRIXzAkLCBnaXZlbiB0aGFydCAkXG1pbihuXzEsXGxkb3RzLCBuX2cpXHJpZ2h0YXJyb3cgXGluZnR5JCwgCiAgXFsKICAgIEtXICBccmlnaHRhcnJvdyBcY2hpXjJfe3QtMX0uCiAgXF0KCi0gIFRoZSBleGFjdCBLVy10ZXN0IGNhbiBiZSBleGVjdXRlZCBieSBjYWxjdWxhdGluZyB0aGUgcGVybXV0YXRpb24gbnVsbCBkaXN0cmlidXRpb24gKHRoYXQgb25seSBkZXBlbmRzIG9uICRuXzEsIFxsZG90cywgbl9nJCkgdG8gdGVzdAogICQkSF8wOiBmXzE9XGxkb3RzPWZfZyBcdGV4dHsgdnMgfSBIXzE6IFx0ZXh0eyBhdCBsZWFzdCB0d28gbWVhbnMgYXJlIGRpZmZlcmVudH0uJCQgCiAgCi0gSW4gb3JkZXIgdG8gYWxsb3cgJEhfMSQgdG8gYmUgZm9ybXVsYXRlZCBpbiB0ZXJtcyBvZiBtZWFucywgdGhlIGFzc3VtcHRpb24gb2YgbG9jYXRpb25zIHNoaWZ0IHNob3VsZCBiZSB2YWxpZC4KLSBGb3IgRE1IIGV4YW1wbGUgdGhpcyBpcyBub3QgdGhlIGNhc2UuICAgCi0gSWYgbG9jYXRpb24tc2hpZnQgaXMgaW52YWxpZCwgd2UgaGF2ZSB0byBmb3JtdWxhdGUgJEhfMSQgaW4gdGVybXMgb2YgcHJvYmFiaWxpc3RpYyBpbmRpY2VzOgogICQkSF8wOiBmXzE9XGxkb3RzPWZfZyBcdGV4dHsgdnMgfSBIXzE6IFxleGlzdHNcIGosayBcaW4gXHsxLFxsZG90cyxnXH0gOiBcdGV4dHtQfVxsZWZ0W1lfalxnZXEgWV9rXHJpZ2h0XVxuZXEgMC41JCQKCgojIyBETkEgRGFtYWdlIEV4YW1wbGUKCmBgYHtyfQprcnVza2FsLnRlc3QobGVuZ3RofmRvc2UsZGF0YT1kbmEpCmBgYAoKLSBPbiB0aGUgJDVcJSQgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gCiAgCi0gUi1mdW5jdGllIGBrcnVza2FsLnRlc3RgIG9ubHkgcmV0dXJucyB0aGUgYXN5bXB0b3RpYyBhcHByb3hpbWF0aW9uIGZvciAkcCQtdmFsdWVzLiAKCi0gV2l0aCBvbmx5IDYgb2JzZXJ2YXRpZXMgcGVyIGdyb2VwLCB0aGlzIGlzIG5vdCBhIGdvb2QgYXBwcm94aW1hdGlvbiBvZiB0aGUgJHAkLXZhbHVlCgotICBXaXRoIHRoZSBgY29pbmAgUiBwYWNrYWdlIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGV4YWN0ZSAkcCQtdmFsdWUKCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShjb2luKQprd1Blcm0gPC0ga3J1c2thbF90ZXN0KGxlbmd0aH5kb3NlLGRhdGE9ZG5hLAoJCSAgICBkaXN0cmlidXRpb249YXBwcm94aW1hdGUoQj0xMDAwMDApKQprd1Blcm0KYGBgCgotIFdlIGNvbmNsdWRlIHRoYXQgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgRE5BIGRhbWFnZXMgZHVlIHRvIHRoZSBETUggZG9zZSBpcyBleHRyZW1lbHkgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuIAoKLSBQb3N0aG9jIGFuYWx5c2lzIHdpdGggV01XIHRlc3RzLiAKCmBgYHtyfQpwYWlyd2lzZS53aWxjb3gudGVzdChkbmEkbGVuZ3RoLGRuYSRkb3NlKQpgYGAKCi0gQWxsIERNSCBiZWhhbmRlbGluZ2VuIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIHRoZSBjb250cm9sLiAKLSBUaGUgRE1IIGFyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBvbmUgYW5vdGhlci4gIAotIFUxIGRvZXMgbm90IG9jY3VyIGluIHRoZSBgcGFpcndpc2Uud2lsY294LnRlc3RgIG91dHB1dC4gUG9pbnQgZXN0aW1hdGUgb24gcHJvYmFiaWxpdHkgb24gaGlnaGVyIEROQS1kYW1hZ2U/CgpgYGB7ciwgZWNobz1GQUxTRX0KcGFpcldpbGNveCA8LSBwYWlyd2lzZS53aWxjb3gudGVzdChkbmEkbGVuZ3RoLGRuYSRkb3NlKQpgYGAKCmBgYHtyfQpuR3JvdXAgPC0gdGFibGUoZG5hJGRvc2UpCnByb2JJbmQgPC0gY29tYm4obGV2ZWxzKGRuYSRkb3NlKSwyLGZ1bmN0aW9uKHgpIAoJCSB7CgkJIHRlc3QgPC0gd2lsY294LnRlc3QobGVuZ3RofmRvc2Usc3Vic2V0KGRuYSxkb3NlJWluJXgpKQoJCSByZXR1cm4odGVzdCRzdGF0aXN0aWMvcHJvZChuR3JvdXBbeF0pKQoJCSB9CgkJICkKbmFtZXMocHJvYkluZCkgPC0gY29tYm4obGV2ZWxzKGRuYSRkb3NlKSwyLHBhc3RlLGNvbGxhcHNlPSJ2cyIpCnByb2JJbmQKYGBgCgpCZWNhdXNlIHRoZXJlIGFyZSBkb3VidHMgb24gdGhlIGxvY2F0aW9uLXNoaWZ0IG1vZGVsIHdlIGRyYXcgb3VyIGNvbmNsdXNpb25zIGluIHRlcm1zIG9mIHRoZSBwcm9iYWJpbGlzdGljIGluZGV4LiAKCiMjIyBDb25jbHVzaW9uCgotIFRoZXJlIGlzIGFuIGV4dHJlbWVseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIGluIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIEROQS1kYW1hZ2UgbWVhc3VyZW1lbnRzIGR1ZSB0byB0aGUgdHJlYXRtZW50IHdpdGggRE1IICAoJHA8MC4wMDEkIEtXLXRlc3QpLgotIEROQS1kYW1hZ2UgaXMgbW9yZSBsaWtlbHkgdXBvbiBETUggdHJlYXRtZW50IHRoYW4gaW4gdGhlIGNvbnRyb2wgdHJlYXRtZW50IChhbGwgcD0wLjAxMywgV01XLXRlc3RlbikuIAotIFRoZSBwcm9iYWJpbGl0eSBvbiBoaWdoZXIgRE5BLWRhbWFnZSB1cG9uIGV4cG9zdXJlIHRvIERNSCBpcyAxMDAlIChDYWxjdWxhdGlvbiBvZiBhIENJIG9uIHRoZSBwcm9iYWJpbGlzdGljIGluZGV4IGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhlIGNvdXJzZSkgCi0gVGhlcmUgYXJlIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSBjb21pdC1sZW5ndGhzIGFtb25nIHRoZSB0cmVhdG1lbnQgd2l0aCB0aGUgZGlmZmVyZW50IERNSCBjb25jZW50cmF0aW9ucyAoJHA9JCBgciBwYXN0ZShmb3JtYXQocmFuZ2UocGFpcldpbGNveCRwLnZhbHVlWywtMV0sbmEucm09VFJVRSksZGlnaXQ9MiksY29sbGFwc2U9Ii0iKWApLiAKLSBETUggc2hvd3MgYWxyZWFkeSBnZW5vdG94aWMgZWZmZWN0cyBhdCBsb3cgZG9zZS4gCi0gKEFsbGUgcGFhcnN3aXNlIHRlc3RzIGFyZSBnZWNvcnJlY3RlZCBmb3IgbXVsdGlwbGUgdGVzdGluZyB1c2luZyBIb2xtJ3MgbWV0aG9kZSkuCgo=