3

私は良い考えを持っていると思いますが、それを実装する方法がわかりません。私は現在、いくつかのネストされたモデルを実行しています。例えば:

y<-c(1, 0, 1, 1, 1, 1, 1, 1, 0)
x1<-c(1, 0, 9, 9, 1, 9, 2, 1, 0)
x2<-c(1, 2, 3, 5, 4, 2, 4, 5, 1)
x3<-c(1, 2, 1, 4, 1, 3, 4, 8, 3)

model1 <-lm(y~x1)
model2 <-lm(y~x1+x2)
model3 <-lm(y~x1+x2+x3)

model1_output<-(summary(model1 )$coefficients[1])
model2_output<-(summary(model1 )$coefficients[1])
model3_output<-(summary(model1 )$coefficients[1])

次に、すべての出力を、行(変数名)に沿って一致するデータテーブルに配置しますが、新しい係数を独自の列に挿入します。私の例からの出力を次のように表示するdata.frameが欲しいです:

             b(Model 1)  b(Model 2) b(Model 3)
 (Intercept)  0.59217    0.2555     0.27983
 x1           0.05220    0.04116    0.0375
 x2              NA      0.12530    0.15142
 x3              NA      NA        -0.02994

plyr()パッケージ(または他のパッケージ!)を使用してこれを行うための賢い方法があるはずですが、それを理解できないようです。ありがとう!

4

2 に答える 2

4

別の質問からのこの回答を使用する:

cbind.fill<-function(...){
    nm <- list(...) 
    nm<-lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function (x) 
    rbind(x, matrix(, n-nrow(x), ncol(x))))) 
}

あなたはこれを行うことができます:

do.call(cbind.fill,lapply(list(model1,model2,model3),function(x){coef(x)}))

                  [,1]       [,2]        [,3]
(Intercept) 0.59216966 0.25551154  0.27982881
x1          0.05220228 0.04116431  0.03754457
                    NA 0.12530141  0.15142340
                    NA         NA -0.02993768

次に、行名と列名を手動で設定します。(これが重要な場合は、データフレームではなく、行列を返すことに注意してください。)

于 2012-07-27T17:58:15.313 に答える
0

次のことを試してください。私はそれをできるだけ一般的に保つように努め、ここからいくつかの助けを借りました。

models <- list(model1=model1,model2=model2,model3=model3)    

#Find out which model (by index) has the most coefficients.
max.model <- which.max(unlist(lapply(models, function(x) length(x[[1]]))))

#How many coefficients there are in the 'biggest' model (including intercept)
max <- length(models[[max.model]][[1]])

#Create list of coefficients, replacing blank spaces with NA
coeff <- lapply(models, function(x) c(x[[1]],rep(NA,max-length(x[[1]]))))

#See the link above
result <- do.call(cbind,coeff)

colnames(result) <- names(models)

rownames(result) <- names(models[[max.model]][[1]])

結果:

> result
                model1     model2      model3
(Intercept) 0.59216966 0.25551154  0.27982881
x1          0.05220228 0.04116431  0.03754457
x2                  NA 0.12530141  0.15142340
x3                  NA         NA -0.02993768

一般的にしようとすると、これは任意の数のモデルで機能するということです。コードの最初の行だけを変更する必要があります。

于 2012-07-27T17:59:04.353 に答える