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