2010-09-16 3 views
0

У меня есть этот список_функций, который содержит несколько возможных значений, например «A», «B», «C» и т. Д. И есть время в time_list.Ввод переменных в функцию регрессии

Итак, у меня будет цикл, где я захочу пройти через каждое из этих разных значений и поместить его в формулу.

что-то вроде for(i in ...), а затем my_feature <- feature_list[i] и my_time <- time_list[i].

Тогда я положил время и выбранную функцию к dataframe, которые будут использоваться для регрессионного

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)) 
      } 
    } 
} 
} 

Сейчас в nls() вызов Я хочу, чтобы быть в состоянии назвать my_feature вместо просто «A» или «B "или что-то, а затем к следующему в списке. Но я получаю сообщение об ошибке. Что я делаю не так?

+1

1. Полезно, если вы сообщите, какую ошибку вы получите (возможно, сообщение об ошибке копирования)? 2. В вашем коде имеется опечатка: аргументы 'data' и' start' не передаются в 'nls' (скобка закрыта слишком рано) – Marek

+0

Да, код не является точным, поскольку я просто иллюстрировал проблему. Это то, что я не могу использовать переменную my_feature внутри вызова nls, но может только поставить «A» в формулу. – sfactor

+0

Я установил точную форму сейчас – sfactor

ответ

2

Вы можете использовать вставку для создания строковой версии вашей формулы, включая нужное имя переменной, а затем использовать либо функции as.formula, либо formula, чтобы преобразовать это в формулу для перехода к nls.

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

Другой вариант заключается в использовании функции bquote для вставки имен переменных в вызове функции, то Eval вызов функции.

0

Я работал с R некоторое время назад, может быть, вы можете дать этому попытку:

Что вы хотите создать формулу со списком переменных верно?

так, если переменная отклика является первый элемент из списка и остальные объясняющие переменные, которые вы можете создать свою формулу следующим образом:

my_feature [0] ~ уменьшить («+», my_feature [1: ]). Это может сработать.

Таким образом, вы можете создавать формулы, зависящие от переменных в my_features.

+0

функция написана с капиталом (Уменьшить), очень важным в R. Рядом с этим, Reduce() ** применяет ** функцию «+», поэтому вы не можете использовать ее для построения формулы. Вы либо получаете sume my_feature [1:], либо уведомление о том, что вы пытаетесь применить нечисловой аргумент к двоичному оператору. –

Смежные вопросы