我有一个工作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
)
这些将是数据集之间所需的更改:
- 我需要分配的固定效应系数的数量
lmer
将会改变。 - 在函数中,表达式、name.vec 和 function.arg 部分将发生变化
- ,
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
。因为我没有使用它,所以我没有回去将其纠正为一个简单的因素。