2017-07-25 13 views
0

私が期待した値を返さないネストループについて助けて欲しい。私は入れ子にされたループに新しいので、私と一緒にご負担ください。私は元の変数の異なる計算に基づいているロジスティック回帰モデルのための新しい独立変数を計算したいと思います。具体的には、私は6つの変数 "x1 ... x6"を持っており、元の変数の組からパーセンタイルを抽出することによって3つの新しい変数(newvar1、newvar2、newvar3)を作成します。これらの3つの新しい変数から、それらを減算によって組み合わせて、ロジスティック回帰モデルの独立変数を形成する最終的な新しい変数を形成する。その最終変数の値は、ロジスティック回帰モデルのAICによって評価される。ネストされたループが期待値を返さない:複数の再計算された独立変数のモデル結果を返す

私は最高のロジスティック回帰モデルを与えるnewvar2、newvar2、newvar3を形成するパーセンタイル値の最適な組み合わせを決定する必要があります。

df <- data.frame(x1 <- rnorm(100), 
      x2 <- rnorm(100), 
      x3 <- rnorm(100), 
      x4 <- rnorm(100), 
      x5 <- rnorm(100), 
      x6 <- rnorm(100), 
      y <- as.factor(runif(100)<=.70)) 

n = 1 
AIC = NULL 
for (i in 0.1:n){ 
    for (j in 0.1:n){ 
    for (k in 0.1:n){ 
     df$newvar1 <-apply(df[,1:2], 1, quantile, probs = i, na.rm = T) 
     df$newvar2 <-apply(df[,3:4], 1, quantile, probs = j, na.rm = T) 
     df$newvar3 <-apply(df[,5:6], 1, quantile, probs = k, na.rm = T) 
     df$finalvar <- df$newvar1 - df$newvar2 - df$newvar3 
     model <- glm(y ~ finalvar, data = df, family = "binomial") 
     AIC[i] <- as.numeric(model$aic) 
    } 
    } 
} 

私は「ちゃったごめんなさいに11の値(0、0.1、0.2 .... 0.9,1)の配列を提供したいと思います:これを行うには私はこのようなネストされた3つのレベルを作成しようとしています"分位関数の議論であり、可能な各分位量パラメータ推定(11 * 11 * 11)のそれぞれについてAICを得たいと思う。したがって、最後のAIC変数は121の値の数値ベクトルでなければなりません。しかし、上記のコードを実行すると、AICの空の数値が取得されます。このコードを正しく実行して、すべての可能な121モデルの値を私に供給するにはどうすればいいですか?

ありがとうございます!

EDIT:これは解決策ではなく、私が考える答えの一部です。私の前のコードでは "n"は1未満であったので、1回の反復しか実行していませんでした。(明らかに) "n"は1より大きい必要があります。その前に1より小さい理由は、quantileの "probs"引数が0と1の間の値を必要とするからです。これを超えると、引数probsに渡されるパラメータが10で除算されます。今度はAIC [1] i 。tはすべての組み合わせを表す完全な10 * 10 * 10(または11 * 11 * 11)を取得する方法を理解する「10のベクトルを取得し、私はまだドンできる

新コード:

n = 10 
AIC = NULL 
for (i in 1:n){ 
    for (j in 1:n){ 
    for (k in 1:n){ 
     df$newvar1 <-apply(df[,1:2], 1, quantile, probs = i/10, na.rm = T) 
     df$newvar2 <-apply(df[,3:4], 1, quantile, probs = j/10, na.rm = T) 
     df$newvar3 <-apply(df[,5:6], 1, quantile, probs = k/10, na.rm = T) 
     df$finalvar <- df$newvar1 - df$newvar2 - df$newvar3 
     model <- glm(y ~ finalvar, data = df, family = "binomial") 
     AIC[i] <- as.numeric(model$aic) 
    } 
    } 
} 

答えて

2

まず第一に、AICR関数なので、名前をaicに変更しました。 次に、コードの最も内側のループで、インデックスが3つある場合は、iでインデックスします。あなたは本当に必要です。

n = 10 
aic = array(0, dim = c(n, n, n)) # changed 
for(...) 
    for(...) 
     for(...){ 
      [...] 
      aic[i, j, k] <- as.numeric(model$aic) # changed 
     } 
+0

ありがとうございます!最後のaic配列では、i、j、kに対応する次元をどのように決定できますか? –

+0

「i」と「j」が最初に実行され、次に「k」が実行されます。例えば、 'array(1:24、dim = 2:4)'の結果を見てください。 –

関連する問題