Передайте вектор переменных в формулу lm ()

Я пытался автоматизировать часть своего кода, чтобы программирование стало менее утомительным.

В основном я пытался сделать пошаговый выбор переменных, используя fastbw() в пакете rms. Я хотел бы передать список переменных, выбранных fastbw(), в формулу как y ~ x1+x2+x3, "x1" "x2" "x3" - это список переменных, выбранных fastbw()

Вот код, который я пробовал, но не сработал

olsOAW0.r060 <- ols(roll_pct~byoy+trans_YoY+change18m, 
                    subset= helper=="POPNOAW0_r060", 
                    na.action = na.exclude, 
                    data = modelready)

OAW0 <- fastbw(olsOAW0.r060, rule="p", type="residual", sls= 0.05)

vec <- as.vector(OAW0$names.kept, mode="any")

b <- paste(vec, sep ="+") ##I even tried b <- paste(OAW0$names.kept, sep="+")

bestp.OAW0.r060 <- lm(roll_pct ~ b , 
                      data = modelready, 
                      subset = helper =="POPNOAW0_r060",    
                      na.action = na.exclude)

Я новичок в R и до сих пор не прошел крутой курс обучения, поэтому приношу свои извинения за очевидные ошибки в программировании.


person Anand    schedule 11.02.2012    source источник


Ответы (6)


Ты почти там. Вам просто нужно paste объединить всю формулу, примерно так:

paste("roll_pct ~ ",b,sep = "")

приведите его к реальной формуле с помощью as.formula, а затем передайте это в lm. С технической точки зрения, я думаю, что lm может привести к принуждению самой строки символов, но принуждение ее самостоятельно, как правило, безопаснее. (Некоторые функции, которые ожидают формул, не будут выполнять принуждение за вас, другие сделают.)

person joran    schedule 11.02.2012
comment
JJoran, спасибо, у меня все еще есть ошибка. Пожалуйста, посмотрите hpi ‹- paste (byoy, change18m, change24m, change18m0, change24m0, lag3byoy, lag3change18m, lag3change24m, lag6byoy, lag6change18m, lag6change24m, trans_YoY, sepform =‹ +) - as.formula (paste (roll_pct ~, hpi, sep =)) lmNGC0.r060 ‹- lm (hpi.form, subset = helper == POPNOANGC0_r060, na.action = na.exclude, data = modelready)› Ошибка в модели .frame.default (formula = as.formula (paste (roll_pct ~, hpi,: переменная длина отличается (найдено для 'hpi') - person Anand; 13.02.2012
comment
@ user1199861 Вы поместили hpi в кавычки во второй строке. Введите hpi.form в консоли, и вы поймете, почему это неправильно. - person joran; 13.02.2012
comment
Джоран, еще раз спасибо, я думаю, что lm () не приводит объект hpi в формулу как строку символов. Когда я попытался ввести переменные в формулу lm (), это сработало. - person Anand; 13.02.2012
comment
@ user1199861 Нет, вы неправильно склеили. Вы написали: paste("roll_pct~", "hpi", sep = ""), а не paste("roll_pct~", hpi, sep = ""), как я указал в своем ответе. - person joran; 13.02.2012
comment
Джоран, спасибо, ты заметил это. На этот раз получилось ... спасибо за терпение со мной - person Anand; 14.02.2012
comment
не работает с формулой в stats :: aggregate function - person Peter.k; 17.07.2017
comment
@ Peter.k Да, aggregate - это один из тех случаев, когда вам нужно заставить его самостоятельно с помощью as.formula. - person joran; 17.07.2017
comment
Я обнаружил, что вам нужно использовать collapse вместо sep в первом paste (для вектора) (как предлагается в несколько упущенном ответе @cconnell) - person James; 05.02.2020

На самом деле вам нужно будет использовать collapse вместо seb при определении b.

b <- paste(OAW0$names.kept, collapse="+")

Тогда вы можете поместить это в ответ Джорана

paste("roll_pct ~ ",b,sep = "")

или просто используйте:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "")
person cconnell    schedule 08.11.2012

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

frmla <- as.formula(paste(colnames(modelready)[1], paste(colnames(modelready)[2:ncol(modelready)], sep = "", 
                              collapse = " + "), sep = " ~ "))

Это предполагает, что у вас есть переменная класса или зависимая переменная в первом столбце, но индексирование можно легко переключить на последний столбец как:

frmla <- as.formula(paste(colnames(modelready)[ncol(modelready)], paste(colnames(modelready)[1:(ncol(modelready)-1)], sep = "", 
                              collapse = " + "), sep = " ~ "))

Затем продолжите с lm, используя:

bestp.OAW0.r060 <- lm(frmla , data = modelready, ... )
person discipulus    schedule 10.11.2015
comment
Этому ответу почти 3 года, но он очень простой и элегантный - и сэкономил мне много времени - проголосовать за. - person Hatt; 31.07.2018

Если вы ищете что-то менее подробное:

fm <- as.formula( paste( colnames(df)[i], ".", sep=" ~ ")) 
                                      # i is the index of the outcome column

Вот он в функции:

getFormula<-function(target, df) {

  i <- grep(target,colnames(df))
  as.formula(paste(colnames(df)[i], 
                   ".", 
                   sep = " ~ "))
}
fm <- getFormula("myOutcomeColumnName", myDataFrame)
rp <- rpart(fm, data = myDataFrame) # Use the formula to build a model
person Travis Heeter    schedule 03.12.2016

просто для упрощения и сбора приведенных выше ответов на основе функции

my_formula<- function(colPosition, trainSet){
    dep_part<- paste(colnames(trainSet)[colPosition],"~",sep=" ")
    ind_part<- paste(colnames(trainSet)[-colPosition],collapse=" + ")
    dt_formula<- as.formula(paste(dep_part,ind_part,sep=" "))
    return(dt_formula)
}

Чтобы использовать это:

my_formula( dependent_var_position, myTrainSet)
person ameet chaubal    schedule 23.08.2018

Один из приемов, который я использую в аналогичных ситуациях, - это подмножество ваших данных и простое использование, например, lm(dep_var ~ ., data = your_data).

Пример

data(mtcars)
ind_vars <- c("mpg", "cyl")
dep_var <- "hp"

temp_subset <- dplyr::select(mtcars, dep_var, ind_vars)

lm(hp ~., data = temp_subset)
person JerryTheForester    schedule 05.01.2021