Aggregate function shapiro.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

Simon chevolleau
Messages : 4
Enregistré le : 27 Mar 2019, 09:05

Aggregate function shapiro.test

Messagepar Simon chevolleau » 27 Mar 2019, 10:00

Bonjour,

J'ai un j'aimerai appliqué un test de shapiro sur une aggrégation de donnée d'une colonne en fonction d'un code donnée par une autre colonne. J'aimerai faire cette commande sur autant de fois qu'il y a d'autre colonne que la colonne donnant le code. Voici mes données (ne contenant que 3 colonnes, j'en ai une bonne vingtaine sinon):
dput(data1)
structure(list(moda = structure(c(20L, 20L, 20L, 20L, 20L, 20L,
20L, 20L, 20L, 20L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L,
11L, 11L, 11L, 11L, 11L, 11L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 17L, 17L, 17L,
17L, 17L, 17L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L,
18L, 18L, 18L, 18L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L,
19L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 12L,
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L,
13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 14L, 14L, 14L,
14L, 14L, 14L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L,
16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 21L, 21L, 21L,
21L, 21L, 21L, 21L, 21L, 21L, 21L, 22L, 22L, 22L, 22L, 22L, 22L,
22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L,
23L), .Label = c("ACN1", "ACN2", "BA", "BM", "BS1", "BS2", "CN",
"EK5", "HW1", "HW2", "HW3", "L27", "L5K", "LC", "M2K", "M630",
"PB1", "PB2", "PB3", "PG", "RMB", "RMC", "RMM"), class = "factor"),
epicotyle = c(1.5, 1.5, 2, 1, 1.5, 1.2, 1, 2.4, 1.3, 1.4,
1.7, 2, 1.8, 2.3, 2.5, 2.5, 1.5, 1.5, 2, 1.3, 1.5, 1.8, 1.3,
1.8, 1.7, 1.5, 2.3, 1.8, 2.2, 1.5, 1.5, 1.5, 1.3, 1.5, 1.5,
1.5, 1.5, 1.8, 1.5, 2.1, 1.8, 1.3, 2, 1.5, 2, 3.5, 1.5, 1.7,
1.7, 2, 1.7, 2, 1.5, 2, 1.5, 2, 2, 1.5, 2, 1.5, 1.8, 1, 2,
3, 1.6, 1.5, 1.5, 1.3, 1.5, 1.5, 1.2, 1.5, 1.5, 1, 1.2, 1.5,
1.5, 1.5, 1.5, 2, 1.1, 1.5, 1.5, 1.7, 1.8, 1.5, 1.3, 1.5,
1.5, 2.5, 1.2, 1.4, 1, 1.5, 2, 1.5, 1.2, 1.5, 2, 2.3, 2.1,
2, 2.4, 1.5, 1.7, 1.4, 2.4, 1, 1, 2, 1.5, 1.2, 2.4, 1.2,
1, 0.8, 1.8, 1.5, 1.5, 1.5, 2.1, 1.5, 1.4, 1.5, 1.3, 1.5,
3, 2.6, 1.5, 2.2, 1.9, 1.5, 1.4, 1.4, 2.5, 2.1, 2, 1.5, 2,
2, 2, 1.5, 2.1, 2, 1.5, 2.5, 2.5, 3, 3, 3.5, 3.5, 3, 2, 2.5,
3.5, 1, 1.2, 1.5, 2.5, 1.5, 1.5, 1.5, 1.5, 1.5, 2.4, 1.5,
2, 3, 1.7, 3, 2.5, 2, 2.5, 2.5, 2.5, 1.5, 1.5, 1.5, 1, 1.5,
2, 1.4, 1.2, 1.7, 2.1, 1.5, 2, 1.5, 1.5, 2, 1.4, 2, 3, 2,
2, 2, 2.5, 3, 3, 1.7, 3, 1.8, 2, 1.8, 2.2, 2.3, 1.5, 2, 1.8,
1.8, 1.3, 2, 1.8, 1.8, 2, 1.8, 1.5, 1.7, 2, 1.4, 1.5, 1.7,
1.5, 2, 1.2, 1.3, 1.5, 1, 2, 1), hypocotyle = c(3.8, 4, 7,
5, 6, 4, 5.4, 3.5, 3.6, 5, 5, 7, 2.5, 6.5, 5.4, 5, 6, 5.7,
7, 5.5, 5.7, 5.5, 7, 6.5, 5.5, 5.5, 6.7, 4.9, 5.3, 6.7, 5.8,
6.5, 6, 5.6, 5, 5.5, 6, 6, 6, 3.5, 4.7, 4.5, 5.9, 5, 6, 7,
6, 5.5, 5, 5.8, 5.5, 5.5, 4.8, 5.7, 6, 7, 5.2, 5, 5.2, 5.3,
5.6, 5, 5.3, 6, 5, 5.5, 4.5, 5.7, 6, 4.5, 4.4, 5.2, 5.2,
4.1, 5.2, 5.2, 5.4, 6, 5.5, 6.5, 5, 6, 5.5, 7.5, 5.2, 5.6,
5.4, 5.5, 5, 5, 6, 5.2, 6, 6.3, 6.3, 4.2, 5.1, 3.5, 6, 6,
6, 6, 5, 5, 6, 5, 5.6, 5.5, 5, 5, 6, 5.2, 6, 6.3, 6.3, 4.2,
5.1, 3.8, 4, 7, 5, 6, 4, 5.4, 3.5, 3.6, 5, 6, 4.8, 4.7, 4.4,
5.5, 3.5, 5.3, 4.3, 5.5, 4.5, 5.5, 4.2, 6, 4.3, 4, 4.7, 3.5,
3.7, 4.2, 5, 5, 5.1, 5.7, 5, 3.5, 4, 5.6, 3.9, 3.5, 7, 6,
6, 6, 6.5, 5.5, 4.5, 6.5, 6.5, 3, 5, 5.5, 5.3, 4, 5.5, 6,
4, 5.5, 6, 5, 4, 4.5, 4.5, 4, 3.5, 4.5, 5, 4, 4.5, 5, 4.7,
6, 3.8, 4.5, 4.1, 4, 3.7, 4, 4.5, 5, 6, 4.5, 6, 5.7, 3.7,
5.8, 6.2, 5.5, 5, 3.8, 4, 7, 5, 6, 4, 5.4, 3.5, 3.6, 5, 7,
6.5, 8, 6.5, 5.7, 7.5, 7.3, 7.4, 7, 7.5, 7.3, 7.1, 7.3, 7.3,
7.2)), class = "data.frame", row.names = c(NA, -230L))

J'ai essayé les commandes suivantes :
> shap <- function(y) { b <- shapiro.test(y); c(b$statistic, b$p.value)}
> aggre <- function (p) {aggregate(formula =p~data1[,1],
+ data = data1,
+ FUN = shap)}
> lshap <- lapply(data1, aggre)
Error in shapiro.test(y) : is.numeric(x) is not TRUE
J'avais aussi essayé de faire la fonction aggregate(formula =.~data1[,1]data = data1,FUN = shap) sans succès.
Pourtant ma fonction aggre marche lorsque je sélectionne une seul colonne.

Merci d'avoir pris la peine de me lire,
Simon

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

Re: Aggregate function shapiro.test

Messagepar Pierre-Yves Berrard » 27 Mar 2019, 12:16

Bonjour,

Le problème semble venir du fait que vous appliquez la fonction aggre sur une colonne catégorielle (moda). Essayer en excluant la première colonne :

Code : Tout sélectionner

lapply(data1[-1], aggre)

Remarque additionnelle : comme shap ne renvoie pas une valeur unique et qu'aggregate renvoie un data.frame, bien noter que la colonne p du résultat est une matrice et non un simple vecteur (ce qui n'est pas intuitif en regardant l'affichage dans la console).

PS : pour plus de lisibilité, pensez à utiliser les balises [code]...[/code].
PY

Simon chevolleau
Messages : 4
Enregistré le : 27 Mar 2019, 09:05

Re: Aggregate function shapiro.test

Messagepar Simon chevolleau » 27 Mar 2019, 15:49

Je vous remercie infiniment, le code marche parfaitement.

Je ne sais pas si cela est possible, mais auriez-vous une idée pour effectuer un t.test ou un wilcox.test en fonction des 2 P.value de normalité obtenues dans la matrice pour une même modalité et également en fonction de deux P.value obtenues en fonction d'un test de Bartlett dans la même matrice (je vais rajouter cette fonction en plus maintenant que j'ai un peu mieux saisi). Puis de donner sous forme de data.frame ou de matrice le résultat du t.test ou du wilcox.test.

Je peux ouvrir un nouveau sujet si vous préfereriez.

Je vais essayer quelques exemples de commande et j'éditerai mon message par la suite.
EDIT:
J'ai essayé le code suivant néanmoins je ne comprends pourquoi un argument est inutilisé alors que j'ai fixé dans la function bartl ma colonne des modalités:

Code : Tout sélectionner

> shap <- function(y) { b <- shapiro.test(y); b$p.value}
> aggre <- function (p) {aggregate(formula =p~data1[,1],
+           data = data1,
+           FUN = shap, bartl)}
> lshap <- lapply(data1[-1], aggre)
Error in as.data.frame.default(x) :
  cannot coerce class ‘"function"’ to a data.frame

Pour la suite je ne sais pas si cela est faisable mais je mettrai bien un dataframe renvoyant une colonne modalité, puis une autre p.value shap et encore une autre p.value bartl.
Donc si je suis cette logique après il faudrait que je puisse faire une condition if (mes 2 p.value pour une modalité >0.05) {aggregate (... wilcox/t.test)
ou alors si c'est faisable faire un aggregate avec la condition et me renvoyer la p.value. Je pense qu'il risque d'y avoir un problème dans ma démarche car pour le t.test et wilcox.test il faudrait qu'il compare donc 2 variables (2 colonnes) tout en se basant sur le code de la colonne modalité.

Je vois encore plus loin mais j'imagine qu'en sachant faire ça je pourrai aisément appliqué une commande pour dire en fonction de la p.valuefinal obtenue renvoie moi pour >0.05 NS; <0.05 * etc

EDIT2: Nouvel essai en essayant d'effectuer l'opération bartl en dehors, et l'idée aurait-été de faire un df qui réunirait les P.value de shap et bartl:

Code : Tout sélectionner

> bartl <- function (p) {barte <- bartlett.test(p, data1[,1])}
> aggre <- function (p) {aggregate(formula =p~data1[,1],
+           data = data1,
+           FUN = bartl)}
> lshap <- lapply(data1[-1], aggre)
Error in bartlett.test.default(p, data1[, 1]) :
  'x' and 'g' must have the same length


EDIT3: Cette fois ci j'ai utilisé 2 arguments dans ma fonction bartl, mais lorsque je l'utilise en faisant lshap il ne reconnait pas l'argument de la fonction bartl:

Code : Tout sélectionner

> lshap <- lapply(data1[-1], aggre, yy=data1[,1])
Error in FUN(X[[i]], ...) : unused argument (yy = data1[, 1])
> bartl <- function(p, yy){barte <- bartlett.test(p,yy)}
> aggre <- function (p) {aggregate(formula =p~data1[,1],
+           data = data1,
+           FUN = bartl)}
> lshap <- lapply(data1[-1], aggre, yy=data1[,1])
Error in FUN(X[[i]], ...) : unused argument (yy = data1[, 1])

Simon

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Aggregate function shapiro.test

Messagepar Mickael Canouil » 27 Mar 2019, 17:05

Bonjour,

le plus simple est avec un exemple:

Code : Tout sélectionner

f <- function(arg1) mean(arg1)
g <- function(arg1, arg2) {
  f(arg2[[arg1]])
}

f(iris[, "Sepal.Length"])
#> [1] 5.843333
f(arg1 = iris[, "Sepal.Length"])
#> [1] 5.843333
f(arg1 = iris[, "Sepal.Length"], arg2 = 1)
#> Error in f(arg1 = iris[, "Sepal.Length"], arg2 = 1): unused argument (arg2 = 1)

g(iris[, "Sepal.Length"])
#> Error in mean(arg1): argument "arg2" is missing, with no default
g(arg1 = iris[, "Sepal.Length"])
#> Error in mean(arg1): argument "arg2" is missing, with no default
g(arg1 = "Sepal.Length", arg2 = iris)
#> [1] 5.843333



lapply(X = iris[, -5], FUN = f)
#> $Sepal.Length
#> [1] 5.843333
#>
#> $Sepal.Width
#> [1] 3.057333
#>
#> $Petal.Length
#> [1] 3.758
#>
#> $Petal.Width
#> [1] 1.199333


lapply(X = colnames(iris[, -5]), FUN = g)
#> Error in mean(arg1): argument "arg2" is missing, with no default
lapply(X = colnames(iris[, -5]), FUN = g, yy = iris)
#> Error in FUN(X[[i]], ...): unused argument (yy = iris)
lapply(X = colnames(iris[, -5]), FUN = g, arg2 = iris)
#> [[1]]
#> [1] 5.843333
#>
#> [[2]]
#> [1] 3.057333
#>
#> [[3]]
#> [1] 3.758
#>
#> [[4]]
#> [1] 1.199333


Votre fonction "aggre" n'a pas d'argument se nommant "yy" (comme l'indique plutôt bien l'erreur)
Le champ "formula", ne doit contenir que des noms de variables présentes dans l'objet fourni dans "data" de aggregate().

EDIT: vous devriez travailler dans un fichier R via un éditeur de texte, et faire les copier depuis ce fichier plutôt que depuis la console. (si nous voulons essayer le code, nous sommes obligé de retirer les > et +)

Sinon, ce que vous cherchez ce ne serait pas:

Code : Tout sélectionner

lshap <- lapply(X = data1[, -1], FUN = bartlett.test, g = data1[, 1])
lshap
#> $epicotyle
#>
#>  Bartlett test of homogeneity of variances
#>
#> data:  X[[i]] and data1[, 1]
#> Bartlett's K-squared = 48.886, df = 22, p-value = 0.0008276
#>
#>
#> $hypocotyle
#>
#>  Bartlett test of homogeneity of variances
#>
#> data:  X[[i]] and data1[, 1]
#> Bartlett's K-squared = 53.432, df = 22, p-value = 0.0001976


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Simon chevolleau
Messages : 4
Enregistré le : 27 Mar 2019, 09:05

Re: Aggregate function shapiro.test

Messagepar Simon chevolleau » 27 Mar 2019, 17:25

Merci pour la réponse,

Désolé je pour les >, c'était pour illustrer les erreurs obtenues. Votre réponse en Edit n'est pas exactement ce que je recherche car le test de Bartlett est fait sur l'ensemble de la colonne epicotyle et hypocotyle, alors que l'idéal serait effectuer un test de bartlet sur une partie de la colonne epicotyle et hypocotyle, en réalité cette partie serait définie par la colonne modalité où le code est le même.

Merci Mickaël pour l'exemple je vois un peu mieux comme écrire la syntaxe de mon code.

EDIT: voici ce que j'ai essayé après avoir vu ton exemple:

Code : Tout sélectionner

bartl <- function(p, yy){barte <- bartlett.test(p,yy)}
aggre <- function (yy, p) {aggregate(formula =p~data1[,1],
          data = data1,
          FUN = bartl <- function(p, yy){barte <- bartlett.test(p,yy); barte$p.value})}

lshap <- lapply(data1[-1], FUN= aggre, yy=data1[,1])
Error in bartlett.test.default(p, yy) :
  argument "yy" is missing, with no default
 


Je ne saisi pas bien pourquoi l'argument yy n'est pas reconnu.

EDIT: Puisque l'argument yy ne bougera pas et qu'il m'indique qu'il n'y a pas de valeur par défaut, j'ai tout simplement créer une valeur par défaut (même si l'approche n'est pas correcte). Le problème dorénavant et qu'il ne considère pas que x et g de la fonction bartlett ont les même longuer or les longueurs sont les mêmes et ce pour toutes les colonnes...

Code : Tout sélectionner

bartl <- function(p, yy=data1[,1]){barte <- bartlett.test(p,yy)}
aggre <- function (yy=data1[,1], p) aggregate(formula =p~data1[,1],
          data = data1,
          FUN = function (p,yy=data1[,1]) {bartlett.test(p,yy)})

lshap <- lapply(data1[-1], FUN= aggre, yy=data1[,1])

Error in bartlett.test.default(p, yy) :
  'x' and 'g' must have the same length

lapply(data1, length)
$moda
[1] 230

$epicotyle
[1] 230

$hypocotyle
[1] 230

Cordialement,

Simon


Retourner vers « Questions en cours »

Qui est en ligne

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