2014-03-30

実験計画法 (Design of Experiment) とは何か? (6)

RSM, Response Surface Methodology(応答曲面法)とは回帰分析の一種で、目的とする変数に対する複数の因子の影響について、有限のデータから連続的な表面として近似させたものです。 複数変数の最適組み合わせを導くのに使われる実験計画法 (DOE) です。今までの分散分析中心の実験計画法から、ひとまず RSM へ話題を移します。


パッケージ rsm

CRAN からパッケージ rsm をインストールして利用できるようにします。

R を起動して、以下のようにして rsm パケージをインストールします。

> install.packages("rsm")
Installing package into ‘/home/bitwalk/R/x86_64-redhat-linux-gnu-library/3.0’
(as ‘lib’ is unspecified)
 --- このセッションで使うために、CRAN のミラーサイトを選んでください --- 

右のように CRAN のミラーサイト一覧が GUI で表示されるので、近いと思われる適当なサイトを選択して、ダブルクリックあるいは下の「OK」ボタンをクリックします。。

 URL 'http://cran.ism.ac.jp/src/contrib/rsm_2.04.tar.gz' を試しています 
Content type 'application/x-gzip' length 1013015 bytes (989 Kb)
 開かれた URL 
==================================================
downloaded 989 Kb

* installing *source* package ‘rsm’ ...
**  パッケージ ‘rsm’ の解凍および MD5 サムの検証に成功しました 
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
  converting help for package ‘rsm’
    finding HTML links ...  完了 
    ChemReact                               html  
    FO                                      html  
    bbd                                     html  
    ccd                                     html  
    ccd.pick                                html  
    codata                                  html  
    coded.data                              html  
    contour.lm                              html  
    djoin                                   html  
    heli                                    html  
    model.data                              html  
    rsm-package                             html  
    rsm                                     html  
    steepest                                html  
    varfcn                                  html  
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (rsm)

 ダウンロードされたパッケージは、以下にあります 
  ‘/tmp/RtmpSQBlvV/downloaded_packages’ 

以上で無事、パッケージ rsm がインストールされましたので、早速、rsm のマニュアルで紹介されているサンプルから、今後使うことになるプロットを紹介しましょう。

> library('rsm')
> heli.rsm <- rsm (ave ~ block + SO(x1, x2, x3, x4), data = heli)
> heli.rsm

Call:
rsm(formula = ave ~ block + SO(x1, x2, x3, x4), data = heli)

Coefficients:
             (Intercept)                    block2      FO(x1, x2, x3, x4)x1  
               372.80000                  -2.95000                  -0.08333  
    FO(x1, x2, x3, x4)x2      FO(x1, x2, x3, x4)x3      FO(x1, x2, x3, x4)x4  
                 5.08333                   0.25000                  -6.08333  
TWI(x1, x2, x3, x4)x1:x2  TWI(x1, x2, x3, x4)x1:x3  TWI(x1, x2, x3, x4)x1:x4  
                -2.87500                  -3.75000                   4.37500  
TWI(x1, x2, x3, x4)x2:x3  TWI(x1, x2, x3, x4)x2:x4  TWI(x1, x2, x3, x4)x3:x4  
                 4.62500                  -1.50000                  -2.12500  
  PQ(x1, x2, x3, x4)x1^2    PQ(x1, x2, x3, x4)x2^2    PQ(x1, x2, x3, x4)x3^2  
                -2.03750                  -1.66250                  -2.53750  
  PQ(x1, x2, x3, x4)x4^2  
                -0.16250  

> par (mfrow = c (2,3))
> contour (heli.rsm, ~x1+x2+x3+x4, at = xs(heli.rsm))
> contour (heli.rsm, ~x1+x2+x3+x4, at = list(block="2"),
+ atpos = 0, image = TRUE)
> persp (heli.rsm, ~x1+x2+x3+x4, at = xs(heli.rsm))
> persp (heli.rsm, ~x1+x2+x3+x4, at = xs(heli.rsm),
+ contours = "col", col = rainbow(40), zlab = "Flight time",
+ xlabs = c("Wing area", "Wing length", "Body width", "Body length"))
> 

詳細な使い方については、今後、サンプルを使って説明していく予定です。

2014-03-22

NetBeans IDE 8.0 のインストール (Fedora 20)

Java 8 と同時に NetBeans IDE 8 もリリースされ、Linux 用にもパッケージが利用可能でしたので早速インストールしました。

私はずっと参考サイト [1] のサイトから NetBeans IDE をダウンロードし、/opt 以下にインストールして使っていましたが、念の為、yum で調べてみると fedora のリポジトリでも RPM パッケージで利用可能なものがあることが判りました。ただ、NetBeans IDE のバージョン番号がパッケージ名からはよく判らないので今回も使いません。しかし、参考までに、fedora のリポジトリで利用可能な NetBeans IDE をインストールする場合を下記に示しました。

# yum install netbeans-platform
読み込んだプラグイン:langpacks
Dropbox                                                  |  951 B     00:00     
...
(省略)
...
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ netbeans-platform.x86_64 1:7.0.1-9.fc20 を インストール
...
(省略)
...
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package                 アーキテクチャー
                                      バージョン             リポジトリー  容量
================================================================================
インストール中:
 netbeans-platform       x86_64       1:7.0.1-9.fc20         fedora       3.7 M
依存性関連でのインストールをします:
 felix-main              noarch       4.2.0-4.fc20           fedora       493 k
 javahelp2               noarch       2.0.05-15.fc20         fedora       552 k
 jna                     x86_64       3.5.2-2.fc20           fedora       775 k
 jna-contrib             noarch       3.5.2-2.fc20           fedora       476 k
 swing-layout            noarch       1.0.4-8.fc20           fedora        71 k

トランザクションの要約
================================================================================
インストール  1 パッケージ (+5 個の依存関係のパッケージ)

総ダウンロード容量: 6.0 M
インストール容量: 18 M

NetBeans IDE 8.0 インストール前の準備

NetBeans IDE 8.0 をインストールする前に、Java 8 の JDK をインストールしておきます。私の環境では、Fedora の OpenJDK と Oracle の JDK の RPM パッケージをインストールしてあります。

$ rpm -qa | grep jdk
java-1.8.0-openjdk-javadoc-1.8.0.0-0.25.b126.fc20.noarch
java-1.8.0-openjdk-1.8.0.0-0.25.b126.fc20.x86_64
java-1.7.0-openjdk-headless-1.7.0.60-2.4.5.1.fc20.x86_64
jdk-demo-sample-1.8.0-fcs.x86_64
java-1.7.0-openjdk-javadoc-1.7.0.60-2.4.5.1.fc20.noarch
java-1.8.0-openjdk-devel-1.8.0.0-0.25.b126.fc20.x86_64
java-1.7.0-openjdk-1.7.0.60-2.4.5.1.fc20.x86_64
jdk-1.8.0-fcs.x86_64
java-1.7.0-openjdk-devel-1.7.0.60-2.4.5.1.fc20.x86_64

NetBeans IDE 8.0 のインストール

参考サイト [1] のサイトからダウンロードした netbeans-8.0-linux.sh をルート権限で sh で実行します。

# sh ./netbeans-8.0-linux.sh
インストーラを構成しています...
システムでJVMを検索しています...
インストール・データを抽出しています...
インストーラ・ウィザードを実行中...

まず、使用許諾条件に同意します。

インストール先を選択します。ここでは、/opt 以下にインストールするように設定しています。

インストールには暫く時間がかかります。

インストール終了後、メニューから NetBeans IDE 8.0 を選んで起動します。

最初に起動で、以前のバージョンの NetBeans IDE を使っていた場合、設定をインポートするか聞かれるので「Yes」をクリックします。

起動画面が表示されますので、しばし待ちます。

NetBeans IDE 8.0 の画面が表示され無事起動しました。

Java プラットフォームは Oracle の JDK と OpenJDK の両方を利用できるようにしてあります。

Java のバージョンを確認するためのサンプルプログラムの実行例を示しました。

参考サイト

  1. NetBeans IDE ダウンロード

2014-03-09

実験計画法 (Design of Experiment) とは何か? (5)

今回は 3 因子の実験です。因子数と水準数が増えると実験数は飛躍的に大きくなりますので、まずは繰り返し実験がなく、水準数を 2 にしたシンプルな例を取り上げます。


3 因子 2 水準の実験(繰り返しなし)

条件温度流量回転数収率
11低1小1低81.08
21低1小2高80.66
31低2大1低80.73
41低2大2高76.14
52高1小1低83.39
62高1小2高81.98
72高2大1低83.83
82高2大2高78.81

例)

ある製品の製造工程において、「温度」、「流量」、「回転数」の 3 つの因子が収量に影響を与えるかどうかを調べるため、2 水準の実験を計画し、各条件の収量を測定した結果を右に示した。この 3 因子が収量に及ぼす影響を分析せよ。ただし、過去の知見から「流量」と「回転数」には交互作用のあることが判っているものとする。

右のテーブル全体を選択して(クリップボードへ)コピーしてから、R 上で次のコマンドを実行してください。クリップボードの値が R のデータフレーム(テーブル)へ読み込まれます。

> tbl <- read.table("clipboard", header = T)
>

因子「流量」と「回転数」の間には交互作用が存在するとして、aov() 関数で分散分析をしてみましょう。

> result.aov <- aov(収率 ~ 温度 + 流量 * 回転数, data = tbl)
> summary(result.aov)
            Df Sum Sq Mean Sq F value  Pr(>F)   
温度         1 11.045  11.045   38.36 0.00848 **
流量         1  7.220   7.220   25.08 0.01533 * 
回転数       1 16.359  16.359   56.82 0.00484 **
流量:回転数  1  7.566   7.566   26.28 0.01437 * 
Residuals    3  0.864   0.288                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>

「収率」に対する各主因子と交互作用因子による影響の差は、有意水準 5% で有意であるという結果になりました。

各水準の平均

model.tables() で、各水準の "平均値" を算出します。

> mm <- model.tables(result.aov, type = "mean")
> mm
Tables of means
Grand mean
        
80.8275 

 温度 
温度
  1低   2高 
79.65 82.00 

 流量 
流量
  1小   2大 
81.78 79.88 

 回転数 
回転数
  1低   2高 
82.26 79.40 

 流量:回転数 
     回転数
流量 1低   2高  
  1小 82.23 81.32
  2大 82.28 77.47
>

上記の数字をグラフにしてみます。

> ylist <- c(mm$tables$温度, mm$tables$流量, mm$tables$回転数, mm$tables$"流量: 回転数")
> plot(0, 0, xlim = c(1, 8), ylim = c(min(ylist), max(ylist)), xaxt = "n", xlab = "", ylab="収 率")
> points(1:6, c(mm$tables$温度, mm$tables$流量, mm$tables$回転数), cex = 2, pch = 16)
> lines(1:2, mm$tables$温度)
> axis(1, at = 1:2, c(names(mm$tables$温度)))
> axis(1, at = 1.5, "温度", tick = F, padj = 1.5) 
> lines(3:4, mm$tables$流量)
> axis(1, at = 3:4, c(names(mm$tables$流量)))
> axis(1, at = 3.5, "流量", tick = F, padj = 1.5)
> lines(5:6, mm$tables$回転数)
> axis(1, at = 5:6, c(names(mm$tables$回転数)))
> axis(1, at = 5.5, "回転数", tick = F, padj = 1.5)
> points(7:8, c(mm$tables$"流量:回転数"[1, ]), cex = 2, pch = 0)
> lines(7:8, mm$tables$"流量:回転数"[1, ], lty = 2)
> points(7:8, c(mm$tables$"流量:回転数"[2, ]), cex = 2, pch = 2)
> lines(7:8, mm$tables$"流量:回転数"[2, ], lty = 2)
> axis(1, at = 7:8, c(names(mm$tables$"流量:回転数"[1, ])))
> axis(1, at = 7.5, "(回転数)", tick = F, padj = 1.5)
> axis(1, at = 7.5, "流量×回転数", tick = F, padj = 3)
> text(7.5, mm$tables$"流量:回転数"[1, 2] + 0.5, labels = "(流量)1小")
> text(7.5, mm$tables$"流量:回転数"[2, 2] + 0.5, labels = "(流量)1大")
>

ここで各水準の "平均値" について、データフレーム tbl を使って、いくつか検算をしておきましょう。

まず Grand mean ですが、これは単純に、全収率の平均値(全平均)になります。

> gm <-mean(tbl$収率)
[1] 80.8275

次に、3 因子の各水準の平均ですが、例えば、因子「温度」の場合、次のように算出します。他の因子も同じように算出します。

> mean(tbl[tbl$温度 == "1低", "収率"])
[1] 79.6525
> mean(tbl[tbl$温度 == "2高", "収率"])
[1] 82.0025

因子「流量」と「回転数」の交互作用については、次のような計算になります。

> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "1低"), "収率"])
[1] 82.235
> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "2高"), "収率"])
[1] 81.32
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "1低"), "収率"])
[1] 82.28
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "2高"), "収率"])
[1] 77.475
>

効果の算出

model.tables() で、各水準の "効果" を算出します。

> ee <- model.tables(result.aov, type = "effects")
> ee
Tables of effects

 温度 
温度
   1低    2高 
-1.175  1.175 

 流量 
流量
  1小   2大 
 0.95 -0.95 

 回転数 
回転数
  1低   2高 
 1.43 -1.43 

 流量:回転数 
     回転数
流量 1低     2高    
  1小 -0.9725  0.9725
  2大  0.9725 -0.9725
>

効果の方も、収率の平均と同じようにグラフにしてみます。

> ylist <- c(ee$tables$温度, ee$tables$流量, ee$tables$回転数, ee$tables$"流量:回転数")
> plot(0, 0, xlim = c(1, 8), ylim = c(min(ylist), max(ylist)), xaxt = "n", xlab = "", ylab="要 因 効 果")
> points(1:6, c(ee$tables$温度, ee$tables$流量, ee$tables$回転数), cex = 2, pch = 16)
> lines(1:2, ee$tables$温度)
> axis(1, at = 1:2, c(names(ee$tables$温度)))
> axis(1, at = 1.5, "温度", tick = F, padj = 1.5)
> lines(3:4, ee$tables$流量)
> axis(1, at = 3:4, c(names(ee$tables$流量)))
> axis(1, at = 3.5, "流量", tick = F, padj = 1.5)
> lines(5:6, ee$tables$回転数)
> axis(1, at = 5:6, c(names(ee$tables$回転数)))
> axis(1, at = 5.5, "回転数", tick = F, padj = 1.5)
> points(7:8, c(ee$tables$"流量:回転数"[1, ]), cex = 2, pch = 0)
> lines(7:8, ee$tables$"流量:回転数"[1, ], lty = 2)
> points(7:8, c(ee$tables$"流量:回転数"[2, ]), cex = 2, pch = 2)
> lines(7:8, ee$tables$"流量:回転数"[2, ], lty = 2)
> axis(1, at = 7:8, c(names(ee$tables$"流量:回転数"[1, ])))
> axis(1, at = 7.5, "(回転数)", tick = F, padj = 1.5)
> axis(1, at = 7.5, "流量×回転数", tick = F, padj = 3)
> text(7, ee$tables$"流量:回転数"[1, 1] * 1.1, labels = "(流量)1小")
> text(7, ee$tables$"流量:回転数"[2, 1] * 1.1, labels = "(流量)1大")
> abline(h = 0)
>

ここで各水準の "効果" についても "平均値" のときと同様に、データフレーム tbl を使って、いくつか検算をしておきましょう。

主効果については、各水準の平均から全平均を引いた値を効果としています。以下は、因子「流量」と「回転数」における、各水準の効果の算出例です。

> eff.flow_s <- mean(tbl[tbl$流量 == "1小", "収率"]) - gm
> eff.flow_s
[1] 0.95
> eff.flow_l <- mean(tbl[tbl$流量 == "2大", "収率"]) - gm
> eff.flow_l
[1] -0.95
> eff.rpm_l <- mean(tbl[tbl$回転数 == "1低", "収率"]) - gm
> eff.rpm_l
[1] 1.43
> eff.rpm_h <- mean(tbl[tbl$回転数 == "2高", "収率"]) - gm
> eff.rpm_h
[1] -1.43

交互効果については、各水準の平均から全平均を引いた値から、さらに、各主効果の該当する水準の効果を差し引いた値を、効果としています。因子「流量」と「回転数」の交互効果の算出例です。

> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "1低"), "収率"]) - gm - eff.flow_s - eff.rpm_l
[1] -0.9725
> mean(tbl[(tbl$流量 == "1小") & (tbl$回転数 == "2高"), "収率"]) - gm - eff.flow_s - eff.rpm_h
[1] 0.9725
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "1低"), "収率"]) - gm - eff.flow_l - eff.rpm_l
[1] 0.9725
> mean(tbl[(tbl$流量 == "2大") & (tbl$回転数 == "2高"), "収率"]) - gm - eff.flow_l - eff.rpm_h
[1] -0.9725
> 

2014-03-06

ReactOS 0.3.16 / VirtualBox

2 月 3 日付で ReactOS 0.3.16 がリリースされていました。一ヶ月以上経ってしまいましたが VirtualBox 用のイメージをダウンロードして起動してみました。

しばらく、リリースを追っていなかったので、既に変わっていたのかもしれませんがエクスプローラが新しくなっているようでビックリです。リリースノートを読んでもぴんときません。CSRSS (Client/Server Runtime Server Subsystem) と shell32 が書き直されたとのことです。もう少し詳しい記述があるといいのですが。。。。そう思ってプロジェクトに参加しても、きっと何も寄与できないような気がします。さしあたって、このリリースをもう詳しく調べてみようと思います。

  1. オープンソースのWindows互換OS「ReactOS 0.3.16」リリース

2014-03-02

Windows の使いみち / VirtualBox

Fedora 20 が昨年リリースされたのを機に Windows との切り替えを止めて、自宅のメイン PC を Linux 専用に使うことにしたことは、以前の記事 1. で触れた通りで、日常の使用に支障は何も出ていません。しかし、Windows Vista まではずっと買い続けてきたので、このまま使わずに放っておくのも勿体無いことです。そこで Windows 用にクロスコンパイルしたバイナリの最後の動作確認の環境用に使おうと考え、仮想マシンにインストールしました。

今回使用した仮想マシン(仮想化ソフトウェア)は、Oracle VM VirtualBox 2. です。Fedora の場合、RPMFusion 3. の Free のリポジトリからインストールできます。VirtualBox については、ちょっと古い記事ですが、参考サイト 4. が参考になります。概略は Wikipedia 5. でも説明されています。

$ yum info VirtualBox
Loaded plugins: langpacks
Installed Packages
Name        : VirtualBox
Arch        : x86_64
Version     : 4.3.6
Release     : 4.fc20
Size        : 89 M
Repo        : installed
From repo   : rpmfusion-free-updates
Summary     : A general-purpose full virtualizer for PC hardware
URL         : http://www.virtualbox.org/wiki/VirtualBox
License     : GPLv2 or (GPLv2 and CDDL)
Description : A general-purpose full virtualizer and emulator for 32-bit and
            : 64-bit x86 based PC-compatible machines.

スクリーンショットをいくつか紹介しておきます。まずは、VirtualBox での Windows Vista の設定画面です。

VirtualBox 上の WIndows Vista ではネットワークプリンタへ印刷できるようにしました。Linux からも印刷できるとは言え、細かい印刷制御については Windows から印刷する方に分があるように思えるからです。

参考サイト

  1. bitWalk's: Linux と プリンタ:Epson PX-105 の使用感
  2. Oracle VM VirtualBox
  3. RPM Fusion - RPM Fusion
  4. 仮想PCで学ぶ「体当たり」Windowsシステム管理:第9回 Oracle VM VirtualBoxを使う(前) (1/3) - @IT
  5. VirtualBox - Wikipedia