5

パラメータlmを使用せずにモデルを構築しました:data=

m1 <- lm( mdldvlp.trim$y ~  gc.pc$scores[,1] + gc.pc$scores[,2] + gc.pc$scores[,3] + 
                            gc.pc$scores[,4] + gc.pc$scores[,5] + gc.pc$scores[,6] + predict(gc.tA))

m1ここで、使用を予測したいので、上記の呼び出しnewdataで使用された変数と一致するように新しい data.frame に名前を付けます。lm()

newComps私の新しいものとしてgc.pc(予測と同様に、新しいdata.framegc.tAを使用して問題なく予測されました)、私は試しました

newD <- data.frame( newComps[1:100,1:6] ,
                    predict(gc.tA , newdata = mdldvlp[1:100,predKept]))


names(newD) <- names(m1$coefficients)[-1]
names(newD) <- names(m1$model)[-1]

names(newD) <- c( "gc.pc$scores[, 1]" , "gc.pc$scores[, 2]" , "gc.pc$scores[, 3]" , 
                  "gc.pc$scores[, 4]" , "gc.pc$scores[, 5]" , "gc.pc$scores[, 6]" , 
                  "predict(gc.tA)" )
names(newD) <- c( "gc.pc$scores[,1]" , "gc.pc$scores[,2]" , "gc.pc$scores[,3]" , 
                  "gc.pc$scores[,4]" , "gc.pc$scores[,5]" , "gc.pc$scores[,6]" , 
                  "predict(gc.tA)" )

残念ながら、predict.lm上記の命名戦略を受け入れず、newdataビルドされた元の data.frame からの予測とともに恐ろしい警告を返しm1ます。

Warning message:
'newdata' had 100 rows but variable(s) found have 1414 rows  

呼び出しを機能newDさせるには、列にどのように名前を付ける必要がありますか? predictありがとう。

以下のコードは、問題を再現します。

    require(rpart)

    set.seed(123)
    X <- matrix(runif(200) , 20 , 10)
    gc.pc <- princomp(X)
    y <- runif(20)
    mdldvlp.trim <- data.frame(y,X)
    names(mdldvlp.trim) <- c("y",paste("x",1:10,sep=""))
    predKept <- paste("x",1:10,sep="")

    gc.tA <- rpart( y ~ . , data = mdldvlp.trim)

    m1 <- lm( mdldvlp.trim$y ~  gc.pc$scores[,1] + gc.pc$scores[,2] + gc.pc$scores[,3] + 
                                gc.pc$scores[,4] + gc.pc$scores[,5] + gc.pc$scores[,6] + predict(gc.tA))

    mdldvlp <- data.frame(matrix(runif(2000) , 200 , 10))
    names(mdldvlp) <- predKept

    newComps <- predict( gc.pc , newdata=mdldvlp )

    newD <- data.frame( newComps[1:100,1:6] ,
                        predict(gc.tA , newdata = mdldvlp[1:100,predKept]))

# enter newD naming strategy here

    predict( m1 , newdata=newD )

4/20 フォローアップ:

回答ありがとうございます。最初に適切な名前の予測子を含む data.frame を作成することで、物事がより簡単になることを理解しています。という事は承知しています。私の質問は、モデリングデータフレームが実際に名前gc.pc$scores[,1]などの変数を持つデータフレームに評価される場合、上記で使用された命名「戦略」が機能しないのはなぜpredict.lmですか? つまり、lmモデリング データ フレームgc.pc$scores[,1]などを本当に評価しますか? もしそうなら、上記の名前変更戦略は で機能しpredict.lmませんか?

4

3 に答える 3

8

数式表記を悪用しており、これが問題の原因となっています。基本的にあなたの式:

m1 <- lm( mdldvlp.trim$y ~  gc.pc$scores[,1] + gc.pc$scores[,2] + 
                            gc.pc$scores[,3] + gc.pc$scores[,4] + 
                            gc.pc$scores[,5] + gc.pc$scores[,6] + 
                            predict(gc.tA))

などの名前の変数を含むデータフレームに評価されgc.pc$scores[,1]ます。使用すると、引数predict()に渡されたオブジェクトでこれらの同じ名前の変数が検索されます。newdata

理想的には、必要なすべての変数を適切な名前で含むデータ オブジェクトを作成します。たとえば、次のようになります。

fitData <- data.frame(mdldvlp.trim$y, gc.pc$scores[, 1:6], predict(gc.tA))
names(fitData) <- c("trimY", paste("scores", 1:6, sep = ""), "preds")

次に、次の方法でモデルを適合させます。

m1 <- lm(trimY ~ ., data = fitData)

モデルの適合に使用されたものと同じ名前のデータ フレームを提供することにより、モデルから新しい予測を行うことができます。したがって、あなたを使用してnewD

newD <- data.frame(newComps[1:100,1:6] ,
                   predict(gc.tA , newdata = mdldvlp[1:100,predKept]))
names(newD) <- c(paste("scores", 1:6, sep = ""), "preds")

その後predict()

predict(m1 , newdata=newD)

完全な例

require(rpart)

set.seed(123)
X <- matrix(runif(200) , 20 , 10)
gc.pc <- princomp(X)
y <- runif(20)
mdldvlp.trim <- data.frame(y,X)
names(mdldvlp.trim) <- c("y",paste("x",1:10,sep=""))
predKept <- paste("x",1:10,sep="")

gc.tA <- rpart( y ~ . , data = mdldvlp.trim)
fitData <- data.frame(mdldvlp.trim$y, gc.pc$scores[, 1:6], predict(gc.tA))
names(fitData) <- c("trimY", paste("scores", 1:6, sep = ""), "preds")
m1 <- lm(trimY ~ ., data = fitData)
mdldvlp <- data.frame(matrix(runif(2000) , 200 , 10))
names(mdldvlp) <- predKept

newComps <- predict( gc.pc , newdata=mdldvlp )
newD <- data.frame(newComps[1:100,1:6] ,
                   predict(gc.tA , newdata = mdldvlp[1:100,predKept]))
names(newD) <- c(paste("scores", 1:6, sep = ""), "preds")
predict(m1 , newdata=newD)
于 2012-04-20T07:42:29.930 に答える
1

過去にも同様の問題がありました。列番号を参照する代わりに、変数に名前を付けることで解決したと思います。たとえば、gc.pc [、1]は使用しないでください。ただし、gc.pcマトリックスをデータフレームに変換し、列に名前を追加してください( "PC1"、 "PC2"など)。次に、newdataもこれらの名前を使用していることを確認します(データフレームでも)。

于 2012-04-20T07:17:13.907 に答える
1

同様の問題がありました。データ フレームに 3 つ以上の変数 (1 つの結果変数と 2 つ以上の予測変数) がある場合、列番号で列を参照するときに問題はありませんでした。しかし、データ フレームに 2 つの変数 (1 つの結果、1 つの予測子) しかない場合、R は次のような多くのエラーを出しました。'newdata' had 1 row but variables found have xx rows

ボックスの提案で Marc に従って、データ フレームに 2 つの変数しかないインスタンスの特別なケースを書き、変数名を割り当てました。これで問題が解決しました。

この警告を修正するために、次のように書き直しました。

lr <- lm(train[ , ncol(train)] ~ ., data = train[ , -ncol(train)])

なので:

if(ncol(train) == 2) {
    colnames(train) <- c('var1','var2')
    colnames(test) <- c('var1','var2')
    lr <- lm(var2 ~ var1, data = train)
} else if (ncol(train) > 2) {
    lr <- lm(train[ , ncol(train)] ~ ., data = train[ , -ncol(train)])
}
于 2015-11-01T04:11:23.913 に答える