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
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ą.)
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 = "")
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, ... )
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
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)
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