R prcompの結果を予測に使用する方法は?


25

800個のオブジェクトを持つdata.frameがあります。40個の変数を使用し、主成分分析を使用して、予測の結果を改善したいと考えています(これまでに15個の変数を選択してSupport Vector Machineで最適に機能します)。

prcompを使用すると予測を改善できることは理解していますが、prcomp関数の結果の使用方法はわかりません。

私は結果を得ます:

> PCAAnalysis <- prcomp(TrainTrainingData, scale.=TRUE)
> summary(PCAAnalysis)
Importance of components:
                          PC1    PC2    PC3    PC4    PC5   PC6    PC7    PC8    PC9   PC10   PC11   PC12   PC13   PC14
Standard deviation     1.7231 1.5802 1.3358 1.2542 1.1899 1.166 1.1249 1.1082 1.0888 1.0863 1.0805 1.0679 1.0568 1.0520
Proportion of Variance 0.0742 0.0624 0.0446 0.0393 0.0354 0.034 0.0316 0.0307 0.0296 0.0295 0.0292 0.0285 0.0279 0.0277
Cumulative Proportion  0.0742 0.1367 0.1813 0.2206 0.2560 0.290 0.3216 0.3523 0.3820 0.4115 0.4407 0.4692 0.4971 0.5248
                         PC15   PC16   PC17   PC18  PC19   PC20   PC21   PC22   PC23   PC24   PC25   PC26   PC27   PC28
Standard deviation     1.0419 1.0283 1.0170 1.0071 1.001 0.9923 0.9819 0.9691 0.9635 0.9451 0.9427 0.9238 0.9111 0.9073
Proportion of Variance 0.0271 0.0264 0.0259 0.0254 0.025 0.0246 0.0241 0.0235 0.0232 0.0223 0.0222 0.0213 0.0208 0.0206
Cumulative Proportion  0.5519 0.5783 0.6042 0.6296 0.655 0.6792 0.7033 0.7268 0.7500 0.7723 0.7945 0.8159 0.8366 0.8572
                         PC29   PC30   PC31   PC32   PC33   PC34   PC35   PC36    PC37                 PC38
Standard deviation     0.8961 0.8825 0.8759 0.8617 0.8325 0.7643 0.7238 0.6704 0.60846 0.000000000000000765
Proportion of Variance 0.0201 0.0195 0.0192 0.0186 0.0173 0.0146 0.0131 0.0112 0.00926 0.000000000000000000
Cumulative Proportion  0.8773 0.8967 0.9159 0.9345 0.9518 0.9664 0.9795 0.9907 1.00000 1.000000000000000000
                                       PC39                 PC40
Standard deviation     0.000000000000000223 0.000000000000000223
Proportion of Variance 0.000000000000000000 0.000000000000000000
Cumulative Proportion  1.000000000000000000 1.000000000000000000

使用するのに最も重要なパラメーターを取得すると思いましたが、この情報が見つかりません。表示されるのは、PCの標準偏差などのみです。しかし、これを予測にどのように使用しますか?


2
Rライブラリpls(部分最小二乗法)もあり、PCR用のツール(主成分回帰)があります。
ステパンS.シュシュコ

回答:


35

あなたの問題の性質については確信が持てませんが、後のモデルの構築で予測変数のグループの支配的なパターンを抽出する手段としてPCAを使用したことがわかります。あなたの例では、これらは主成分(PC)にありPCAAnalysis$x、にある変数の重み付けに基づいていますPCAAnalysis$rotation。このプロセスの利点の1つは、PCが直交しているため、モデル予測子間の多重共線性の問題を取り除くことです。2番目は、予測変数の大部分の分散をキャプチャするPCの小さなサブセットを識別できる可能性があることです。この情報は、summary(PCAAnalysis)またはにありPCAAnalysis$sdevます。最後に、予測にPCのサブセットを使用することに興味がある場合は、次のようにtolパラメーターを設定できます。prcomp 後続のPCを削除するために、より高いレベルに。

これで、このpredict.prcomp()関数を使用して、PCA座標ベースに新しいデータを「投影」できます。データセットを「トレーニング」データセットと呼んでいるので、それぞれのPC座標の計算のためにPCAベースに検証データセットを投影するのは理にかなっているかもしれません。以下は、PCAを異なる虹彩種の4つの生体測定値にフィッティングする例です(ある程度相関しています)。これに続いて、3種類のアイリスのそれぞれについて、これらの測定値の類似した組み合わせを持つ、花の新しいデータセットの生体認証値を予測します。最終的なグラフから、投影されたPCが元のデータセットと同じプロット領域にあることがわかります。

irisデータセットを使用した例:

### pca - calculated for the first 4 columns of the data set that correspond to biometric measurements ("Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width")
data(iris)

# split data into 2 parts for pca training (75%) and prediction (25%)
set.seed(1)
samp <- sample(nrow(iris), nrow(iris)*0.75)
iris.train <- iris[samp,]
iris.valid <- iris[-samp,]

# conduct PCA on training dataset
pca <- prcomp(iris.train[,1:4], retx=TRUE, center=TRUE, scale=TRUE)
expl.var <- round(pca$sdev^2/sum(pca$sdev^2)*100) # percent explained variance

# prediction of PCs for validation dataset
pred <- predict(pca, newdata=iris.valid[,1:4])

###Plot result
COLOR <- c(2:4)
PCH <- c(1,16)

pc <- c(1,2) # principal components to plot

png("pca_pred.png", units="in", width=5, height=4, res=200)
op <- par(mar=c(4,4,1,1), ps=10)
plot(pca$x[,pc], col=COLOR[iris.train$Species], cex=PCH[1], 
 xlab=paste0("PC ", pc[1], " (", expl.var[pc[1]], "%)"), 
 ylab=paste0("PC ", pc[2], " (", expl.var[pc[2]], "%)")
)
points(pred[,pc], col=COLOR[iris.valid$Species], pch=PCH[2])
legend("topright", legend=levels(iris$Species), fill = COLOR, border=COLOR)
legend("topleft", legend=c("training data", "validation data"), col=1, pch=PCH)
par(op)
dev.off()

ここに画像の説明を入力してください


詳細をご提供いただきありがとうございます。残念ながら、このサンプルコードは私にとってわかりにくいです。Predictを使用しているようです。prcompのマニュアルはどこにありますか?ここにあります:stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html
ツーソン

これで回答にさらに説明を追加しました。願わくば、それがあなたにとってより明確であることを願っています。はい、predict.prcompヘルプへのリンクは正しかったです。
ボックス内のマーク

11

質問に添付したsummary()コマンドからの情報により、たとえば、各主成分が取得する分散の割合(分散の割合)を確認できます。さらに、累積比率が計算されて出力されます。たとえば、データセットの分散の75%をキャプチャするには23台のPCが必要です。

これは確かに、さらなる分析への入力として通常使用する情報ではありません。むしろ、通常必要なのは回転したデータで、prcompによって作成されたオブジェクトに「x」として保存されます。

Rコードを短い例として使用します。

pr<-prcomp(USArrests, scale = TRUE)
summary(pr) # two PCs for cumulative proportion of >80% 
newdat<-pr$x[,1:2]

その後、newdatのデータを使用して、SVMや何らかの回帰モデルへの入力など、さらなる分析を行うことができます。また、詳細については、https://stackoverflow.com/questions/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-rを参照してください。


1
@JTTありがとうございます。したがって、現在newdatを使用してSVMモデルを作成している場合、モデルはこの新しい回転ユニバースで入力を受け取ると想定します。つまり、モデルに適用する前にテストデータも回転する必要があります。これは正しいです?はいの場合、同じ回転でテストデータフレームをどのように回転させますか?
ツーソン

3
最も簡単な方法はpredict()、テストデータにメソッドを使用することです。上記の例を使用するpredict(pr, USArrests)と、と同じ行列が返されpr$xます。テストデータの場合、USarrestsをテストデータの名前に置き換えます。手作業でも同じことができますが、predictメソッドがテストデータセットの正しいスケーリングを自動的に処理するため、これは簡単です。
JTT

1
予測はどのように機能しますか?すべての主要コンポーネントを使用しますか。回答では、分散の80%をカバーするために2つのコンポーネントのみを選択しました。予測は何をしますか?
ツーソン

1
この関数predict()はデフォルトですべてのコンポーネントを使用します。ただし、返されるコンポーネントの数を制限できます(例: `predict(pr、USArrests)[、1:2])。それはあなたのために働くでしょうか?
JTT

予測する前に、新しいデータを中心にしてスケーリングする必要がありますか?またはpredict()、初期パラメータを自動的に指定してそれを行いprcomp()ますか?
デールキューブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.