Подбор линейной модели / дисперсионного анализа по группам

Я пытаюсь запустить anova() в R и сталкиваюсь с некоторыми трудностями. Это то, что я делал до сих пор, чтобы пролить свет на мой вопрос.

Вот str() моих данных на данный момент.

 str(mhw)
'data.frame':   500 obs. of  5 variables:
$ r    : int  1 2 3 4 5 6 7 8 9 10 ...
$ c    : int  1 1 1 1 1 1 1 1 1 1 ...
$ grain: num  3.63 4.07 4.51 3.9 3.63 3.16 3.18 3.42 3.97 3.4 ...
$ straw: num  6.37 6.24 7.05 6.91 5.93 5.59 5.32 5.52 6.03 5.66 ...
$ Quad : Factor w/ 4 levels "NE","NW","SE",..: 2 2 2 2 2 2 2 2 2 2 ...

Столбец r представляет собой числовое значение, указывающее, в какой строке поля находится отдельный график. Столбец c представляет собой числовое значение, указывающее, в каком столбце находится отдельный график.
Столбец Quad соответствует географическому положению в поле, в котором находится каждый график.

Quad <- ifelse(mhw$c > 13 & mhw$r < 11, "NE",ifelse(mhw$c < 13 & mhw$r < 11,"NW", ifelse(mhw$c < 13 & mhw$r >= 11, "SW","SE")))
mhw <- cbind(mhw, Quad)

Я подошел к lm() следующим образом

nov.model <-lm(mhw$grain ~ mhw$straw)
anova(nov.model)

Это anova() для всего поля, которое проверяет урожай зерна по сравнению с урожаем соломы для каждого участка в наборе данных.

Моя проблема в том, что я хочу запустить отдельный anova() для столбца Quad моих данных, чтобы проверить урожай зерна и урожай соломы в каждом квадранте.

возможно, with() может это исправить. Я никогда не использовал его раньше и сейчас изучаю R. Любая помощь будет принята с благодарностью.


person pc8807    schedule 29.09.2016    source источник


Ответы (1)


Я думаю, вы ищете by объект в Р.

fit <- with(mhw, by(mhw, Quad, function (dat) lm(grain ~ straw, data = dat)))

Поскольку у вас есть 4 уровня в Quad, вы получаете 4 линейные модели в fit, т.е. fit является объектом класса "по" (тип "списка") длины 4.

Чтобы получить коэффициент для каждой модели, вы можете использовать

sapply(fit, coef)

Чтобы создать сводку модели, используйте

lapply(fit, summary)

Чтобы экспортировать таблицу ANOVA, используйте

lapply(fit, anova)

В качестве воспроизводимого примера я беру пример из ?by:

tmp <- with(warpbreaks,
            by(warpbreaks, tension,
               function(x) lm(breaks ~ wool, data = x)))

class(tmp)
# [1] "by"

mode(tmp)
# [1] "list"

sapply(tmp, coef)

#                    L         M         H
#(Intercept)  44.55556 24.000000 24.555556
#woolB       -16.33333  4.777778 -5.777778

lapply(tmp, anova)

#$L
#Analysis of Variance Table
#
#Response: breaks
#          Df Sum Sq Mean Sq F value  Pr(>F)  
#wool       1 1200.5 1200.50  5.6531 0.03023 *
#Residuals 16 3397.8  212.36                  
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#$M
#Analysis of Variance Table
#
#Response: breaks
#          Df  Sum Sq Mean Sq F value Pr(>F)
#wool       1  102.72 102.722  1.2531 0.2795
#Residuals 16 1311.56  81.972               
#
#$H
#Analysis of Variance Table
#
#Response: breaks
#          Df  Sum Sq Mean Sq F value Pr(>F)
#wool       1  150.22 150.222  2.3205 0.1472
#Residuals 16 1035.78  64.736

Я знал об этом варианте, но не был знаком с ним. Спасибо @Roland за предоставленный код для воспроизводимого выше примера:

library(nlme)
lapply(lmList(breaks ~ wool | tension, data = warpbreaks), anova)

Для ваших данных я думаю, что это было бы

fit <- lmList(grain ~ straw | Quad, data = mhw)
lapply(fit, anova)

nlme устанавливать не нужно; он поставляется с R в качестве одного из рекомендуемых пакетов.

person Zheyuan Li    schedule 29.09.2016
comment
Спасибо. Это обеспечивает coef данных. Если бы я хотел составить полное резюме по ановой, чтобы проверить гипотезу, отличается ли урожай зерна в восточном квадранте от западного. Как я могу сделать это с fit - person pc8807; 29.09.2016
comment
Сработало отлично. Огромное спасибо за помощь. Прошу прощения за простой характер вопросов. Как я уже сказал, я сейчас изучаю R и немного меняю свой синтаксис. - person pc8807; 29.09.2016
comment
Эта ссылка очень полезна. Это прояснило многие из моих побочных вопросов, которые возникли, когда я работал с Р. - person pc8807; 29.09.2016
comment
Или используйте lmList: library(nlme); lapply(lmList(breaks ~ wool | tension, data = warpbreaks), anova) - person Roland; 29.09.2016