objet formula et modification

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

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

objet formula et modification

Messagepar Mickael Canouil » 04 Avr 2011, 12:30

Bonjour, j'ai besoin d'effectuer une modification d'un objet formula en ajoutant un terme, j'ai la fonction ci dessous pour le faire, néanmoins n'y a t-il pas une meilleure solution?

Merci par avance de votre aide

Code : Tout sélectionner

newFormulaOffset <- function (formula) {
    terms <- attributes(terms.formula(formula))$term.labels
    fixEff <- terms[-grep("|",terms,fixed=T)]
    randEff <- terms[grep("|",terms,fixed=T)]
    newFormula <- paste(formula[[2]],"~")
    if (length(fixEff)>=1) {
      newFormula <- paste(newFormula,fixEff[1])
      for (i in 2:length(fixEff)) {
         newFormula <- paste(newFormula,fixEff[i],sep=" + ")
        }
   } else {}
    if (length(randEff)!=0) {
        newFormula <- paste(newFormula,"+(",randEff,")")
    } else {}
   newFormula <- as.formula(paste(newFormula,"offset(trajTypique)",sep=" + "),env=parent.frame())
    return(newFormula)
}
# newFormulaOffset(formula=y~x+z+(1|id))

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

Messagepar Logez Maxime » 04 Avr 2011, 12:49

Bonjour,

Code : Tout sélectionner

update(formula, ~.+offset(trajTypique))

Maxime

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

Messagepar Mickael Canouil » 04 Avr 2011, 12:55

merci beaucoup!
dans le même ordre d'idée pour récupérer uniquement dans
y~x+z+e+(1|id)
les "x", "z" et "e" ?

les méthodes terms, all.vars, etc fournissent la totalités des termes, y en a t'il une spécifique pour récupérer ces noms de variables?

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

Messagepar Matthieu Lesnoff » 04 Avr 2011, 18:33

Mickael Canouil a écrit :les méthodes terms, all.vars, etc fournissent la totalités des termes, y en a t'il une spécifique pour récupérer ces noms de variables?


je ne pense pas (?) car "1|id" est aussi une variable, mais vous pouvez y arriver facilement par :

Code : Tout sélectionner

> f <- formula(y~x+z+e+(1|id))
> z <- all.vars(f)[-1]
> z[-c(length(z))]
[1] "x" "z" "e"


ou :

Code : Tout sélectionner

> z <- attr(terms(f), "term.labels")
> z[-c(length(z))]
[1] "x" "z" "e"
ML

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

Messagepar Mickael Canouil » 05 Avr 2011, 10:31

merci beaucoup

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

Messagepar Logez Maxime » 06 Avr 2011, 12:23

Bonjour,

le code de Matthieu est efficace mais ne fonctionne pas si le terme aléatoire est placé à la fin.

Code : Tout sélectionner

f <- y~ x+(1|ed)+z
auxi <- attr(terms(f), "term.labels")
vars <- all.vars(f)[-1]

randoms <- vars[grep("\\|", auxi)]
fixes <- setdiff(vars, randoms)

Maxime

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

Messagepar Mickael Canouil » 07 Avr 2011, 08:19

comment s'utilise le double backslash dans le grep?
j'ai l'impression que ça fait exactement comme l'option fixed=TRUE.

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

Messagepar Logez Maxime » 07 Avr 2011, 08:27

?regexp
In basic regular expressions the metacharacters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \ {, \|, \(, and \). Thus the metacharacters are . \ [ ^ $ *.

Effectivement ça semble avoir le même effet puisque chaque élément sera regardé comme un caractère. Je penche plutôt pour l'utilisation de \\ devant un méta-caractère parce que lorsque tu utiliseras des expressions régulière un peu plus complexes il est intéressant de pouvoir se servir des symboles comme \\b ou \\d et dans ce cas la il n'est pas souhaitable qu'il soit interpréter comme des caractères.
Maxime

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

Messagepar Mickael Canouil » 07 Avr 2011, 10:36

merci pour ce complément d'information


Retourner vers « Questions en cours »

Qui est en ligne

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