私は、社内クライアントが栄養素摂取データを分析するために使用する作業R
プログラムを持っています. 彼らが持っているデータセットごとに、R
プログラムを再実行します。
データセットの重要な部分は、年齢のダミー変数を組み込んだnlmer
、パッケージから使用する非線形混合法分析です。lme4
子供を分析するか大人を分析するかによって、計算式に含まれる年齢層ダミーの数は異なりますが、基準となる年齢層ダミーは常に最年少になります。考えられる年齢層の数は4から6くらいだと思うので広い範囲ではありません。それに基づいて条件付けする必要がある場合、年齢層ダミーの数を数えることは簡単なことです。
数値に基づいて正しい関数とモデルが適用されるように、モデルベースのコード (lmer
開始パラメーター値、モデルの関数nlmer
、およびモデル仕様自体を提供するコード) をラップする最も効率的な方法は何ですか?nlmer
モデルの年齢層ダミーの数は?モデル内の他の変数は、データセット全体で一定です。
関連するダミーを自動的に生成し、現在の分析で使用されていないダミーをドロップするようにプログラムをセットアップしました。モデルの後のプログラムも、自動化されたものとしてかなりうまく設定されています。私は、 2 つのlme4
ベースの分析と機能を自動化する方法に固執しています。これらは、データセットごとに 1 回だけ実行されます。
lme4
関連するすべてのコードを含む関数を作成する必要があるかどうか、またはもっと簡単な方法があるかどうか疑問に思っていました。これを行う方法についてのいくつかの指針をいただければ幸いです。モデルに必要な関数を機能させる方法を理解するのに 1 日かかったので、関数に関して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
が変わります。 - 関数では、expression、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
ます。私はそれを使用していないので、戻ってこれを単純な要因に修正していません。