Question

Je voudrais écrire une fonction R qui accepte une formule comme premier argument, similaire à lm () ou GLM () et les amis. Dans ce cas, il est une fonction qui prend une trame de données et écrit un fichier au format SVMLight , qui a cette forme générale:

<line> .=. <target> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info>
<target> .=. +1 | -1 | 0 | <float> 
<feature> .=. <integer> | "qid"
<value> .=. <float>
<info> .=. <string>

par exemple, la trame de données suivante:

  result qid     f1     f2     f3     f4   f5     f6     f7     f8
1     -1   1 0.0000 0.1253 0.0000 0.1017 0.00 0.0000 0.0000 0.9999
2     -1   1 0.0098 0.0000 0.0000 0.0000 0.00 0.0316 0.0000 0.3661
3      1   1 0.0000 0.0000 0.1941 0.0000 0.00 0.0000 0.0509 0.0000
4     -1   2 0.0000 0.2863 0.0948 0.0000 0.34 0.0000 0.7428 0.0608
5      1   2 0.0000 0.0000 0.0000 0.4347 0.00 0.0000 0.9539 0.0000
6      1   2 0.0000 0.7282 0.9087 0.0000 0.00 0.0000 0.0000 0.0355

serait représentée comme suit:

-1 qid:1 2:0.1253 4:0.1017 8:0.9999
-1 qid:1 1:0.0098 6:0.0316 8:0.3661
1  qid:1 3:0.1941 7:0.0509
-1 qid:2 2:0.2863 3:0.0948 5:0.3400 7:0.7428 8:0.0608
1  qid:2 4:0.4347 7:0.9539
1  qid:2 2:0.7282 3:0.9087 8:0.0355

La fonction que je voudrais écrire serait appelé quelque chose comme ceci:

write.svmlight(result ~ f1+f2+f3+f4+f5+f6+f7+f8 | qid, data=mydata, file="out.txt")

Ou même

write.svmlight(result ~ . | qid, data=mydata, file="out.txt")

Mais je ne peux pas comprendre comment utiliser model.matrix() et / ou model.frame() savoir quelles colonnes il est censé écrire. Est-ce les bonnes choses à regarder?

Toute aide appréciée!

Était-ce utile?

La solution

réponse partielle. Vous pouvez indicer un objet de formule pour obtenir un arbre d'analyse syntaxique de la formule:

> f<-a~b+c|d
> f[[1]]
`~`
> f[[2]]
a
> f[[3]]
b + c | d
> f[[3]][[1]]
`|`
> f[[3]][[2]]
b + c
> f[[3]][[3]]
d

Maintenant, tout ce dont vous avez besoin est un code pour marcher cet arbre.

Mise à jour. Voici un exemple d'une fonction qui marche l'arbre

walker<-function(formu){
  if (!is(formu,"formula"))
    stop("Want formula")
  lhs <- formu[[2]]
  formu <- formu[[3]]

  if (formu[[1]]!='|')
    stop("Want conditional part")

  condi <- formu[[3]]

  flattener <- function(f) {if (length(f)<3) return(f);
                            c(Recall(f[[2]]),Recall(f[[3]]))}
  vars <- flattener(formu[[2]])

  list(lhs=lhs,condi=condi,vars=vars)
}

walker(y~a+b|c)

Regardez aussi la documentation terms.formula et terms.object. En regardant le code pour certaines fonctions qui prennent des formules conditionnelles peuvent aider, par exemple. la fonction de lmer dans le set de lme4.

Autres conseils

je

formu.names <- all.vars(formu)
Y.name <- formu.names[1]
X.name <- formu.names[2]
block.name <- formu.names[3]

Dans le code, j'ai écrit au sujet de faire un post-hoc pour un test friedman:

http: //www.r-statistics.com/2010/02/post-hoc-analysis-for-friedmans-test-r-code/

Mais il ne fonctionne que pour: Y`X | bloc

J'espère que pour d'autres une meilleure réponse donneront.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top