Ввод переменных в функцию регрессии - PullRequest
0 голосов
/ 16 сентября 2010

У меня есть этот feature_list, который содержит несколько возможных значений, скажем, «A», «B», «C» и т. Д. И в time_list есть время.

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

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

Затем я помещаю время и выбранную функцию в кадр данных, который будет использоваться для регрессии

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" или что-то еще, а затем перейти к следующему в списке. Но я получаю ошибку там. Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2010

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

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

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

0 голосов
/ 16 сентября 2010

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

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

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

my_feature [0] ~ lower ("+", my_feature [1:])Это может работать.

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

...