PLSをSPSS ModelerのR拡張ノードで使用する

SPSS Modelerの拡張モデルノードを使って、PLS(Partial Least Squares Regression;部分的最小二乗回帰）を使ってモデリングとスコアリングを行いました。


* テスト環境
Modeler 18.4
Windows 11 64bit
R 4.0.5
pls 2.8


* サンプルストリーム

https://github.com/hkwd/230303RExtension/raw/master/230622pls/230609pls.str

# 1. 事前準備

## 1.1. SPSS ModelerのR拡張ノードを利用可能にする。

R拡張ノードのセットアップができていない場合には以下の手順でセットアップします。

SPSS Modelerの拡張ノードでRを利用する

https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a

## 1.2. Rにplsを導入する

Rのコンソールを開き以下のコマンドでplsを導入します。CRANのミラーサイトはJapanなど適当なものを選択します。Program Filesに導入する場合には管理者権限でRを起動します。

```r
install.packages('pls',dependencies = TRUE,lib="C:/Program Files/R/R-4.0.5/library")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/becf4a27-6168-70ef-0962-50223f6140e5.png)


# 2. ストリームの作成

## 入力

Demosフォルダにある$CLEO_DEMOS/property_values_train.savを使います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cc20b702-e038-8f4c-5500-3b2e0ade0242.png)

説明変数と目的変数のみを「フィルター」ノードで選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5f4fd7fa-5e06-5efe-6356-bf5b45008631.png)

## モデリング
「拡張のモデル」ノードを接続し、シンタックスとしてRを選び、「Rモデル作成シンタックス」と「Rモデルスコアリングシンタックス」に以下のコードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/58ca22ef-a90b-b8f0-cf6b-182c31d20bdf.png)

```r:Rモデル作成シンタックス
YFieldName<-'taxable_value'

library("pls")

#PLSモデルの作成
f = as.formula(paste0(YFieldName,' ~ .' ))
modelerModel <- plsr(formula = f,  data=modelerData, validation = "CV", scale=TRUE)

summary(modelerModel)
```

```r:Rモデルスコアリングシンタックス
YFieldName<-'$P-taxable_value'

library("pls")

#主成分数の決定.
ncomp<-selectNcomp(modelerModel, method="onesigma")
print(paste("ncomp",ncomp))

#スコアリング.
result <- predict(modelerModel, newdata=modelerData, ncomp=ncomp, type="response")

#予測列の追加
modelerData <- cbind(modelerData, result)
#modelerData

#予測列の定義
var1 <- c(fieldName=YFieldName, fieldLabel="", fieldStorage="real", fieldMeasure="", fieldFormat="", fieldRole="")
modelerDataModel <- data.frame(modelerDataModel, var1)

```
「実行」すると、モデルナゲットが生成されます。

## スコアリング
モデルナゲットに「精度分析」ノードを接続して実行するとスコアリング結果が出ます。「$P-taxable_value」に予測結果が入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/455cf3c6-55d3-be11-ddf4-21e1bef3df0f.png)

## 精度分析
モデルナゲットに「精度分析」ノードを接続して精度も確認してみます。
「フィールド名の形式（たとえば'$<x>-<対象フィールド>')）」にチェックを付けて実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4725f9d5-3dbc-43af-2477-82a622969cdf.png)

以下のように精度の指標が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/65316de3-f67a-300d-3c0c-b306c55f1703.png)



# 3.スクリプトの開設
## モデリングスクリプトの解説

まず目的変数名を設定しています。利用したいデータに合わせて修正してください。

```r
YFieldName<-'taxable_value'
```

次に目的変数と説明変数を指定して、PLSのモデルを作っています。
modelerDataには「フィルターノード」の出力結果がdataframeとして入っています。

```r
library("pls")
f = as.formula(paste0(YFieldName,' ~ .' ))
modelerModel <- plsr(formula = f,  data=modelerData, validation = "CV", scale=TRUE)
```
最後にモデルの情報を出力しています。
```r
summary(modelerModel)
```

この出力結果はモデルナゲットの「テキスト出力」タブにでています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/304cdb4b-b706-45c3-4dd4-d1efddaacc87.png)

## スコアリングスクリプトの解説

まず予測結果変数名を設定しています。利用したいデータに合わせて修正してください。
「$P-」のような形式にすると精度分析ノードで利用できます。

```r
YFieldName<-'$P-taxable_value'
```

selectNcompをつかってどの主成分数までを使うかを決定しています。
```r
library("pls")
#主成分数の決定.
ncomp<-selectNcomp(modelerModel, method="onesigma")
print(paste("ncomp",ncomp))
```

selectNcompで得た主成分数でスコアリングしています。
```r
#スコアリング.
result <- predict(modelerModel, newdata=modelerData, ncomp=ncomp, type="response")
```
予測結果列をcbindで連結しています。
また、予測結果列の列の定義も追加してmodelerDataModelに入れています。modelerDataやmodelerDataModelの利用方法は[こちらのマニュアル](https://www.ibm.com/docs/ja/spss-modeler/18.4.0?topic=SS3RA7_18.4.0/modeler_r_nodes_ddita/clementine/rbuildingnode_syntax.htm)に記述があります。

```r
#予測列の追加
modelerData <- cbind(modelerData, result)

#予測列の定義
var1 <- c(fieldName=YFieldName, fieldLabel="", fieldStorage="real", fieldMeasure="", fieldFormat="", fieldRole="")
modelerDataModel <- data.frame(modelerDataModel, var1)

```


# 参考
#### pls-manual

https://cran.r-project.org/web/packages/pls/vignettes/pls-manual.pdf


#### 偏最小二乗回帰（PLS回帰）分析 | KOTA's Lab.

https://kota.xyz/2017/12/27/plsr/


#### 部分的最小二乗回帰を R で実行する方法 - 統計ER 

https://toukeier.hatenablog.com/entry/principal-component-regression-and-partial-least-squares-regression-in-R

#### モデル作成シンタックス - IBM Documentation 

https://www.ibm.com/docs/ja/spss-modeler/18.4.0?topic=SS3RA7_18.4.0/modeler_r_nodes_ddita/clementine/rbuildingnode_syntax.htm

#### SPSS ModelerのR拡張ノード関連記事へのリンク - Qiita 

https://qiita.com/kawada2017/items/131d7769ecb44043556e