2016-06-25 5 views
-1

рассмотрим, например, «ирис» dataframe, который установлен с основной настройкой R:построения модели на подмножества dataframe

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 но R говорит t1=t2<>t3. почему я ошибаюсь? !!

теперь я снова построить свои модели, но на этот раз с креплением «ириса»:

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")) 

мне теперь и R и думают: t2=t3<>t1. но снова я смущен из-за эффекта прикрепления к модели! Я думаю, что первый набор моделей эквивалентен второму набору моделей, но R говорит нет! Благодарю.

+4

Первое примечание: вам не нужно помещать iris $ перед каждым именем переменной, когда функция использует data = iris. например, 'tm1 = lm (Sepal.Length ~ Sepal.Width + Petal.Length, data = iris)' работает. –

+1

Во-вторых, я думаю, что лучше создавать подмножества вне формулировок модели. например, 'setosa <- subset (iris, subset = Species ==" setosa ")', тогда вы можете запустить линейную модель на подмножестве. –

+0

, так что положить iris $ до того, как каждая переменная имеет некоторые эффекты на модели? @Twitch_City – moshtaba

ответ

1

два способа проведения линейной модели на подмножества:

Создание подмножества вручную

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

Используя подмножество аргумент в lm()

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

t1 и t2 эквивалентны. Однако, если вы используете iris$ в вызове lm(), 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 игнорирует его. Как упоминалось в комментариях, нет необходимости использовать foo$bar, когда поставляется data = foo, и эта ситуация выглядит хорошим примером того, почему этого не сделать.

Смежные вопросы