[英]How do I automatically specify the correct regression model when the number of variables differs between input data sets?
我有一个工作的R
程序,我的内部客户将用它来分析他们的营养摄入数据。 对于他们拥有的每个数据集,他们将重新运行R
程序。
数据集的一个关键部分是一个非线性混合方法分析,采用nlmer
从lme4
包,并入虚拟变量的年龄。 根据他们是否将分析儿童或成人,公式中年龄段假人的数量将有所不同,尽管参考年龄段假人将始终是最年轻的。 我认为可能的年龄段的数量范围从4到大约6,所以它不是一个很大的范围。 如果我需要在此基础上进行调节,那么计算年龄段假人的数量是一件小事。
什么是我包的基于模型的代码(最有效的方式lmer
,它提供起始参数值,对于功能nlmer
模型,在模型规范nlmer
本身),以便正确的功能和模型是基于应用关于模特中年龄段假人的数量? 模型中的其他变量在数据集中是不变的。
我已经设置了程序,用于自动生成相关的虚拟对象并删除当前分析中未使用的虚拟对象。 模型之后的程序也很好地设置为自动化。 我只是坚持如何处理两个基于lme4
的分析和功能的自动化。 这些只对每个数据集运行一次。
我一直想知道是否需要编写一个函数来包含所有与lme4
相关的代码,或者是否有更简单的方法。 我会很感激有关如何做到这一点的一些指示。 我花了一天的时间来研究如何使nlmer
模型所需的功能工作,所以我仍处于初学者级别的功能。
我在网站上搜索了其他与R
相关的自动化问题,但我没有发现任何与我想做的相似的内容。
提前致谢。
更新以响应有关使用字符串的注释中的建议。 这听起来像是一个简单的方法,除了我不知道如何在函数中应用字符串内容,因为在nlmer
的函数中使用了每个虚拟变量级别(不包括引用类别)。 如何拆分字符串并仅使用函数中的虚拟变量? 例如,一个分析可能有AgeBand2,AgeBand3,AgeBand4,另一个分析可能有AgeBand5以及那些3? 如果这是VBA
,我只会根据年龄虚拟变量的数量创建子函数。 我不知道如何在R
有效地做到这一点。
我可以在lmer
,function和nlmer
部分周围换一个while
循环,所以我有一系列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
分配的固定效果系数的lmer
会发生变化。 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.