Fonction avec svytable

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

Elodie Magnat
Messages : 15
Enregistré le : 07 Nov 2015, 06:29

Fonction avec svytable

Messagepar Elodie Magnat » 26 Avr 2016, 04:46

Bonjour,

J'utilise une base de données (bdd) pondérées et je voudrais créer une fonction me permettant d'obtenir un tableau simple avec les proportions et les intervalles de confiance voulues pour remplacer ce code : (bdd = base de donnée, CS7 = nom d'une variable, pond = variable des poids)

Code : Tout sélectionner

dw <- svydesign(ids=~1,data=bdd,weights=~bdd$pond

options(digits=3)

f <- freq(svytable(~CS7,dw))
          n    % val%
1     40637 25.4 25.4
2    118657 74.1 74.1
999     919  0.6  0.6
VIDE     23  0.0  0.0

prop1 <- svyciprop(~I(CS7==1),dw)
prop2 <- svyciprop(~I(CS7==2),dw)
prop3 <- svyciprop(~I(CS7==999),dw)
prop4 <- svyciprop(~I(CS7==VIDE),dw)

x <- matrix(c(f[1,1],prop1[1],confint(prop1),f[2,1],prop2[1],confint(prop2),f[3,1],prop3[1],confint(prop3),f[4,1],prop4[1],confint(prop4)),nrow=4,byrow=T)
X <- data.frame(x)
names(X) <- c("Nb", "%", "IC-", "IC+")
> X
      Nb       %      IC-    IC+
1  40637 25.3606 22.14874 28.865
2 118657 74.0517 70.54422 77.276
3    919  0.5734  0.31790  1.032
4     23  0.0143  0.00202  0.102


Je commence à écrire ma fonction et j'ai déjà une erreur :

PropIC = function(bdd,VarA)
{ dw <- svydesign(ids=~1,data=bdd,weights=~bdd$pond)
f <- freq(svytable(~VarA,dw),total=T)
return (f)
}

Code : Tout sélectionner

> PropIC(bdd,CS7)
Error in eval(expr, envir, enclos) : object 'VarA' not found
Called from: eval(expr, envir, enclos)
Browse[1]>


Idem en faisant PropIC(bdd,bdd$CS7)

Est-ce que quelqu'un saurait d'où provient ce problème ?

Merci,

Gabriel Terraz
Messages : 593
Enregistré le : 26 Sep 2011, 15:11

Re: Fonction avec svytable

Messagepar Gabriel Terraz » 26 Avr 2016, 06:21

Salut,
L'erreur te dit 'objet varNA not found', cela veut dire que tu as sois une faute de frappe et que tu ne voulais pas dire varNA, sois que tu n'as pas du tout défini cet objet en amont.

dicko ahmadou
Messages : 444
Enregistré le : 21 Nov 2009, 20:15

Re: Fonction avec svytable

Messagepar dicko ahmadou » 26 Avr 2016, 13:09

Salut,

Tu peux utiliser la fonction reformulate pour construire une formule, elle transforme les chaines de caractères en formule
Il suffira juste de changer le second paramètre de ta fonction et mettre la nom de la variable sous forme de caractère.
J'ai pas tes données pour tester mais je pense que ça devrait marcher.

Code : Tout sélectionner

PropIC <- function(bdd, VarA) {
  stopifnot(is.character(VarA) & VarA %in% names(bdd))
  dw <- svydesign(ids = ~1, data = bdd, weights = ~bdd$pond)
  f <- freq(svytable(reformulate(VarA), dw), total = TRUE)
  f
}

PropIC(bdd, "CS7")
The best thing about being a statistician is that you get to play in everyone's backyard.
John Tukey

Elodie Magnat
Messages : 15
Enregistré le : 07 Nov 2015, 06:29

Re: Fonction avec svytable

Messagepar Elodie Magnat » 26 Avr 2016, 23:56

Bonjour,

Merci cela fonctionne très bien.

Par contre, je n'arrive pas à transformer le svyciprop(~I(CS7==1),dw) avec la fonction reformulate.
J'ai essayé

Code : Tout sélectionner

svyciprop(reformulate(VarA==1),dw)
svyciprop(reformulate(I(VarA==1)),dw)
svyciprop(reformulate(I(VarA))==1,dw)

ET d'autres encore...

J'ai également été obligé de rajouter un argument VarB = bdd$CS7 pour pouvoir définir les différents niveau de facteur... et ainsi appeler toutes les svyciprop...

Voilà où en est ma fonction :

Code : Tout sélectionner

PropIC = function(bdd,VarA,VarB)
   {   stopifnot(is.character(VarA))
      options(digits=3)
      data <- data.frame()
      Lev <- levels(factor(VarB))
      dw <- svydesign(ids=~1,data=bdd,weights=~bdd$weightsRaking)
      f <- freq(svytable(reformulate(VarA),dw),total=T)
      x <- nrow(freq(svytable(reformulate(VarA),dw))) #connaitre le nombre de facteurs de VarA
      #f <- cprop(svytable(reformulate(VarA),dw))si varA = "SD4+SD1" #parait beaucoup trop compliqué !
      g <- svyciprop(reformulate(I(VarA==1)),dw)
      #for (i in 1:x)
         #{data[i,1] <- f[i,1]
           #data[i,2] <- svyciprop(~I(VarA==Lev[i]),dw)[1]  #ne fonctionne pas avec Lev[i] trouver une autre solution (arguments ?)
           #data[i,3] <- confint(svyciprop(~I(.....),dw))}
      return(g)
   }


C'est ma toute première fonction. Je trouve que ça rend les choses compliquées qu'on ne puisse pas mettre en argument d'une fonction le nom d'une variable ! PropIC(bdd,CS7) arrangerait bcp de choses !

Merci pour votre aide.

dicko ahmadou
Messages : 444
Enregistré le : 21 Nov 2009, 20:15

Re: Fonction avec svytable

Messagepar dicko ahmadou » 27 Avr 2016, 14:24

Tu compliques un peu les choses, j'ai bien dit que reformulate prends en paramètre une chaine de caractère.
Donc la commande ci-dessous devrait marcher:

Code : Tout sélectionner

svyciprop(reformulate("I(VarA == 1)") ,dw)


Si tu as des doutes, cherches a comprendre la différence entre mon code et le tien.

Amicalement,
The best thing about being a statistician is that you get to play in everyone's backyard.

John Tukey

Elodie Magnat
Messages : 15
Enregistré le : 07 Nov 2015, 06:29

Re: Fonction avec svytable

Messagepar Elodie Magnat » 27 Avr 2016, 21:50

J'avais bien compris que reformulate prenait en paramètre une chaine de caractères.

Ta solution fonctionne dans la console en tapant :

Code : Tout sélectionner

svyciprop(reformulate("I(CS7==1)"),dw)


Mais dans la fonction, VarA est déjà une chaine de caractère. Si dans la fonction c'est :

Code : Tout sélectionner

svyciprop(reformulate("I(VarA==1)"),dw)


Et que j'appelle la fonction en faisant :

Code : Tout sélectionner

> PropIC(bdd,"CS7")
Error in svyglm.survey.design(I(VarA == 1) ~ 1, design, family = quasibinomial) :
  all variables must be in design= argument
Called from: svyglm.survey.design(I(VarA == 1) ~ 1, design, family = quasibinomial)
Browse[1]>


Ca ne fonctionne pas car il fait :

Code : Tout sélectionner

svyciprop(reformulate("I("CS7"==1)"),dw


Bref, ce que je veux faire semble impossible. J'ai donc créer ma fonction des arguments en plus : VarB="I(CS7==1)", VarC="I(CS7==2)", VarD="I(CS7==999)" etc.... Je voulais rendre cela automatique...

dicko ahmadou
Messages : 444
Enregistré le : 21 Nov 2009, 20:15

Re: Fonction avec svytable

Messagepar dicko ahmadou » 28 Avr 2016, 21:57

Ah ok, je vois.
Tu as deux options, tu peux utiliser sprintf ou paste0 pour construire ta formule puis l'utiliser dans la fonction.
Tu peux par exemple essayer un truc du genre:

Code : Tout sélectionner

fm <- paste0("I(", VarA, " == 1)")
svyciprop(reformulate(fm),dw)


Ou

Code : Tout sélectionner

fm <- printf("I(%s == 1)", VarA)
svyciprop(reformulate(fm), dw)


Sachant que VarA est une chaine de caractère.
The best thing about being a statistician is that you get to play in everyone's backyard.

John Tukey

Elodie Magnat
Messages : 15
Enregistré le : 07 Nov 2015, 06:29

Re: Fonction avec svytable

Messagepar Elodie Magnat » 03 Mai 2016, 00:32

Merci cela fonctionne très bien... Et j'ai pu terminé ma fonction (qui prend d'ailleurs bcp d'arguments !! )

Code : Tout sélectionner

#PropIC1 = function(bdd,VarA,VarAA,x,x1,x2,x3,x4,x5,x6,y=1) avec x = nb de facteurs, x1 = levels(VarA)[1].... M=method et y nombre de chiffres après la virgule

> PropIC1(bdd,bdd$CS7,"CS7",4,1,2,999,0,M="li",y=2)     
 Nb     %   IC-   IC+
1   244 25.41 22.19 28.91
2   886 74.00 70.49 77.23
999  13  0.58  0.32  1.03
0     1  0.01  0.00  0.10


Mais par exemple, si dans la fonction, c'est :

Code : Tout sélectionner

fm1 <- paste0("I(",VarAA,"==",x1,")")
svyciprop(reformulate(fm1),dw)


Lorsque x1 est un chiffre, cela fonctionne très bien mais si x1="oui" par exemple, je n'arrive pas à changer la formule pour que ça fonctionne...

Savez-vous comment faire ?

J'aimerais également ne plus saisir les x1, x2, x3 en arguments de la fonction... xi étant les différents facteurs de la variable... J'ai essayé en faisant dans la fonction :

Code : Tout sélectionner

x1 <- levels(VarA)[1]
x2 <- levels(VarA)[2]....


mais ça ne fonctionne pas avec le code ci-dessus paste0 et reformulate :-( !

dicko ahmadou
Messages : 444
Enregistré le : 21 Nov 2009, 20:15

Re: Fonction avec svytable

Messagepar dicko ahmadou » 03 Mai 2016, 06:41

Salut,

Tu peux utiliser la fonction shQuote

Code : Tout sélectionner

shQuote(c("a", "b", "c"))
[1] "'a'" "'b'" "'c'"


Donc tu peux par exemple faire une serie de commande du style:

Code : Tout sélectionner

x1 <- shQuote(levels(VarA)[1])
fm1 <- paste0("I(",VarAA,"==",x1,")")
svyciprop(reformulate(fm1),dw)
The best thing about being a statistician is that you get to play in everyone's backyard.

John Tukey

Elodie Magnat
Messages : 15
Enregistré le : 07 Nov 2015, 06:29

Re: Fonction avec svytable

Messagepar Elodie Magnat » 04 Mai 2016, 02:26

Merci Merci Dicko !

J'ai changé en :

Code : Tout sélectionner

x1 <- shQuote(levels(VarA),type="sh")[1]

et ça fonctionne :-) !

J'ai une belle fonction maintenant qui donne des intervalles de confiance en fonction également d'une autre variable :

Code : Tout sélectionner

> PropIC2(bdd,bdd$CS7,"CS7",bdd$SD1)
$`Province Sud`
       Nb     %           IC95%
Oui   123 28.3% [24.2% ; 32.9%]
Non   295 71.7% [67.1% ; 75.8%]
NSP     0    0%       [0% ; 0%]
VIDE    0    0%       [0% ; 0%]
Total 418   100               

$`Province Nord`
       Nb     %           IC95%
Oui    71 17.4% [13.9% ; 21.6%]
Non   317 79.9% [75.5% ; 83.7%]
NSP    11  2.7%     [1.5% ; 5%]
VIDE    0    0%       [0% ; 0%]
Total 399   100               

$`Province Iles`
       Nb     %           IC95%
Oui    50 14.9% [11.4% ; 19.3%]
Non   274   84% [79.4% ; 87.6%]
NSP     2  0.9%   [0.2% ; 3.6%]
VIDE    1  0.2%     [0% ; 1.6%]
Total 327   100 


Je n'arrive pas par contre à obtenir un beau tableau dans Word mais j'ouvre un autre poste...
ENCORE merci dicko :-) !


Retourner vers « Questions en cours »

Qui est en ligne

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

cron