Как построить и протестировать несколько моделей в R - PullRequest
0 голосов
/ 19 мая 2018

Предположим, у меня есть такой набор данных (забудьте о распределении):

modData <- data.frame("A" = rnorm(20, 15, 3),
                      "B" = rnorm(20, 20, 3),
                      "C" = rnorm(20, 25, 3),
                      "X" = rnorm(20, 5, 1)
                      )

Если я использую X в качестве предиктора, A, B и C в качестве ответов соответственно:

md1 <- lm(A ~ X, data = modData)
md2 <- lm(B ~ X, data = modData)
md3 <- lm(C ~ X, data = modData)

Затем выполните тест Шапиро и боксбокс для каждой модели, например:

shapiro.test(residuals(md1))
boxcox(md1, plotit = T)

Существует ли удобный способ построения и тестирования нескольких моделей без ввода каждой из них вручную?их?

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Вот альтернативный подход с использованием tidyverse:

modData <- data.frame("A" = rnorm(20, 15, 3),
                      "B" = rnorm(20, 20, 3),
                      "C" = rnorm(20, 25, 3),
                      "X" = rnorm(20, 5, 1))
library(tidyverse)
library(broom)

# specify predictor and target variables
x = "X"
y = names(modData)[names(modData)!= x]

expand.grid(y,x) %>%                                    # create combinations
  mutate(model_id = row_number(),                       # create model id
         frml = paste0(Var1, "~", Var2)) %>%            # create model formula
  group_by(model_id, Var1, Var2) %>%                    # group by the above
  nest() %>%                                            # nest data
  mutate(m = map(data, ~lm(.$frml, data = modData)),    # create models
         m_table = map(m, ~tidy(.)),                    # tidy model output
         st = map(m, ~shapiro.test(residuals(.)))) -> dt_model_info  # shapiro test

# access model info
dt_model_info
dt_model_info$m
dt_model_info$m_table
dt_model_info$st

# another way to access info
dt_model_info %>% unnest(m_table)
0 голосов
/ 19 мая 2018

Если вы не хотите вводить десятки зависимостей, вы можете сделать это с помощью простого sapply.Обратите внимание, что я не предоставляю boxcox часть, потому что я не знаю, откуда она (машина, МАССА?).

modData <- data.frame("A" = rnorm(20, 15, 3),
                      "B" = rnorm(20, 20, 3),
                      "C" = rnorm(20, 25, 3),
                      "X" = rnorm(20, 5, 1))

deps <- c("A", "B", "C")
indeps <- c("X")

result <- sapply(deps, FUN = function(x, indeps, mydata) {
  myformula <- formula(sprintf("%s ~ %s", x, indeps))

  model <- lm(myformula, data = mydata)
  out.shapiro <- shapiro.test(residuals(model))

  return(list(model = model, shapiro = out.shapiro))
}, indeps = indeps, mydata = modData, simplify = FALSE)
0 голосов
/ 19 мая 2018

Вот подход с использованием простого слова "lapply":

# 1. Data set
df <- data.frame(
  a = rnorm(20, 15, 3),
  b = rnorm(20, 20, 3),
  c = rnorm(20, 25, 3),
  x = rnorm(20, 5, 1))

# 2. Models
fit_lm_a <- lm(a ~ x, df)
fit_lm_b <- lm(b ~ x, df)
fit_lm_c <- lm(c ~ x, df)

# 3. List of models
list_fit_lm <- list(fit_lm_a, fit_lm_b,fit_lm_c)

# 3. Shapiro test
lapply(
  list_fit_lm, function(x) {
    shapiro.test(residuals(x)) 
  })

 # 4. Box-Cox Transformations
 lapply(
  list_fit_lm, function(x) {
    boxcox(x, plotit = TRUE, data = df)
  }
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...