55

プログラミングが面倒にならないように、コードの一部を自動化しようとしていました。

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を初めて使用しますが、まだ急な学習曲線をたどっていません。そのため、明らかなプログラミングの失敗をお詫びします。

4

6 に答える 6

65

もうすぐです。paste次のように、数式全体をまとめる必要があります。

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

を使用して実際の数式に強制変換し、それas.formulaに渡します。技術的には、文字列自体を強制することもできると思いますが、一般的には自分で強制する方が安全です。(数式を期待する関数の中には、強制を行わないものもあれば、強制するものもあります。)lmlm

于 2012-02-11T06:08:43.357 に答える
28

bを定義するときは、実際にはsebの代わりにcollapseを使用する必要があります。

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

その後、あなたはそれをジョランの答えに入れることができます

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

または単に使用します:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "")
于 2012-11-08T01:21:17.773 に答える
11

今日も同様の問題が発生しました。クラス名を固定する必要がない、さらに一般的なものにしたい場合は、次を使用できます。

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, ... )
于 2015-11-10T13:27:32.463 に答える
3

より冗長でないものを探している場合:

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
于 2016-12-03T20:43:23.057 に答える
1

同様の状況で私が使用するトリックの1つは、データをサブセット化して、たとえばを使用すること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)
于 2021-01-05T10:49:34.300 に答える
0

関数に基づいて、上記の回答を単純化して収集するだけです

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)
于 2018-08-23T20:14:40.603 に答える