144

応答変数と、3 つの共変量を含むデータがあるとします (おもちゃの例として)。

y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))

データに線形回帰を当てはめたい:

fit = lm(y ~ d$x1 + d$x2 + d$y2)

個々の共変量を書き出す必要がないように、式を書く方法はありますか? たとえば、次のようなもの

fit = lm(y ~ d)

(データフレームの各変数を共変量にしたい。)データフレームに実際に50個の変数があるので、書き出すのを避けたいx1 + x2 + x3 + etc.

4

6 に答える 6

236

すべての変数を意味するために数式で使用できる特別な識別子があります。それが.識別子です。

y <- c(1,4,6)
d <- data.frame(y = y, x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
mod <- lm(y ~ ., data = d)

次のようにして、1 つを除くすべての変数を使用することもできます (この場合、x3 は除外されます)。

mod <- lm(y ~ . - x3, data = d)

技術的には、式でまだ言及されていないすべての変数.を意味します。例えば

lm(y ~ x1 * x2 + ., data = d)

where.は as のみを参照x3x1x2すでに式に含まれています。

于 2011-03-09T20:20:36.163 に答える
70

少し異なるアプローチは、文字列から数式を作成することです。ヘルプ ページにはformula、次の例があります。

## Create a formula for a model with a large number of variables:
xnam <- paste("x", 1:25, sep="")
fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+")))

次に、生成された式を見ると、次のようになります。

R> fmla
y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + 
    x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + 
    x22 + x23 + x24 + x25
于 2011-03-09T22:20:40.633 に答える
9

はい、もちろん、応答yをデータフレームの最初の列として追加し、それを呼び出しますlm()

d2<-data.frame(y,d)
> d2
  y x1 x2 x3
1 1  4  3  4
2 4 -1  9 -4
3 6  3  8 -2
> lm(d2)

Call:
lm(formula = d2)

Coefficients:
(Intercept)           x1           x2           x3  
    -5.6316       0.7895       1.1579           NA  

<-また、R に関する私の情報は、 での代入が よりも推奨されることを指摘してい=ます。

于 2011-03-09T20:11:46.433 に答える
2

I build this solution, reformulate does not take care if variable names have white spaces.

add_backticks = function(x) {
    paste0("`", x, "`")
}

x_lm_formula = function(x) {
    paste(add_backticks(x), collapse = " + ")
}

build_lm_formula = function(x, y){
    if (length(y)>1){
        stop("y needs to be just one variable")
    }
    as.formula(        
        paste0("`",y,"`", " ~ ", x_lm_formula(x))
    )
}

# Example
df <- data.frame(
    y = c(1,4,6), 
    x1 = c(4,-1,3), 
    x2 = c(3,9,8), 
    x3 = c(4,-4,-2)
    )

# Model Specification
columns = colnames(df)
y_cols = columns[1]
x_cols = columns[2:length(columns)]
formula = build_lm_formula(x_cols, y_cols)
formula
# output
# "`y` ~ `x1` + `x2` + `x3`"

# Run Model
lm(formula = formula, data = df)
# output
Call:
    lm(formula = formula, data = df)

Coefficients:
    (Intercept)           x1           x2           x3  
        -5.6316       0.7895       1.1579           NA  

```

于 2017-11-15T00:53:41.927 に答える
0

パッケージleaps、特にregsubsets() モデル選択のための機能機能を確認できます。ドキュメントに記載されているように:

網羅的検索、順方向または逆方向のステップワイズ、または順次置換によるモデル選択

于 2017-05-03T10:02:51.963 に答える