calcul d'un score

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

Agatha Bataille
Messages : 14
Enregistré le : 06 Mar 2017, 10:31

calcul d'un score

Messagepar Agatha Bataille » 14 Mar 2017, 16:11

Bonjour,
Je bloque depuis un moment sur cette question, je me résous donc à demander un peu d'aide :)
J'ai une base de donner qui regroupe les réponses de plus de 500 individus à un questionnaire comportant 40 questions (les variables NPI_1 à NPI_40 renvoyant aux réponses des 500 individus pour chacune des 40 questions) avec pour réponses soit 1, soit 2. Je dois calculer le score pour chaque individu, je souhaiterais donc rajouter une variable correspondant au résultat
On m'a d'ailleurs donner la formule suivante mais je ne sais pas trop comment l'opérationnaliser sur R :

score. = ((int) $_POST['Q1'] == 1)
+ ((int) $_POST['Q2'] == 1)
+ ((int) $_POST['Q3'] == 1)
+ ((int) $_POST['Q4'] == 2)
+ ((int) $_POST['Q5'] == 2)
+ ((int) $_POST['Q6'] == 1)
+ ((int) $_POST['Q7'] == 2)
+ ((int) $_POST['Q8'] == 1)
+ ((int) $_POST['Q9'] == 2)
+ ((int) $_POST['Q10'] == 2)
+ ((int) $_POST['Q11'] == 1)
+ ((int) $_POST['Q12'] == 1)
+ ((int) $_POST['Q13'] == 1)
+ ((int) $_POST['Q14'] == 1)
+ ((int) $_POST['Q15'] == 2)
+ ((int) $_POST['Q16'] == 1)
+ ((int) $_POST['Q17'] == 2)
+ ((int) $_POST['Q18'] == 2)
+ ((int) $_POST['Q19'] == 2)
+ ((int) $_POST['Q20'] == 2)
+ ((int) $_POST['Q21'] == 1)
+ ((int) $_POST['Q22'] == 2)
+ ((int) $_POST['Q23'] == 2)
+ ((int) $_POST['Q24'] == 1)
+ ((int) $_POST['Q25'] == 1)
+ ((int) $_POST['Q26'] == 2)
+ ((int) $_POST['Q27'] == 1)
+ ((int) $_POST['Q28'] == 2)
+ ((int) $_POST['Q29'] == 1)
+ ((int) $_POST['Q30'] == 1)
+ ((int) $_POST['Q31'] == 1)
+ ((int) $_POST['Q32'] == 2)
+ ((int) $_POST['Q33'] == 1)
+ ((int) $_POST['Q34'] == 1)
+ ((int) $_POST['Q35'] == 2)
+ ((int) $_POST['Q36'] == 1)
+ ((int) $_POST['Q37'] == 1)
+ ((int) $_POST['Q38'] == 1)
+ ((int) $_POST['Q39'] == 1)
+ ((int) $_POST['Q40'] == 2);

Si vous avez des conseils, je suis toute ouïe :)

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: calcul d'un score

Messagepar Serge Rapenne » 14 Mar 2017, 16:16

Bonjour,

Si j'ai bien compris le pb, tu veux sommer pour chaque ligne, le nb de réponse qui valent 1 ou 2 selon les questions.
Une solution possible :

Code : Tout sélectionner

# Creation d'un jeu reduit de valeur pour l'exemple
dta<-structure(list(Q1 = c(1, 1, 2, 1, 2), Q2 = c(1, 2, 1, 2, 1),Q3 = c(1, 1, 1, 1, 1), Q4 = c(2, 1, 2, 1, 2), Q5 = c(1, 1, 1, 2, 2)), .Names = c("Q1", "Q2", "Q3", "Q4", "Q5"), row.names = c(NA,-5L), class = "data.frame")
dta
  Q1 Q2 Q3 Q4 Q5
1  1  1  1  2  1
2  1  2  1  1  1
3  2  1  1  2  1
4  1  2  1  1  2
5  2  1  1  2  2

#tu crées un variable avec le "bon" choix pour chaque question par exemple
choix=c(1,1,1,2,2)

#puis le calcul des sommes par ligne
dta$somme<-apply(dta,1,function(x) sum(x==choix))


Serge

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

Re: calcul d'un score

Messagepar Mickael Canouil » 16 Mar 2017, 10:13

Bonjour,

basée sur la proposition de Serge, voici avec mapply/colSums

Code : Tout sélectionner

dta$somme<-colSums(mapply("==", dta, choix))


Au niveau des performances, c'est la même chose:

Code : Tout sélectionner

microbenchmark::microbenchmark(
M1 = apply(dta,1,function(x) sum(x==choix)),
M2 = colSums(mapply("==", dta, choix))
)

Code : Tout sélectionner

Unit: microseconds
 expr    min      lq     mean median      uq     max neval cld
   M1 84.681 92.5445 97.86563 96.972 100.666 209.023   100   a
   M2 84.412 95.0490 98.72762 97.894 100.908 171.585   100   a
Mickaël
mickael.canouil.fr | rlille.fr

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

Re: calcul d'un score

Messagepar Logez Maxime » 16 Mar 2017, 12:43

Bonjour,

les temps de calculs ne semblent similaires que parce le dta de l'exemple est un tout petit data.frame. Si on augmente à 40 colonnes (réaliste par rapport au poste de départ) et à 1000 lignes alors les différence se font sentir :

Code : Tout sélectionner

dta<-structure(list(Q1 = c(1, 1, 2, 1, 2), Q2 = c(1, 2, 1, 2, 1),Q3 = c(1, 1, 1, 1, 1), Q4 = c(2, 1, 2, 1, 2), Q5 = c(1, 1, 1, 2, 2)), .Names = c("Q1", "Q2", "Q3", "Q4", "Q5"), row.names = c(NA,-5L), class = "data.frame")

dta <- dta[, rep(seq_along(dta), 8)]
dta <- dta[rep(1:nrow(dta), 200),]

choix <- sample(c(1,2), 40, rep = TRUE)

microbenchmark(
M1 = apply(dta,1,function(x) sum(x==choix)),
M2 = colSums(mapply("==", dta, choix))
)
Unit: milliseconds
 expr       min        lq      mean    median        uq      max neval
   M1  5.465806  5.751443  6.673562  5.908138  6.612318 12.87727   100
   M2 26.310703 26.751335 27.288291 26.979958 27.216133 32.28888   100

microbenchmark(
M1 = apply(dta,1,function(x) sum(x==choix)),
M2 = colSums(mapply("==", dta, choix)),
M3 = colSums(sweep(dta, 2, choix, "==")),
M4 = colSums(t(dta)==choix)
)
Unit: microseconds
 expr       min        lq      mean    median        uq        max neval
   M1  5591.917  5804.493  6453.249  5928.338  6315.543  10756.038   100
   M2 26258.219 26585.390 27208.645 26757.188 27090.777  30245.055   100
   M3  3158.432  3280.578  6476.149  3380.637  6014.803 114385.838   100
   M4   843.508   954.327  1279.749   982.645  1017.382   5588.896   100
Moralité le code le plus efficace est le code vectoriser qui fait appel au recyclage :

Code : Tout sélectionner

colSums(t(dta)==choix)

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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