2016-06-25 6 views
-1

例えばRの主なセットアップでインストールされている「アイリス」のデータフレーム考える:今、私は「アイリス」を付けずに3つのモデルを構築データフレームのサブセットでモデルを構築

names(iris) 
# [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species" 
levels(iris$Species) 
# [1] "setosa"  "versicolor" "virginica" 

を:

t1=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris) 

t2=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris[iris$Species=="setosa",]) 

t3=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris , subset = (iris$Species=="setosa")) 

私はt2=t3<>t1だと思いますが、t1=t2<>t3と書いてあります。なぜ私は間違っているのですか?今私とRが思う両方

attach(iris) 

t1=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris) 

t2=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris[iris$Species=="setosa",]) 

t3=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris , subset = (iris$Species=="setosa")) 

今私は再び私のモデルが、「アイリス」を装着すると、この時間を構築するt2=t3<>t1。しかし、私はモデルに取り付けることの効果のために再び混乱しています!私はモデルの最初のセットはモデルの2番目のセットに相当すると思いますが、Rはいいえと言います!ありがとう。サブセットに線形モデルを実施するための

+4

最初の注意:関数がdata = irisを使用する場合、各変数名の前にiris $を置く必要はありません。 'tm1 = lm(Sepal.Length〜Sepal.Width + Petal.Length、data = iris)'が働きます。 –

+1

第2に、モデルステートメントの外にサブセットを作成する方が良いと思います。例えば、 'setosa < - subset(iris、subset = Species ==" setosa ")'とすると、その部分集合に対して線形モデルを実行することができます。 –

+0

それで、各変数の前にiris $を入れて、モデルにいくつかの影響を与えますか? @Twitch_City – moshtaba

答えて

1

二つの方法:

lm()

t2 <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data=iris, subset = Species == "setosa") 

t1t2でサブセット引数を使用して手動で

setosa <- subset(iris, subset = Species == "setosa") 
t1 <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data=setosa) 

のサブセットを作成等価です。ただし、lm()コールでiris$を使用すると、Rは、data(おそらくはsubset)に渡される内容を無視します。これは、データフレームではなく関数にベクトルを明示的に与えるためです。これは、lm()を使用する間違った方法です。

1

これはスコープの問題です。次の場合:

t1=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris) 

t2=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris[iris$Species=="setosa",]) 

t3=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris , subset = (iris$Species=="setosa")) 

あなたが望む結果を得ることができます。

coef(t1) == coef(t2) 
(Intercept) iris$Sepal.Width iris$Petal.Length 
    FALSE    FALSE    FALSE 

coef(t2) == coef(t3) 
(Intercept) Sepal.Width Petal.Length 
    TRUE   TRUE   TRUE 

あなたがiris$Sepal.Lengthを言うとき、Rはすでにその値を検索する場所を知っています。従って、subset引数は冗長であり、Rはそれを無視する。コメントに記載されているように、data = fooが提供される場合、foo$barを使用する必要はありません。このような状況は、そうしない理由の良い例に見えます。

関連する問題