3

私は、社内クライアントが栄養素摂取データを分析するために使用する作業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ループでラップして、一連のループを作成できますか?lmernlmerwhile

これは、自動化したいコードのセクションです。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. 関数では、expression、name.vec、および function.arg の部分が変更されます
  3. nlmerモデル ステートメント、および開始パラメータ リストが変更されます。

モデル ステートメントを変更して、lmerAgeBand をレベルの因子として使用することができますが、後で係数の値を引き出す必要があります。

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ます。私はそれを使用していないので、戻ってこれを単純な要因に修正していません。

4

1 に答える 1

0

これは、「ageband」という 1 つの変数があることを前提としています。これは、AgeBand2、AgeBand3、AgeBand4、およびおそらく無視したいその他のレベルの因子です。因子は一般に、最も低い辞書式の値を参照レベルとして使用する R 回帰関数によって処理されるため、正しいレベルが自動的に選択されます。必要なレベルのみを含むデータセット ハットを作成することで、必要なレベルを選択します。

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

個別の変数を作成するのに苦労した場合は、SPSS やその他の不格好なマクロ プロセッサでのトレーニングによって強化された非効率的な習慣に固執するのではなく、因数を正しく使用することを学ぶ必要があります。

于 2012-02-05T17:26:16.953 に答える