Как выполнить ANOVA на результате различных моделей полиномиальной регрессии с различными уровнями степени, используя цикл for - PullRequest
1 голос
/ 18 марта 2020

Я довольно новичок в R, и я думаю, что моя проблема довольно проста, но я не могу решить ее. Я смотрел на подобные проблемы здесь, но я не могу найти решение для моей конкретной проблемы c.

Я использую набор данных Wage, который входит в состав пакета ISLR, чтобы попытаться смоделировать заработную плату как функцию возраста различных полиномиальных степеней.

  library(ISLR) 
attach(Wage)

Я выполняю регрессию на заработную плату с возрастом до 10 степени, а затем хочу применить тест на анову к каждой модели и изучить результаты. Самое близкое, что у меня есть, это;

  for (i in 1:10) {
    fit[[i]] <- lm(wage~poly(age, i) , data = Wage)
    result[[i]] <- aov(as.formula(paste(fit[i], "~ wage")))
  }

, что приводит к этой ошибке;

Error in model.frame.default(formula = as.formula(paste(fit[i], "~ wage")),  : 

недопустимый тип (список) для списка переменных (коэффициенты = c ((Intercept) = 111.703608201744, poly(age, i) = 447.067852758315), остатки = c (231655 = -19.3925481434428 , 86582 = -28,2033380861585, 161300 = 17,4500251413464, 155159 = 42,5676926169455, 11443 = -42,0253778623369, 376662 = 7,21810821763668, 450601 = 56,7036617292801, * 10213 816 = 818 = 818 = 818 = 818 = 818 = 818 = 818 = 818 = 818 = 8,125% = 8,725% = 8,725% = 8,725% = 8,725% = 8,7 / 818 = 8,100% = 8,7 = 8,125,725,725,725,7255,725,725 , 81404 = 10,197404483506, 302778 = 3,61466467869064, 305706 = -24,4688637359983, 8690 = -16,9669134309657, 153561 = 25,4168784550536, 449654 = 14,807739524331, 447660 457,27, 1030 * 177,29 1030 * 177,29 1030 * 177,29 1030 * 177,29 1030 = 177,29 -25,1943075097583, * * = тысяча тридцать один 95,773820436023, 301585 = 7,84450555272621, 153682 = -9,27460094600634, 158226 = 91,9620415895517, * = +1035 * -59,5891117312741, 448410 = -49,3664897185768, 305116 = 50,6467028157233, 233002 = -14.5085059894098, 8684 = 161.240161560035, 229379 = -28.0716427246922, 86064 = -40.6412633049063, 378472 = -5.75413931818888, `1

Любая помощь будет очень полезной и приносит свои извинения за то, что такой R нуб.

Спасибо !!

1 Ответ

0 голосов
/ 18 марта 2020

Чтобы ответить на ваш вопрос, вы можете сделать:

library(ISLR) 
attach(Wage)
fit <- vector("list",10)
result <- vector("list",10)
for (i in 1:10) {
    thisForm <- paste0("wage~poly(age, ",i,")")
    fit[[i]] <- lm(thisForm , data = Wage)
    result[[i]] <- aov(fit[[i]])
  }

Выше я создал формулу, чтобы вы могли видеть ее в объекте fit / aov вместо того, чтобы иметь i.

Обратите внимание, что подгонка lm уже находится в объекте aov, то есть вы можете получать коэффициенты, прогнозировать и делать то, что вам нужно, с помощью lm непосредственно на объекте aov. Вам не нужно хранить lm fit отдельно:

coefficients(result[[1]]) ; coefficients(fit[[1]])
 (Intercept) poly(age, i) 
    111.7036     447.0679 
 (Intercept) poly(age, i) 
    111.7036     447.0679 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...