2013-02-27 4 views
-1

я нашел следующий код в интернетеКакова функция I()?

mod1 <- lm(mpg ~ weight + I(weight^2) + foreign, auto)

Что такое функция I()? Кажется, что результат weight^2 такой же, как I(weight^2).

+9

Вы читали 'help (I)'? Если нет, прочитайте. Если да, сообщите нам, что вы не понимаете. –

+2

Обратите внимание, что просто сравнение «weight^2» с 'I (вес^2)' ** в командной строке ** не является подходящим критерием для их подобия при использовании в формуле. Там, поскольку применяются дополнительные формулы синтаксического анализа и интерпретации, два вызова * отличаются друг от друга. –

+0

'? Formula' - еще один дополнительный хороший ресурс с примерами использования' I() 'в формуле. – Alex

ответ

12

Функция I() является изолировать терминов в формулах от обычной формулы синтаксического анализа & синтаксиса. В кадрах данных используются другие виды использования I(), где он помогает создавать объекты, которые имеют или наследуют от класса "AsIs", который позволяет встраивать объекты без обычного преобразования, которое имеет место.

В формуле случае, как это то, что вы конкретно спросить, ^ специальная формула оператор, который указывает на пересечение условий к n й степени, где n дается после оператора, как так: ^n. Таким образом, ^ не имеет обычной арифметической интерпретации в формуле. (Точно так же, как -, +, / и * операторы также имеют специальную формулу значения и в результате I() требуется, чтобы использовать их, чтобы изолировать их от формулы разборе инструментов.)

В конкретном примере, вы даете (я 'проиллюстрируем использование встроенного набора данных trees), если вы забудете использовать I() вокруг квадратичного члена, R в этом случае полностью игнорирует этот термин, так как Volume (weight в вашем примере) уже находится в модели и вы запрашиваете многопоточные взаимодействия переменной с самим собой, что не является квадратичным термином.

Сначала без I():

> lm(Height ~ Volume + Volume^2, data = trees) 

Call: 
lm(formula = Height ~ Volume + Volume^2, data = trees) 

Coefficients: 
(Intercept)  Volume 
    69.0034  0.2319 

Обратите внимание, как только Volume член в формуле? Правильная спецификация для квадратичной модели (на самом деле это не может быть, смотри ниже) является

> lm(Height ~ Volume + I(Volume^2), data = trees) 

Call: 
lm(formula = Height ~ Volume + I(Volume^2), data = trees) 

Coefficients: 
(Intercept)  Volume I(Volume^2) 
    65.33587  0.47540  -0.00314 

Я сказал, что это не может быть правильным; это связано с корреляцией между Volume и Volume^2 . An identical but more stable fit can be achieved by the use of orthogonal polynomials, which poly() `может производить для вас. Таким образом, более стабильный Speficiation будет:

> lm(Height ~ poly(Volume, 2), data = trees) 

Call: 
lm(formula = Height ~ poly(Volume, 2), data = trees) 

Coefficients: 
    (Intercept) poly(Volume, 2)1 poly(Volume, 2)2 
      76.000   20.879   -5.278 

Обратите внимание, что подгонка идентична предыдущей модели, хотя с различными оценки коэффициентов в качестве входных данных разные (ортогональные полиномы против исходных многочленов). Вы можете увидеть это их summary() выход, если вы не верите мне:

> summary(lm(Height ~ poly(Volume, 2), data = trees)) 

Call: 
lm(formula = Height ~ poly(Volume, 2), data = trees) 

Residuals: 
    Min  1Q Median  3Q  Max 
-11.2266 -3.6728 -0.0745 2.4073 9.9954 

Coefficients: 
       Estimate Std. Error t value Pr(>|t|)  
(Intercept)  76.0000  0.9322 81.531 < 2e-16 *** 
poly(Volume, 2)1 20.8788  5.1900 4.023 0.000395 *** 
poly(Volume, 2)2 -5.2780  5.1900 -1.017 0.317880  
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 5.19 on 28 degrees of freedom 
Multiple R-squared: 0.3808, Adjusted R-squared: 0.3365 
F-statistic: 8.609 on 2 and 28 DF, p-value: 0.001219 

> summary(lm(Height ~ Volume + I(Volume^2), data = trees)) 

Call: 
lm(formula = Height ~ Volume + I(Volume^2), data = trees) 

Residuals: 
    Min  1Q Median  3Q  Max 
-11.2266 -3.6728 -0.0745 2.4073 9.9954 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 65.335867 4.110886 15.893 1.52e-15 *** 
Volume  0.475398 0.246279 1.930 0.0638 . 
I(Volume^2) -0.003140 0.003087 -1.017 0.3179  
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 5.19 on 28 degrees of freedom 
Multiple R-squared: 0.3808, Adjusted R-squared: 0.3365 
F-statistic: 8.609 on 2 and 28 DF, p-value: 0.001219 

Обратите внимание на разницу в т для-тестов линейных и квадратичных членов в моделях. Именно здесь помогает ортогональность входных полиномиальных членов.

Для того чтобы действительно увидеть, что ^ делает в формуле (в случае терминология в ?formula не то, что вы знакомы с, рассмотрит эту модель:

> lm(Height ~ (Girth + Volume)^2, data = trees) 

Call: 
lm(formula = Height ~ (Girth + Volume)^2, data = trees) 

Coefficients: 
(Intercept)   Girth  Volume Girth:Volume 
    75.40148  -2.29632  1.86095  -0.05608 

Как есть два члена в (...)^2, формула разбор код преобразует это в основные эффекты двух переменных плюс их взаимодействие 2-го порядка. Эта модель может быть более лаконично записана как Height ~ Girth * Volume, но ^ помогает, когда вы хотите взаимодействия более высокого порядка или взаимодействия между большим числом переменных.

+0

Позволяет ли 'I()' создавать дополнительные переменные для регрессии типа I (log (Volume + 1)) 'и вы можете использовать эти новые переменные во взаимодействиях? например '(I (log (Volume + 1)) + Girth)^ – Alex

+0

А, ок, похоже, это объясняется в'? Formula', а не '? I'. – Alex

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