繁体   English   中英

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

[英]How do I automatically specify the correct regression model when the number of variables differs between input data sets?

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

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

什么是我包的基于模型的代码(最有效的方式lmer ,它提供起始参数值,对于功能nlmer模型,在模型规范nlmer本身),以便正确的功能和模型是基于应用关于模特中年龄段假人的数量? 模型中的其他变量在数据集中是不变的。

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

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

我在网站上搜索了其他与R相关的自动化问题,但我没有发现任何与我想做的相似的内容。

提前致谢。

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

我可以在lmer ,function和nlmer部分周围换一个while循环,所以我有一系列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分配的固定效果系数的lmer会发生变化。
  2. 在函数中,表达式,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 因为我没有使用它,所以我没有回过头来纠正这个问题。

这假设您有一个变量“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或其他笨重的宏处理器进行培训所强制执行的无用习惯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM