Подтвердить что ты не робот

Перенос вектора переменных в формулу 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 и до сих пор не знаю, крутая кривая обучения, поэтому приношу свои извинения за очевидные ошибки в программировании. Любая помощь очень ценится

4b9b3361

Ответ 1

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

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

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

Ответ 2

При определении b вам действительно нужно использовать коллапс вместо seb.

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

Затем вы можете поместить его в joran answer

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

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

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

Ответ 3

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

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, ... )

Ответ 4

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

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