当输入数据集之间的变量数量不同时,如何自动指定正确的回归模型?

时间:2012-02-05 04:10:52

标签: r automation regression nonlinear-functions

我有一个有效的R程序,我的内部客户将用它来分析他们的营养摄入数据。对于他们拥有的每个数据集,他们将重新运行R程序。

数据集的一个关键部分是非线性混合方法分析,使用nlmer包中的lme4,其中包含年龄的虚拟变量。根据他们是否将分析儿童或成人,公式中年龄段假人的数量将有所不同,尽管参考年龄段假人将始终是最年轻的。我认为可能的年龄段的数量范围从4到大约6,所以它不是一个很大的范围。如果我需要在此基础上进行调节,那么计算年龄段假人的数量是一件小事。

包装基于模型的代码的最有效方法是什么(提供起始参数值的lmernlmer模型的函数以及{{nlmer模型中的模型规范1}}本身)以便根据模型中年龄段假人的数量应用正确的函数和模型?模型中的其他变量在数据集中是不变的。

我已经设置了自动生成相关虚拟对象并删除当前分析中未使用的虚拟对象的程序。模型之后的程序也很好地设置为自动化。我只是坚持如何处理基于lme4的两个分析和功能的自动化。这些只对每个数据集运行一次。

我一直想知道是否需要编写一个函数来包含所有lme4相关代码,或者是否有更简单的方法。我会很感激有关如何做到这一点的一些指示。我花了一天的时间来研究如何使nlmer模型所需的函数正常工作,所以我仍处于初学者级别的函数中。

我在网站上搜索了其他R相关的自动化问题,但没有找到与我想要的相似的内容。

提前致谢。

更新以回应有关使用字符串的评论中的建议。这听起来像是一个简单的方法,除了我不知道如何在函数中应用字符串内容,因为在nlmer的函数中使用了每个虚拟变量级别(不包括引用类别)。如何拆分字符串并仅使用函数中的虚拟变量?例如,一个分析可能有AgeBand2,AgeBand3,AgeBand4,另一个分析可能有AgeBand5以及那些3?如果这是VBA,我只会根据年龄虚拟变量的数量创建子函数。我不知道如何在R中有效地做到这一点。

我可以在while,函数和lmer部分周围包裹nlmer循环,这样我就有一系列while个循环吗?

这是我希望自动化的代码部分,AgeBand虚拟变量的数量根据将要分析的数据集(儿童与成人)而有所不同。这是使用我一直在测试SASR转换的数据集,但真实数据集将非常相似。有必要建立一个非线性模型,因为这是我正在研究的同行评审公布方法的基础。

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. 在函数中,表达式,name.vec和function.arg部分将更改
  3. nlmer,模型语句和启动参数列表将更改。
  4. 我可以更改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 :(得分:0)

这假设您有一个变量“ageband”,这是一个具有级别的因素:AgeBand2,AgeBand3,AgeBand4,以及您可能想要忽略的其他因素。由于通常使用最低的lexigraphic值作为参考水平通过R回归函数处理因子,因此您将自动选择正确的水平。您可以通过创建仅具有所需级别的数据集帽来选择所需级别。

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

如果你遇到了创建单独变量的麻烦,那么你需要学会正确使用因素,而不是坚持通过SPSS或其他笨重的宏处理器训练强制执行的无用习惯。