データフレームから多くの変数を含む数式を簡潔に記述する方法は?


127

(おもちゃの例として)応答変数と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ます。



回答:


202

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

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 .は、式x3としてのみ参照されx1x2すでに式に含まれています。


データフレーム 'd'には4つの列(y、x1、x2、x3)があります。したがって、式が「y〜。」の場合、右側は、左側にリストされている列を除く「すべての列」を意味するのでしょうか。
stackoverflowuser2010

1
@ stackoverflowuser2010はい、.技術的には、data まだ式に含まれていないすべての変数を意味します。
Gavin Simpson、

1
@theforestecologist dataは、式の変数がリストから検索されるリストである場合は、そうです。data引数には、データフレーム、リスト、または環境を使用できます。そうでない場合は、もう少し拡張する必要があります。
Gavin Simpson

@Gavin。それが私が意味したことです。ありがとう。リストされた変数としてのdata [[x]]を実際の変数名(たとえば、「x3」)として使用して、このメソッドをどのように進めますか?例えば、どのように私は、次の仕事になるだろう?:lm(d[[1]] ~ d[[3]] + ., data = d)
theforestecologist

namesリストの外で機能します。あなたが持っていると言うll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))、次の作品を:lm(y ~ x + ., data = ll)。したがって、既にリストである場合を除いて、このようなデータを使用する理由は多くありませんが、機能します。数式の要素が同じ長さであるという要件は、リストの内容にいくつかの制限を課します。より複雑なオブジェクトには、おそらく必要な要素を抽出するためのコードが必要です。場合はd[[1]]、データフレーム/行列は、あなたがその仕事をするコードが必要だった
ギャビン・シンプソン

66

少し異なるアプローチは、文字列から数式を作成することです。で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

1
これは、ファイルからこれらの値を読み取るのに非常に適しています。ありがとう!
Ben Sidhom 14

as.formulaの部分は必須であることに注意してください
Wang

7

もちろん、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に関する私の情報<-は、での割り当てはよりも推奨されていることを指摘してい=ます。


ありがとう!ええ、私は誰もが常に<-を使用するように言うのを知っていますが、誰も理由を言わず、=はタイプするのが簡単です=)。
grautur

2
@gratur一つの理由は、のようなものということでfoo(bar <- 1:10)仕事(とがbar作成される)が、foo(bar = 1:10)ので、どちらか失敗するであろうbarの引数ではありませんfooし、作成されませんbarどちらか。
Gavin Simpson

2
の係数はなぜx3 NAですか?
ziyuang 2013

6

ジュバの方法の拡張はreformulate、そのようなタスクのために明示的に設計された関数を使用することです。

## Create a formula for a model with a large number of variables:
xnam <- paste("x", 1:25, sep="")

reformulate(xnam, "y")
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

OPの例では、ここで最も簡単な解決策は

# add y variable to data.frame d
d <- cbind(y, d)
reformulate(names(d)[-1], names(d[1]))
y ~ x1 + x2 + x3

または

mod <- lm(reformulate(names(d)[-1], names(d[1])), data=d)

の従属変数をdata.frameに追加d <- cbind(y, d)すると、を使用できるようになるだけでなく、のような関数でオブジェクトreformulateを将来使用できるようになるため、優先されることに注意してください。lmpredict


2

私はこのソリューションを構築しますが、reformulate変数名に空白が含まれているかどうかは気にしません。

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  

「」


0

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

徹底的な検索、順方向または逆方向の段階的、または順次置換によるモデルの選択

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.