2010-09-16 10 views
0

J'ai cette feature_list qui contient plusieurs valeurs possibles, par exemple "A", "B", "C" etc. Et il y a du temps dans time_list. Donc, je vais avoir une boucle où je vais vouloir parcourir chacune de ces différentes valeurs et le mettre dans une formule. Quelque chose comme for(i in ...) et my_feature <- feature_list[i] et my_time <- time_list[i].Saisie de variables dans la fonction de régression

Puis-je mettre le temps et la fonction choisie à une trame de données à utiliser pour la régression

feature_list<- c("GPRS") 
time_list<-c("time") 
calc<-0 

feature_dim <- length(feature_list) 
time_dim <- length(time_list) 

data <- read.csv("data.csv", header = TRUE, sep = ";") 
result <- matrix(nrow=0, ncol=5) 
errors<-matrix(nrow=0, ncol=3) 

for(i in 1:feature_dim) { 
    my_feature <- feature_list[i] 
    my_time <- time_list[i] 

    fitdata <- data.frame(data[my_feature], data[my_time]) 

    for(j in 1:60) { 

     my_b <- 0.0001 * (2^j) 

     for(k in 1:60) { 
      my_c <- 0.0001 * (2^k) 
      cat("Feature: ", my_feature, "\t") 
      cat("b: ", my_b, "\t") 
      cat("c: ", my_c, "\n") 

      err <- try(nlsfit <- nls(GPRS ~ 53E5*exp(-1*b*exp(-1*c*time)), data=fitdata, start=list(b=my_b, c=my_c)), silent=TRUE) 
      calc<-calc+1 

      if(class(err) == "try-error") { 
       next 
      } 

      else { 
       coefs<-coef(nlsfit) 
       ess<-deviance(nlsfit) 
       result<-rbind(result, c(coefs[1], coefs[2], ess, my_b, my_c)) 
      } 
    } 
} 
} 

Maintenant, dans l'appel nls() Je veux être en mesure d'appeler my_feature au lieu de « A » ou « B "ou quelque chose et ensuite à la prochaine sur la liste. Mais j'ai une erreur là-bas. Qu'est-ce que je fais mal?

+1

1. Il est utile si vous indiquez quelle erreur vous obtenez (peut-être copier-coller le message d'erreur?) 2. Il y a faute d'orthographe dans votre code: arguments 'data' et' start' ne sont pas passés à 'nls' (l'accolade est proche trop tôt) – Marek

+0

ouais le code n'est pas exact car j'illustrais juste le problème. Ce qui est, je ne peux pas utiliser la variable my_feature à l'intérieur de l'appel nls, mais je peux seulement mettre "A" dans la formule. – sfactor

+0

J'ai mis la formule exacte maintenant – sfactor

Répondre

2

Vous pouvez utiliser la fonction Coller pour créer une version de chaîne de votre formule, y compris le nom de variable souhaité, puis utiliser les fonctions as.formula ou formula pour la convertir en formule à transmettre à nls.

as.formula(paste(my_feature, "~ 53E5*exp(-1*b*exp(-1*c*time))")) 

Une autre option consiste à utiliser la fonction bquote pour insérer les noms de variables dans un appel de fonction, puis à évaluer l'appel de fonction.

0

J'ai travaillé avec R il y a un certain temps, peut-être que vous pouvez donner à ce essayer:

Ce que vous voulez est de créer une formule avec une liste de variables droite?

donc si la variable de réponse est le premier élément de votre liste et les autres sont les variables explicatives, vous pouvez créer votre formule ainsi:

my_feature [0] ~ réduire (« + », my_feature [1: ]). Cela pourrait fonctionner. Ainsi, vous pouvez créer des formules dépendant des variables de my_features.

+0

la fonction est épelée avec une majuscule (Réduire), très importante dans R. A côté de cela, Reduce() ** applique ** la fonction "+", donc vous ne pouvez pas l'utiliser pour construire une formule. Vous obtenez soit le sume de my_feature [1:] soit la remarque que vous essayez d'appliquer un argument non numérique à un opérateur binaire. –

Questions connexes