Testes de Permutação

Uma das aplicações simples das permutações ao acaso são testes de comparação de médias entre grupos, como o teste t.

Uma análise exploratória dos dados mostra que as médias amostrais são muito diferentes, e as variâncias também são "muito" diferentes
#Os dados a seguir foram sugeridos no EMAIL, os valores de X foram multiplicados por 10.
#X={2, 3, 1, 0, 1, 2} e Y={1, 1, 2, 3, 2, 0 }
val=c(20, 30, 10, 0, 10, 20,    1, 1, 2, 3, 2, 0)
id= c("x","x","x","x","x","x","y","y","y","y","y","y")
dados <- data.frame(id,val)
dados
#sumário
tapply(dados$val, dados$id,summary)
$x
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      0      10      15      15      20      30 

$y
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0     1.0     1.5     1.5     2.0     3.0 
medias <- tapply(dados$val, dados$id,mean)
medias
   x    y 
15.0  1.5 
##Diferença absoluta entre as médias
dif.obs <- abs( diff( as.vector(medias) ) )
dif.obs
[1] 13.5
#variâncias
tapply(dados$val, dados$id,var)
    x     y 
110.0   1.1 
Supondo que os dados não atendem as premissas de um teste t, uma alternativa é substituí-lo por um teste de permutação. Como a hipótese nula é que as duas amostras vêm de populações com a mesma média, ela pode ser simulada permutando-se ao acaso os valores entre o "x" e o "y".

Calculamos então um índice de diferenças entre as médias das amostras que deve ser similar ao obtido, caso a hipótese nula esteja correta. Repetindo esse procedimento milhares de vezes, podemos estimar a chance de um valor igual ou maior que o observado ter ocorrido mesmo se as duas amostras vêm de populações com médias diferentes.

A permutação é feita com a função sample, que pode ser repetida com um loop, por meio da função for:
##cria um vetor para armazenar os resultados
results <- c()
##Permuta os valores das medidas, calcula a diferença absoluta entre as médias e 
##armazena no vetor "results". Repete a operação n=10000 vezes
for(i in 1:10000){
results[i] <- abs( diff( tapply(sample(dados$val),dados$id,mean) ) )}
Número de vezes, em dez mil permutações, que a diferença absoluta das médias foi igual ou maior do que a observada:
sum(results >= dif.obs)
[1] 151
Logo, a diferença observada é pouco provável sob a hipótese nula, o que nos permite rejeitá-la. Um gráfico de densidade probabilística dos valores das permutações ilustra isso:
plot(density(results),xlab="Diferença Absoluta das Médias",ylab="Freq Relativa", main="")
abline(v = dif.obs, col="red")

LS0tDQp0aXRsZTogIlRlc3RlIGRlIFBlcm11dGHDp8OjbyINCmF1dGhvcjogJ0xlb25pLCBSLiBDLicNCmVtYWlsOiAicmNsZW9uaUB5YWhvby5jb20uYnIiDQpkYXRlOiAnUmVsYXTDs3JpbyBnZXJhZG8gZW06IGByIGZvcm1hdChTeXMudGltZSgpLCAiJWQgZGUgJUIgZGUgJVkiKWAnDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMjVGVzdGVzIGRlIFBlcm11dGHDp8Ojbw0KDQogICAgVW1hIGRhcyBhcGxpY2HDp8O1ZXMgc2ltcGxlcyBkYXMgcGVybXV0YcOnw7VlcyBhbyBhY2FzbyBzw6NvIHRlc3RlcyBkZSBjb21wYXJhw6fDo28gZGUgbcOpZGlhcyBlbnRyZSBncnVwb3MsIGNvbW8gbyB0ZXN0ZSB0Lg0KDQogICAgVW1hIGFuw6FsaXNlIGV4cGxvcmF0w7NyaWEgZG9zIGRhZG9zIG1vc3RyYSBxdWUgYXMgbcOpZGlhcyBhbW9zdHJhaXMgc8OjbyBtdWl0byBkaWZlcmVudGVzLCBlIGFzIHZhcmnDom5jaWFzIHRhbWLDqW0gc8OjbyAibXVpdG8iIGRpZmVyZW50ZXMNCg0KYGBge3J9DQojT3MgZGFkb3MgYSBzZWd1aXIgZm9yYW0gc3VnZXJpZG9zIG5vIEVNQUlMLCBvcyB2YWxvcmVzIGRlIFggZm9yYW0gbXVsdGlwbGljYWRvcyBwb3IgMTAuDQojWD17MiwgMywgMSwgMCwgMSwgMn0gZSBZPXsxLCAxLCAyLCAzLCAyLCAwIH0NCg0KdmFsPWMoMjAsIDMwLCAxMCwgMCwgMTAsIDIwLCAxLCAxLCAyLCAzLCAyLCAwKQ0KaWQ9IGMoIngiLCJ4IiwieCIsIngiLCJ4IiwieCIsInkiLCJ5IiwieSIsInkiLCJ5IiwieSIpDQoNCmRhZG9zIDwtIGRhdGEuZnJhbWUoaWQsdmFsKQ0KZGFkb3MNCg0KI3N1bcOhcmlvDQp0YXBwbHkoZGFkb3MkdmFsLCBkYWRvcyRpZCxzdW1tYXJ5KQ0KDQptZWRpYXMgPC0gdGFwcGx5KGRhZG9zJHZhbCwgZGFkb3MkaWQsbWVhbikNCm1lZGlhcw0KIyNEaWZlcmVuw6dhIGFic29sdXRhIGVudHJlIGFzIG3DqWRpYXMNCmRpZi5vYnMgPC0gYWJzKCBkaWZmKCBhcy52ZWN0b3IobWVkaWFzKSApICkNCmRpZi5vYnMNCg0KI3ZhcmnDom5jaWFzDQp0YXBwbHkoZGFkb3MkdmFsLCBkYWRvcyRpZCx2YXIpDQoNCmBgYA0KDQogICAgU3Vwb25kbyBxdWUgb3MgZGFkb3MgbsOjbyBhdGVuZGVtIGFzIHByZW1pc3NhcyBkZSB1bSB0ZXN0ZSB0LCB1bWEgYWx0ZXJuYXRpdmEgw6kgc3Vic3RpdHXDrS1sbyBwb3IgdW0gdGVzdGUgZGUgcGVybXV0YcOnw6NvLiBDb21vIGEgaGlww7N0ZXNlIG51bGEgw6kgcXVlIGFzIGR1YXMgYW1vc3RyYXMgdsOqbSBkZSBwb3B1bGHDp8O1ZXMgY29tIGEgbWVzbWEgbcOpZGlhLCBlbGEgcG9kZSBzZXIgc2ltdWxhZGEgcGVybXV0YW5kby1zZSBhbyBhY2FzbyBvcyB2YWxvcmVzIGVudHJlIG8gIngiIGUgbyAieSIuDQoNCiAgICBDYWxjdWxhbW9zIGVudMOjbyB1bSDDrW5kaWNlIGRlIGRpZmVyZW7Dp2FzIGVudHJlIGFzIG3DqWRpYXMgZGFzIGFtb3N0cmFzIHF1ZSBkZXZlIHNlciBzaW1pbGFyIGFvIG9idGlkbywgY2FzbyBhIGhpcMOzdGVzZSBudWxhIGVzdGVqYSBjb3JyZXRhLiBSZXBldGluZG8gZXNzZSBwcm9jZWRpbWVudG8gbWlsaGFyZXMgZGUgdmV6ZXMsIHBvZGVtb3MgZXN0aW1hciBhIGNoYW5jZSBkZSB1bSB2YWxvciBpZ3VhbCBvdSBtYWlvciBxdWUgbyBvYnNlcnZhZG8gdGVyIG9jb3JyaWRvIG1lc21vIHNlIGFzIGR1YXMgYW1vc3RyYXMgdsOqbSBkZSBwb3B1bGHDp8O1ZXMgY29tIG3DqWRpYXMgZGlmZXJlbnRlcy4NCg0KICAgIEEgcGVybXV0YcOnw6NvIMOpIGZlaXRhIGNvbSBhIGZ1bsOnw6NvIHNhbXBsZSwgcXVlIHBvZGUgc2VyIHJlcGV0aWRhIGNvbSB1bSBsb29wLCBwb3IgbWVpbyBkYSBmdW7Dp8OjbyBmb3I6DQoNCmBgYHtyfQ0KIyNjcmlhIHVtIHZldG9yIHBhcmEgYXJtYXplbmFyIG9zIHJlc3VsdGFkb3MNCnJlc3VsdHMgPC0gYygpDQojI1Blcm11dGEgb3MgdmFsb3JlcyBkYXMgbWVkaWRhcywgY2FsY3VsYSBhIGRpZmVyZW7Dp2EgYWJzb2x1dGEgZW50cmUgYXMgbcOpZGlhcyBlIA0KIyNhcm1hemVuYSBubyB2ZXRvciAicmVzdWx0cyIuIFJlcGV0ZSBhIG9wZXJhw6fDo28gbj0xMDAwMCB2ZXplcw0KZm9yKGkgaW4gMToxMDAwMCl7DQpyZXN1bHRzW2ldIDwtIGFicyggZGlmZiggdGFwcGx5KHNhbXBsZShkYWRvcyR2YWwpLGRhZG9zJGlkLG1lYW4pICkgKX0NCmBgYA0KDQoNCiAgICBOw7ptZXJvIGRlIHZlemVzLCBlbSBkZXogbWlsIHBlcm11dGHDp8O1ZXMsIHF1ZSBhIGRpZmVyZW7Dp2EgYWJzb2x1dGEgZGFzIG3DqWRpYXMgZm9pIGlndWFsIG91IG1haW9yIGRvIHF1ZSBhIG9ic2VydmFkYToNCg0KYGBge3J9DQpzdW0ocmVzdWx0cyA+PSBkaWYub2JzKQ0KYGBgDQoNCiAgICBMb2dvLCBhIGRpZmVyZW7Dp2Egb2JzZXJ2YWRhIMOpIHBvdWNvIHByb3bDoXZlbCBzb2IgYSBoaXDDs3Rlc2UgbnVsYSwgbyBxdWUgbm9zIHBlcm1pdGUgcmVqZWl0w6EtbGEuIFVtIGdyw6FmaWNvIGRlIGRlbnNpZGFkZSBwcm9iYWJpbMOtc3RpY2EgZG9zIHZhbG9yZXMgZGFzIHBlcm11dGHDp8O1ZXMgaWx1c3RyYSBpc3NvOg0KDQpgYGB7cn0NCnBsb3QoZGVuc2l0eShyZXN1bHRzKSx4bGFiPSJEaWZlcmVuw6dhIEFic29sdXRhIGRhcyBNw6lkaWFzIix5bGFiPSJGcmVxIFJlbGF0aXZhIiwgbWFpbj0iIikNCmFibGluZSh2ID0gZGlmLm9icywgY29sPSJyZWQiKQ0KYGBgDQoNCg==