Как автоматически указать правильную модель регрессии, если количество переменных в наборах входных данных различается? - PullRequest
3 голосов
/ 05 февраля 2012

У меня есть рабочая R программа, которая будет использоваться моим внутренним клиентом для анализа данных о потреблении питательных веществ. Для каждого имеющегося набора данных они повторно запустят программу R.

Ключевой частью набора данных является нелинейный смешанный метод анализа, использующий nlmer из пакета lme4, который включает фиктивные переменные для возраста. В зависимости от того, будут ли они анализировать детей или взрослых, число манекенов в возрастной полосе в формуле будет отличаться, хотя референтная группа манекена для возрастной группы всегда будет самой младшей. Я думаю, что число возможных возрастных групп колеблется от 4 до 6, так что это не большой диапазон. Подсчет количества манекенов по возрастным группам является тривиальным делом, если мне необходимо подготовить условия на основе этого.

Какой самый эффективный способ для меня обернуть код на основе модели (lmer, который предоставляет начальные значения параметров, функцию для модели nlmer и спецификацию модели в самой nlmer), так что правильная функция и модели применяются на основе количества манекенов в возрастной полосе в модели? Другие переменные в модели постоянны для наборов данных.

Я уже настроил программу для автоматической генерации соответствующих макетов и удаления тех, которые не используются в текущем анализе. Программа после модели довольно хорошо настроена как автоматизированная. Я просто застрял в том, что делать с автоматизацией двух анализов и функций на основе lme4. Они будут выполняться только один раз для каждого набора данных.

Мне было интересно, нужно ли мне написать функцию, содержащую весь код, связанный с lme4, или есть более простой способ. Я был бы признателен за некоторые советы о том, как это сделать. Мне потребовался один день, чтобы понять, как заставить функцию работать так, как мне нужно для модели nlmer, поэтому я все еще на начальном уровне с функциями.

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

Заранее спасибо.

Обновление в ответ на предложение в комментариях об использовании строки. Это звучит как легкий путь вперед для меня, за исключением того, что я не знаю, как применять строковое содержимое в функции, поскольку каждый уровень фиктивной переменной (исключая ссылочную категорию) используется в функции для nlmer. Как я могу разделить строку и использовать только фиктивные переменные, которые есть в функции? Например, один анализ может иметь AgeBand2, AgeBand3, AgeBand4, а другой анализ может иметь AgeBand5, а также эти 3? Если бы это было VBA, я бы просто создал подфункции на основе числа фиктивных переменных возраста. Я понятия не имею, как сделать это эффективно в R.

Могу ли я просто обернуть петлю while вокруг lmer, функции и nlmer частей, чтобы у меня была серия while петель?

Это раздел кода, который я хочу автоматизировать, количество фиктивных переменных AgeBand различается в зависимости от набора данных, который будет проанализирован (дети против взрослых). Это использует набор данных, на котором я тестировал перевод с SAS на R, но реальные наборы данных будут очень похожи. Необходимо иметь нелинейную модель, так как это является основой рецензируемого опубликованного метода, над которым я работаю.

library(lme4)
Male.lmer <- lmer(BoxCoxXY ~ AgeBand4 + AgeBand5 + AgeBand6 + AgeBand7 +
        AgeBand8 + Race1 + Race3 + Weekend + IntakeDay + (1|RespondentID),
    data=Male.AddSugar,
    weights=Replicates)

Male.lmer.fixef <- fixef(Male.lmer)
Male.lmer.fixef <- as.data.frame(Male.lmer.fixef)
bA <- Male.lmer.fixef[1,1]
bB <- Male.lmer.fixef[2,1]
bC <- Male.lmer.fixef[3,1]
bD <- Male.lmer.fixef[4,1]
bE <- Male.lmer.fixef[5,1]
bF <- Male.lmer.fixef[6,1]
bG <- Male.lmer.fixef[7,1]
bH <- Male.lmer.fixef[8,1]
bI <- Male.lmer.fixef[9,1]
bJ <- Male.lmer.fixef[10,1]

MD <- deriv(expression(b0 + b1*AgeBand4 + b2*AgeBand5 + b3*AgeBand6 + 
    b4*AgeBand7 + b5*AgeBand8 + b6*Race1 + b7*Race3 + b8*Weekend + b9*IntakeDay),
namevec=c("b0","b1","b2","b3", "b4", "b5", "b6", "b7", "b8", "b9"),
function.arg=c("b0","b1","b2","b3", "b4", "b5", "b6", "b7", "b8", "b9",
               "AgeBand4","AgeBand5","AgeBand6","AgeBand7","AgeBand8",
               "Race1","Race3","Weekend","IntakeDay"))

Male.nlmer <- nlmer(BoxCoxXY ~ MD(b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,AgeBand4,AgeBand5,AgeBand6,AgeBand7,AgeBand8,
 Race1,Race3,Weekend,IntakeDay)
    ~ b0|RespondentID,
    data=Male.AddSugar,
    start=c(b0=bA, b1=bB, b2=bC, b3=bD, b4=bE, b5=bF, b6=bG, b7=bH, b8=bI, b9=bJ),
        weights=Replicates
        )

Это будут необходимые изменения между наборами данных:

  1. число фиксированных коэффициентов эффекта, которое мне нужно назначить из lmer, изменится.
  2. в функциях, части expression, name.vec и function.arg изменятся
  3. nlmer, оператор модели и список параметров запуска изменятся.

Я могу изменить оператор модели lmer, чтобы он воспринимал AgeBand как фактор с уровнями, но мне все равно нужно вытащить значения коэффициентов после этого.

str(Male.AddSugar) дает:

'data.frame':   10287 obs. of  23 variables:
$ RespondentID: int  9966 9967 9970 9972 9974 9976 9978 9979 9982 9993 ...
$ RACE        : int  2 3 2 2 3 2 2 2 2 1 ...
$ RNDW        : int  26290 7237 10067 75391 1133 31298 20718 23908 7905 1091 ...
$ Replicates  : num  41067 2322 17434 21723 375 ...
$ DRXTNUMF    : int  27 11 13 18 17 13 13 19 11 11 ...
$ DRDDAYCD    : int  1 1 1 1 1 1 1 1 1 1 ...
$ IntakeAmt   : num  33.45 2.53 9.58 43.34 55.66 ...
$ RIAGENDR    : int  1 1 1 1 1 1 1 1 1 1 ...
$ RIDAGEYR    : int  39 23 16 44 13 36 16 60 13 16 ...
$ Subgroup    : Ord.factor w/ 6 levels "3"<"4"<"5"<"6"<..: 4 3 2 4 1 4 2 5 1 2 ...
$ WKEND       : int  1 1 1 0 1 0 0 1 1 1 ...
$ AmtInd      : num  1 1 1 1 1 1 1 1 1 1 ...
$ IntakeDay   : num  0 0 0 0 0 0 0 0 0 0 ...
$ Weekend     : int  1 1 1 0 1 0 0 1 1 1 ...
$ Race1       : num  0 0 0 0 0 0 0 0 0 1 ...
$ Race3       : num  0 1 0 0 1 0 0 0 0 0 ...
$ AgeBand4    : num  0 0 1 0 0 0 1 0 0 1 ...
$ AgeBand5    : num  0 1 0 0 0 0 0 0 0 0 ...
$ AgeBand6    : num  1 0 0 1 0 1 0 0 0 0 ...
$ AgeBand7    : num  0 0 0 0 0 0 0 1 0 0 ...
$ AgeBand8    : num  0 0 0 0 0 0 0 0 0 0 ...
$ YN          : num  1 1 1 1 1 1 1 1 1 1 ...
$ BoxCoxXY    : num  7.68 1.13 3.67 8.79 9.98 ...

Данные AgeBand неправильно отображаются как упорядоченный коэффициент Subgroup.Поскольку я не использовал его, я не вернулся и не исправил это просто.

1 Ответ

0 голосов
/ 05 февраля 2012

Это предполагает, что у вас есть одна переменная, ageband, которая является фактором с уровнями: AgeBand2, AgeBand3, AgeBand4 и, возможно, другие, которые вы хотите игнорировать.Поскольку факторы обычно обрабатываются регрессионными функциями R, использующими в качестве опорных уровней самые низкие лексикографические значения, вы выбираете правильный уровень автоматически.Вы выбираете желаемые уровни, создавая набор данных, в котором есть только нужные уровни.

agelevs <- c("AgeBand2", "AgeBand3", "AgeBand4")
dsub <- subset(inpdat, ageband %in agelevs)
res <- your_fun(dsub) nlmer(y ~ ageband + <other-parameters>, data=dsub, ...) 

Если вы столкнулись с проблемой создания отдельных переменных, то вам нужно научиться правильно использовать факторы, а не удерживать их.неэффективные привычки, вызванные обучением в SPSS или других неуклюжих макропроцессорах.

...