2016-08-22 1 views
0

Disons que j'ai deux variables dans un ensemble de données qui contiennent la même information, comme "mâle" et "femelle" (en supposant seulement 2 sexes et aucune donnée manquante). Comment puis-je tester que les deux colonnes contiennent les mêmes informations, ce qui me permet de supprimer l'une d'entre elles?R: Test si les variables contiennent la même information

Je pensais à vérifier le rang d'une matrice les contenant, mais apparemment une telle matrice est de rang entier, même si les colonnes sont clairement dépendantes les unes des autres.

EDIT: Je veux dire deux variables telles que les suivantes:

M F 
1 0 
1 0 
0 1 
0 1 
1 0 

Il est clair que les mêmes informations sont contenues dans ces deux variables. Comment puis-je tester pour cela?

+1

Bonjour Noah, pouvez-vous donner un exemple de ce que vous voulez dire? Voulez-vous dire que les colonnes sont identiques (mêmes valeurs, même ordre), ou simplement qu'elles ont les mêmes niveaux de facteur? –

+2

Si vous souhaitez utiliser le rang de la matrice, vous devez ajouter une colonne de 1s. Si vous ajoutez cela alors le rang de la matrice résultante sera toujours seulement 2 au lieu de 3 même s'il y a trois colonnes. – Dason

+2

Pour l'exemple présenté, ils auront une corrélation de 1 ou -1, donc vous pouvez tester ceux qui sont redondants avec 'apply (cor (df), 1, function (x) {any (abs (x) == 1) }) ', mais s'il y a des multiples, vous devrez aller voir' cor (df) 'pour voir comment ils sont appariés. – alistaire

Répondre

0

Edité

Sur la base de ces précisions, vous pouvez utiliser des corrélations par paires pour détecter des corrélations positives et négatives entre les colonnes de données, par exemple:

# create example data matrix matrix; add a fourth column that is inverse 
# of the third one 
> set.seed(1) 
> x <- matrix(sample(0:1, 15, replace=TRUE), ncol=3) 
> x <- cbind(x, ifelse(x[,3] == 0, 1, 0)) 
> x 
    [,1] [,2] [,3] [,4] 
[1,] 0 1 0 1 
[2,] 0 1 0 1 
[3,] 1 1 1 0 
[4,] 1 1 0 1 
[5,] 0 0 1 0 

Ensuite, construire une corrélation matrice. La diagonale est mise à zéro depuis pour ignorer les auto-corrélations.

Ensuite, nous testons chaque colonne pour voir si la valeur absolue maximale de sa corrélation avec d'autres colonnes est égale à un, ce qui indiquerait que les colonnes contiennent la même information.

> cormat <- cor(x) 
> diag(cormat) <- 0 
> apply(cormat, 2, function(x) { max(abs(x)) == 1 }) 
[1] FALSE FALSE TRUE TRUE 
+0

Je ne veux pas dire des colonnes identiques, je veux dire des colonnes où, par exemple, v1 = 1 - v2 – Noah

+0

Avez-vous envisagé d'utiliser la corrélation entre les deux colonnes? –

+0

@Noah, mis à jour pour refléter la clarification. Ce qui précède est basé sur la deuxième suggestion de ma réponse originale. –

-1

Peut-être que quelque chose comme ça?

x = rep(c("Male"), each = 10) 
y = rep(c("Female"),each = 10) 
fm = matrix(data = c(x,y), ncol = 2) 

fm[,1] == fm[,2] 
+0

Non, cela teste simplement si chaque valeur dans une colonne est égale à la valeur correspondante dans l'autre. Je veux tester si les variables sont redondantes dans l'information, pas égales en valeur. – Noah