Циклы по спискам переменных - встроенные циклы - PullRequest
1 голос
/ 28 марта 2020

Я давний пользователь STATA, наконец пытаюсь освоить R, чтобы я мог улучшить свою графику. В следующем коде я подгоняю GAM к выходной переменной y1, используя 5 переменных воздействия x1 - x5, а затем строю графики прогнозов для x1.

Что я хочу сделать, так это иметь два цикла, один встроенный в другой так что первый l oop итерирует по 5 результатам, подгоняя GAM для каждого, а затем, во встроенной второй l oop, он итерирует по 5 экспозициям, составляя прогнозы для каждого. Результат будет двадцать пять участков 5 переменных от каждого из пяти GAM. В реальной базе данных переменные не нумеруются, поэтому для имен переменных в виде строк необходимо l oop.

y1.gam <- mgcv::gam(y1~s(x1,bs="cr",fx=TRUE)+
                   s(x2,bs="cr",fx=TRUE)+
                   s(x3,bs="cr",fx=TRUE)+
                   s(x4,bs="cr",fx=TRUE)+
                   s(x5,bs="cr",fx=TRUE)+
                  family = poisson(link = "log"),
                  data = data)
y1.x1.plot <- plotGAM(gamFit = y1.gam , smooth.cov = "x1", groupCovs = NULL,
       plotCI=TRUE, orderedAsFactor = FALSE)

Если это поможет, вот как это будет go в STATA:

global outcome y1 y2 y3 y4 y5
global exposure x1 x2 x3 x4 x5

foreach v of varlist $outcome {
    gam `v’ $exposure, …
    foreach w of varlist $exposure{
         plot `w’…
    }
}

Надеюсь, вы можете помочь.

Спасибо.

Джо sh

1 Ответ

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

Попробуй это. Использовал mtcars в качестве примера набора данных, даже если это точно не подходящий пример набора данных для модели такого типа. Тем не менее, я надеюсь, что достаточно показать общий подход. Ключ цикла заключается в использовании substitute для настройки объекта формулы для шага оценки. Результатом является список, содержащий модели, графики, формулы, ...

vars_outcome <- c("mpg", "disp")
vars_exposure <- c("hp", "qsec")

# Grid of outcome and exposure variables
vars_grid <- expand.grid(out = vars_outcome, exp = vars_exposure, stringsAsFactors = FALSE)
# Init list for formulas, models, plots
mods <- list(out = vars_grid$out, exp = vars_grid$exp, fmla = list(), mod = list(), mod = list())

for (i in seq_len(nrow(vars_grid))) {
  # Set up the formula
  mods$fmla[[i]] <- substitute(out ~ s(exp, bs="cr",fx=TRUE), list(out = as.name(mods$out[[i]]), exp = as.name(mods$exp[[i]])))
  # Estimate Model
  mods$mod[[i]] <- mgcv::gam(mods$fmla[[i]], family = poisson(link = "log"), data = mtcars)
  # Plot Model
  mods$plt[[i]] <- voxel::plotGAM(gamFit = mods$mod[[i]] , smooth.cov = mods$exp[[i]], groupCovs = NULL, plotCI=TRUE, orderedAsFactor = FALSE)

  # Create a "variable" containing the plot 
  assign(paste(mods$out[[i]], mods$exp[[i]], sep = "_"), mods$plt[[i]])

}

## Name the list with the plots
names(mods$plt) <- paste(mods$out, mods$exp, sep = "_")

mods$fmla[[1]]
#> mpg ~ s(hp, bs = "cr", fx = TRUE)
mods$mod[[1]]
#> 
#> Family: poisson 
#> Link function: log 
#> 
#> Formula:
#> mpg ~ s(hp, bs = "cr", fx = TRUE)
#> attr(,".Environment")
#> <environment: R_GlobalEnv>
#> 
#> Estimated degrees of freedom:
#> 9  total = 10 
#> 
#> UBRE score: -0.1518201
mods$plt[[1]]

Создано в 2020-03-28 с помощью представьте пакет (v0.3.0)

...