2013年4月22日月曜日

Rで外れ値を計算する方法

Rでスミルノフ・グラブス検定を用いて外れ値を検出する方法のメモです。

調べたら今のところ以下の3つ。
同じデータを用いてそれぞれ計算してみました。

1. outliersパッケージのgrubbs.test関数

> install.packages('outliers')
> library(outliers)
> grubbs.test(df)
Grubbs test for one outlier
data:  df
G = 2.5060, U = 0.5194, p-value = 0.03119
alternative hypothesis: highest value 138.08 is an outlier

2014年1月9日追記
こちらの有り難いページによれば、typeという引数を設定することにより2つの外れ値を出すことも可能だそうです。
type=20 → 大小どちらか片側から最大2つまで外れ値を表示
type=11 → 大小両方から最大2つまでの外れ値を表示
type=10 → 大小どちらか片側から外れ値を1つ表示

2. 青木繁伸先生のSG関数

>SG(df)
[[1]]
スミルノフ・グラブス検定
data:  min(df) = 72.99
t = 1.275, df = 13, p-value = 1
[[2]]
スミルノフ・グラブス検定
data:  max(df) = 138.08
t = 2.506, df = 13, p-value = 0.03119
attr(,"class")
[1] "SG"
ここで有意水準を5%とすると、p < 0.05 の場合はその最大値または最小値が外れ値であると判断できます。リンク先の注意書きにもあるように外れ値は1個ずつ除外すべきですので、最大値または最小値を除外して再度SG関数で計算してみる必要があります。

3. 外れ値を自動的にループして除外してくれるfunction

R - 井上 潤 「外れ値の検出-1」にとても便利な関数がありました。感謝。
上の2つの方法だと、一度外れ値が見つかったらそれを自分で除外して、再度外れ値を検証しなくてはなりません。
しかし、この方法だと一個の外れ値を除外した後、自動的にループして新たに外れ値があるか検証してくれます。何度か繰り返して外れ値がすべて除外した後のデータは以下で取得できます。
  SG(x)$x

こちらも参考に。


2013年3月26日火曜日

R の ggplot2 で facet_wrap のスケールを変える

図を描きたくてRのggplot2パッケージを試しています。
その途中でちょっと躓いたので備忘録として書いておきます。

qplot関数において、facet_wrap もしくは facet_grid を足して格子状に分かれたプロットを描く際に、軸の範囲を設定する方法です。
スケールを設定しない場合は、例えば以下のような記述。

qplot(carat, price, data = diamonds) + facet_wrap (clarity~cut)

これを、以下のように書くとスケールを変えることができます。

1. 自動的にスケールを設定

qplot(carat, price, data = diamonds) + facet_wrap (clarity~cut, scales="free")
と書くと、各々のプロットに適したスケールが自動的に設定されます。
ちなみに scales の引数を free_y にしたらY軸のみ、free_x にしたらX軸のみ自動的に設定されます。

2. 任意の範囲でスケールを設定

qplot(carat, price, data = diamonds) + facet_wrap (clarity~cut) + coord_cartesian(xlim = c(0, 1), ylim = c(250,1000))
と書くと、自分の好きな範囲で軸を設定できます。
(2013/03/29追記)ためしてませんが、scale_x_continuousなどの書き方でも可能のようです。勉強必要。

この書き方だと全部の軸が一斉に変わってしまうのですが、個々のプロットに任意の値を設定することはできるんでしょうか…。まだまだ勉強が必要です。
とりあえず備忘録でした。

2013年1月31日木曜日

[Mac] Virtualboxで Windows 7 から 8 へアップグレード

Windows 8の優待価格が本日(2013年1月31日)までなので、駆け込みで購入しました。
Mac上Virtualboxにて、Windows 7からのアップグレードを進めていたら、「容量が足りません。16GB必要です。」と。
Virtualboxにそんなにサイズ用意してねーよ、ということでストレージを増やすことにしました。
以前、Virtualbox 3でのストレージサイズの変更方法を書きましたが、Virtualbox 4では比較的カンタンにできるようになっていました。ただ、結論から言うと私の環境ではその通りにはできませんでした。なので3で用いた方法と同じようにしたのですが、それ以降でもいくつか手こずった点があったので流れをメモしておきます。また、この方法ではあまり良い結末とはなりませんでした。あくまでネガティブサンプルとして残しておきます。

おおまかな流れを書くと、

  1. ターミナルを使ってカンタンにVirtualboxのストレージを増加できる!?→できない。。。
  2. ClonezillaとGpartedを利用しストレージ増加
  3. Win 8のインストール中にトラックパッド触るとブルースクリーンエラー!→なんとかインストール完了
  4. インストール後もブルースクリーンエラー多発→Win 8を「リフレッシュ」
  5. Win 7で入れていたアプリケーション消失。。。
  6. ま、いっか。とりあえず動いてるし。
て感じです。似たような流れの方はご参考までに。

なお、ターミナルを用いたVirtualbox 4のリサイズ方法には条件があるそうです。
「調べてみると、どうやら "--resize" オプションが有効なのは可変サイズ (Dynamically expanding storage) の VDI または VHD 形式で、今回失敗した固定サイズ (Fixed-size storage) ではダメらしい。また (上限を小さくする) 縮小もできない。 」
VirtualBox: 仮想ディスクのサイズを拡張する (VDI) - Natz's Digital 漂流記
固定サイズにしている場合は、上記ブログに方法が載っています。感謝です。

さて、私も実際にサイズ変更をしてみました。
詳細はここ(英語サイト)に載っています。

が、、、、私は冒頭に書いたとおり、この方法ではうまくいきませんでした。もともとclonezillaとgpartedと使って今の環境を築いたのが理由なのか。よくわかりませんが、結局は前回と同様の方法で行いました。

とりあえず、以下から英語サイトのカンタンな説明です。
この方法ではなく、何らかの方法でリサイズが出来た方は、後半の「アップグレード前の設定変更」へお進みください。

Virtualbox 4 のストレージリサイズ方法

  1. バックアップ(オプション)
    何かあってからでは遅いので、心配な方はバックアップをとります。
    ターミナルで以下を入力します。
    VboxManage clonehd <path to your original drive> <path of the copy>
    おそらくすぐコピーが終わるはずです。
  2. リサイズする
    ターミナルで以下を入力します。
    VBoxManage modifyhd <path to your vdi> --resize <new size in Megabyte>
    ここで、新しいサイズはMB単位で入力します。なお増設予定のGBがストレージ上で何MBになるかは以下をクリックして確認できます(必要に応じて数字を変えてください)。 40GB to megabytes
    入力できたら実行し、これもすぐに終わるはずです。
  3. 確認
    Virtualboxを起動し、サイズが増えていることを確認します。
    このままではWindowsが新しいストレージサイズを認識していないので、Windowsを起動してから以下を行います。
  4. OSに新しいストレージサイズを認識させる
    Windows起動後、スタートメニューをクリックして、出てきた「コンピューター」を右クリックし、「管理」を選択します(※この時、管理者権限でログインしていることが必要です)。「ディスク管理」を開きます。現在使用しているドライブを右クリックして「拡張」を選び、あとは出てくる表示したがって操作を進めれば完了です。
  5. 一旦Windowsを終了します。
あとはWindows 8をインストールするだけです。
ただし、ここでアップグレード前に注意点があります。

アップグレード前の設定変更

  • Virtualboxの設定を変えてから8をインストール
    • 「設定」の「一般」で「バージョン」を「Windows 8(環境によっては64bit)」を選択
      • 私は「Windows 8」を選択しました。
    • ちなみに「高度」の設定はこんな感じ
    • 「設定」の「システム>マザーボード」で「IO APICを有効化」にチェックを入れる。
      • メインメモリーを1024MBに設定(これはご自由に設定してください)。
    • 同じく「システム>プロセッサー」で「PAE/NXを有効化」にチェックを入れる(※特に、この項目はデフォルトではチェックオフになっているかもしれません)
    • 同じく「システム>アクセラレーション」で「VT-x/AMD-Vを有効化」と「ネステッドページングを有効化」にチェックを入れる
    • 「ディスプレイ」の「ビデオメモリー」を128MBに設定。これは私の環境では64MBでは画面の挙動がおかしかったからです。
  • (おそらく特殊な状況ですが)インストール中にトラックパッドを触らない
    なぜか私のMBAでは、インストール中にトラックパッドを触るとブルースクリーンエラーとなり、インストールが止まってしまいました。エラー表示は"IRQL_DRIVER_NOT_LESS_OR_EQUAL"
    ググってみるとドライバがバグってて、メモリの割り当てがナントカカントカ。。。はい、わかりません。インストール中にこれが表示されると、すべて中断され、インストール前の状態、つまりWindows 7に戻ってしまいます。結局、キーボードで操作はできるので、インストール後最初の設定はトラックパッドを触らず、キーボードのみで行いました。環境依存的ではあると思いますが、インストールが途中で失敗する方は気をつけてみても良いかもしれません。
  • インストール後にGuest Additionをインストール

アップグレード後の経緯 

で、無事アップグレード完了…と思いきや、やはり8をインストール出来た後でも、トラックパッドを触ると落ちてブルースクリーンエラーが表示されてしまいます。
とりあえず何度かブルースクリーンエラーを繰り返していると、 トラブルシューティングが出来る選択肢が現れ、「リフレッシュする」を選びました。
しばらく時間がかかり、再起動したら…トラックパッド触っても落ちない!
と思ってたら、Windows 7で入れていたアプリケーションがすべて消えており、ほぼクリーンインストールしたような初期状態に。
うーん、Windowsはほとんど使っておらず特に重要性の高いアプリケーションも入れてなかったので、まぁいいんですが…。あまり良い結末ではないですね。
Virtualboxで7から8にアップグレードする方法を詳述したブログがほとんど英語ばかりなので読むのが面倒でテキトーにやってしまいましたが、Virtualboxがこういう状況にも対応するまで待つほうがいいのか、私が特殊な状況だったのか。どうなんでしょうね。

以上です。

2012年10月30日火曜日

[Mac] Firefox, Chrome, Sleipnirで見ているページをSafariのリーディングリストに送るAppleScript

iPhoneでオフラインでもウェブページが見れるようにしたい。
つまり、Safariのリーディングリストを使いたい(もちろん他にもありますけど)。
でも日頃はFirefox、Chrome(Sleipnirも追加)を使っており、リーディングリストのためだけにSafariを立ち上げるのは面倒です。

少し調べてみると、以下のサイトがあったので参考にさせていただきました。ありがとうございます。
Chrome版は1つめのサイトで即完了。しかしFirefox用は2つ目も合わせてAppleScriptを作ったので備忘録として載せておきます。これをアプリケーションとして作っておけば、Alfredなどのランチャーを使ってさっと起動してリーディングリストに送れます。
しかし、FirefoxはApplescriptの点ではダメなブラウザですね…。なお、Firefox用AppleScriptの最後の行は、上記サイトのものではアプリケーション実行後にSafariが起動したままだったので追記しました。

2013年11月12日追記
  1. Firefox用スクリプトの一行目と後のgui_checkの部分は無くても動作することが分かりました。元々は必要だったみたいですが、MavericksにしたせいかFirefoxのバージョンが上がったせいなのか分かりませんがエラーが出ました。詳しいことは検証できていませんが、現在ではgui_check()がなくても問題なく動作しますのでコメントアウトしてあります。コピペして使用されるときはコメントアウト部分は削除していただいて大丈夫です。
  2. Sleipnir用スクリプトも追加しました。 
    ※たまに動作しません。。。が、とりあえず載せておきます。
    • with title "from Sleipnir"
      という部分はSleipnirで開いているタブのタイトルを取得する方法がわからなかったために苦し紛れに入れています。タイトルがないとリーディングリストに追加できないみたいなので。スクリプト実行後すぐにSafariでリーディングリストを確認すると、オフライン用に保存する前はタイトルが from Sleipnir になっていますが、保存が終わるとページのタイトルを自動的に取得してくれます。さすがSafari。なので、とりあえずこの書き方でも問題なく動作します。
    • key code 53
      という部分はescキーを押すことと同じです。
      番号の割り当ては AppleScript Key Code List を参照してください。

Chrome

tell application "Google Chrome"
 set myURL to get URL of active tab of first window
 set myTitle to get title of active tab of first window
end tell
tell application "Safari" to add reading list item myURL with title myTitle

Firefox

-- my gui_check()
set temp to the clipboard as text
tell application "Firefox"
 activate
 set myTitle to the name of front window
 tell application "System Events"
  keystroke "l" using {command down}
  keystroke "c" using {command down}
  delay 0.5
  set myURL to the clipboard as text
 end tell
end tell
tell application "Safari" to add reading list item myURL with title myTitle
delay 0.5
set the clipboard to temp as text

(* to gui_check()
 tell application "System Events"
  if UI elements enabled is false then
   tell application "System Preferences"
    activate
    set current pane to pane "com.apple.preference.universalaccess"
    set msg to "GUI scripting is not available." & return & "Do you put the check in" & return & "\"Enable access for assistive devices\" ?"
    --display dialog msg buttons {"OK"} default button "OK" with icon note --giving up after 10
    display dialog msg buttons {"cansel", "check and try"} with icon note
   end tell
   set UI elements enabled to true
   delay 0.5
   tell application "System Preferences" to quit
   delay 0.5
  end if
 end tell
end gui_check *)
tell application "Safari" to quit

Sleipnir

(2014年1月23日追記)すみません、下記を以前テストしたときには動いたのですが、たまにうまくいきません。。。改善の余地ありですが時間があるときにやります。。。
set temp to the clipboard as text
tell application "Sleipnir" to activate
tell application "System Events"
 keystroke "l" using {command down, option down}
 keystroke "c" using {command down}
 key code 53
 delay 0.5
 set myURL to the clipboard as text
end tell

tell application "Safari" to add reading list item myURL with title "from Sleipnir"
delay 0.5
set the clipboard to temp as text

tell application "Safari" to quit

しかし…

「リーディングリストに登録したらオフラインでも読める」というのはいつまでなんでしょうかね。かなり前にリーディングリストに追加した記事に久しぶりにアクセスすると「Page not found」と出ました。おそらく一定期間か、一定サイズのどちらかしかオフライン用に保存できないのでしょうね。。。使えるんだか使えないんだか、この機能。いつまでも保存しておきたいなら別のサービスを使ったほうが良いでしょうね。