przekazywanie wektora zmiennych do Formuły lm()

Próbowałem zautomatyzować kawałek mojego kodu, aby programowanie stało się mniej żmudne. Zasadniczo starałem się dokonać stopniowego wyboru zmiennych za pomocą fastbw() w pakiecie RMS. Chciałbym przekazać listę zmiennych wybranych przez fastbw() do formuły jako y ~ x1+x2+x3, " x1 "" x2 "" x3 " jest lista zmiennych wybranych przez fastbw()

Oto kod, który próbowałem i nie zadziałał

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)

Jestem nowy w R i nadal nie mam za sobą stromej krzywej uczenia się, więc przepraszam za oczywiste błędy programistyczne. Każda pomoc jest bardzo doceniana

 34
Author: epo3, 2012-02-11

5 answers

Już prawie jesteś. Wystarczy paste całą formułę razem, coś w tym stylu:

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

Zmusić go do rzeczywistego wzoru za pomocą as.formula, a następnie przekazać , że do lm. Technicznie rzecz biorąc, myślę, że lm może zmuszać sam ciąg znaków, ale zmuszanie go samemu jest ogólnie bezpieczniejsze. (Niektóre funkcje, które oczekują formuł, nie wykonają przymusu za Ciebie, inne będą.)

 47
Author: joran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-11 06:08:43

W rzeczywistości musisz użyć collapse zamiast seb przy definiowaniu b.

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

Następnie możesz umieścić go w joran odpowiedź

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

Lub po prostu użyj:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "")
 15
Author: cconnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 01:21:17

Natknąłem się dziś na podobny problem, jeśli chcesz uczynić go jeszcze bardziej ogólnym, gdzie nawet nie musisz mieć stałej nazwy klasy, możesz użyć

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

Zakłada to, że w pierwszej kolumnie masz zmienną klasy lub zmienną zależną, ale indeksowanie można łatwo przełączyć na ostatnią kolumnę jako:

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

Następnie kontynuuj lm używając:

bestp.OAW0.r060 <- lm(frmla , data = modelready, ... )
 6
Author: discipulus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-10 13:27:32

Jeśli szukasz czegoś mniej gadatliwego:

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

Tutaj jest w funkcji:

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
 1
Author: Travis Heeter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-03 20:43:23

Aby uprościć i zebrać powyższe odpowiedzi, w oparciu o funkcję

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

Aby go użyć:

my_formula( dependent_var_position, myTrainSet)
 0
Author: user3169330,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 20:14:40