fonction tapply avec un test

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Mattis Denonfoux
Messages : 9
Enregistré le : 05 Mai 2020, 14:13

fonction tapply avec un test

Messagepar Mattis Denonfoux » 02 Juin 2020, 08:27

Bonjour, j'ai un soucis avec l'utilisation de la commande tapply().
En effet, lorsque j'effectue un tapply où le FUN est un test (lillie.test en l'occurence).

Code : Tout sélectionner

tapply(X1$valeurfonc[filtre1],X1$l_codinsee[filtre1],lillie.test)

et voici le message d'erreur que R me renvoie : Error in FUN(X[[i]], ...) : sample size must be greater than 4

Les longueurs de mes 2 arguments sont bien équivalentes, je n'ai eu aucun problème avec le tapply lorsque FUN=skew ou kurtosi. L'aide sur R ne m'aide pas plus que ça...

Au cas où tapply() n'est pas la fonction adaptée, ce qui m'intéresse ici est de tester la distribution de mes valeurs foncières à une loi normale, commune par commune.

Merci d'avance pour votre aide, bonne journée
MD

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: fonction tapply avec un test

Messagepar Pierre-Yves Berrard » 02 Juin 2020, 09:07

Bonjour,
Manifestement, c'est un message d'erreur de la fonction lillie.test qui indique qu'il y a trop peu de données.
À noter que je ne connais pas la fonction lillie.test, ni le package duquel elle provient.
PY

Mattis Denonfoux
Messages : 9
Enregistré le : 05 Mai 2020, 14:13

Re: fonction tapply avec un test

Messagepar Mattis Denonfoux » 02 Juin 2020, 09:14

À noter que je ne connais pas la fonction lillie.test, ni le package duquel elle provient.


lillie.test vient du package "nortest", c'est une alternative au test de Kolmogorov-Smirnov.

c'est un message d'erreur de la fonction lillie.test qui indique qu'il y a trop peu de données

La taille de mon échantillon avec filtre est de l'ordre de 450 000 individus mais vous me faites penser que cela doit venir du fait que dans certaines communes (X1$l_codinsee[filtre1]), il y a moins de 4 individus...

Merci tout de même de votre réponse

Eric Wajnberg
Messages : 778
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: fonction tapply avec un test

Messagepar Eric Wajnberg » 02 Juin 2020, 18:15

Un moyen de savoir est évidement de lancer le tapply avec length :

Code : Tout sélectionner

tapply(X1$valeurfonc[filtre1],X1$l_codinsee[filtre1],length)

Eric.

Mattis Denonfoux
Messages : 9
Enregistré le : 05 Mai 2020, 14:13

Re: fonction tapply avec un test

Messagepar Mattis Denonfoux » 03 Juin 2020, 08:24

Je n'avais pas pensé à ce type de commande, en effet ça vient bien d'ici, j'ai pu créer un filtre... Ce qui m'améne à un nouveau type d'erreur x)
Je vous copie le code puis l'erreur, si quelqu'un à la réponse on ne sait jamais, sinon je me débrouillerai avec une autre commande.

Code : Tout sélectionner

com4=tapply(X1$valeurfonc[filtre1],X1$l_codinsee[filtre1],length)
com4=com4[com4>=4]

Code : Tout sélectionner

tapply(X1$valeurfonc[filtre1][com4],X1$l_codinsee[filtre1][com4],lillie.test)


Error in if (pvalue > 0.1) { :
valeur manquante là où TRUE / FALSE est requis

Merci encore de votre aide.
MD

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: fonction tapply avec un test

Messagepar Pierre-Yves Berrard » 03 Juin 2020, 09:19

Présence de valeurs manquantes ?
Eric Wajnberg a écrit :Un moyen de savoir est évidement de lancer le tapply avec (length) anyNA:

Code : Tout sélectionner

tapply(X1$valeurfonc[filtre1], X1$l_codinsee[filtre1], anyNA)
PY

Mattis Denonfoux
Messages : 9
Enregistré le : 05 Mai 2020, 14:13

Re: fonction tapply avec un test

Messagepar Mattis Denonfoux » 03 Juin 2020, 09:25

Elles ont été supprimées au préalable, mếme après vérification, il n'y en a aucune

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: fonction tapply avec un test

Messagepar Pierre-Yves Berrard » 03 Juin 2020, 09:29

Il doit y avoir un ou plusieurs groupes pour lequel lillie.test ne fonctionne pas.

Un moyen de trouver quels groupes provoquent une erreur est d'utiliser safely du package purrr :

Code : Tout sélectionner

tapply(X1$valeurfonc[filtre1], X1$l_codinsee[filtre1], purrr::safely(lillie.test))
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: fonction tapply avec un test

Messagepar Logez Maxime » 03 Juin 2020, 09:41

Bonjour,

le problème vient surement en partie de là :

Code : Tout sélectionner

tapply(X1$valeurfonc[filtre1][com4],X1$l_codinsee[filtre1][com4],lillie.test)
com4 est un vecteur beaucoup plus petit que celui de départ puisque tu synthétises l'information pour chaque modalité :

Code : Tout sélectionner

f <- rep(letters[1:4], c(3, 4, 4, 1))
f
 [1] "a" "a" "a" "b" "b" "b" "b" "c" "c" "c" "c" "d"

tapply(x, f, length)
a b c d
3 4 4 1
com4 <- tapply(x, f, length)
com4>=4
    a     b     c     d
FALSE  TRUE  TRUE FALSE
Ici le vecteur de départ contient 12 valeurs mais com4 que 4 (le nombre de modalités), donc quand tu fais une sélection directement à partir de com4 tu recycles le booléen que tu obtenus mais tu ne sélectionnes pas les modalités à plus de 4 :

Code : Tout sélectionner

f[com4>=4]
 f[com4>=4]
[1] "a" "a" "b" "b" "c" "c"
Ici "d" a été virée mais c'est un coup de chance, c'est parce qu'en fait tu as fait sans t'en rendre compte :

Code : Tout sélectionner

rep(com4>=4,3)
a     b     c     d     a     b     c     d     a     b     c     d
FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE
Donc la dernière valeur de f ne sera pas gardée.
Par contre la modalité "a" n'aurait pas du être conservée et dans les faits elle l'est parce que tu n'as pas appliqué ta sélections sur les modalités :

Code : Tout sélectionner

# modalités à conserver :
cons <- names(com4)[com4>=4]
cons
[1] "b" "c"
f[f%in%cons]
[1] "b" "b" "b" "b" "c" "c" "c" "c"
Après quand tu filtres un facteur, toutes les modalités sont conservées dans les levels même si elles ne sont plus visibles dans le facteur. Il faut souvent redéfinir un facteur pour enlever les modalités qui ne nous intéresse pas des levels :

Code : Tout sélectionner

f <- factor(f)
f[f%in%cons]
[1] b b b b c c c c
Levels: a b c d # a et d font toujours partie des levels

tapply(x[f%in%cons], f[f%in%cons], sd)
        a         b         c         d
       NA 1.0294942 0.8929915        NA # ici a et d apparaisse encore dans le tapply
 
tapply(x[f%in%cons], factor(f[f%in%cons]), sd)
         b         c
1.0294942 0.8929915 # a et d ont disparus
Je ne sais pas si c'est ça, mais en tout cas ce sont deux pistes à regarder.

Cordialement,
Maxime

Mattis Denonfoux
Messages : 9
Enregistré le : 05 Mai 2020, 14:13

Re: fonction tapply avec un test

Messagepar Mattis Denonfoux » 04 Juin 2020, 07:49

J'ai enfin réussi ce matin à l'appliquer (aussi sur des fonctions précédentes).
Un grand merci pour vos indications précises, vous êtes mon sauveur!

MD


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité