2013年11月1日金曜日

[自分用] Rの基本

久しくRを触ってなかったんですが論文執筆のために触ることになり、何からすれば良いのかも戸惑う始末。なのでダメな自分用にメモっておきます。随時追加するかも。
ちなみに私のRの使用目的はグラフを作るのがメインです。あくまで自分用なので、「基本」と書きつつも私がよく使うものだけを列記します。

Rstudio立ち上げましょう

まずはここから。

CSV読み込みましょう

d <- read.csv("path to file", header = T or F) ワークディレクトリはデフォルトではホームフォルダに設定されてる。変更したければRstudioの環境設定から変える。<注意:csvファイルのカンマ区切りはスペースを含まないようにする。スペースも文字としてカウントされてしまうため。>
以下、データはこんなのを想定してます。

Species Season Value
A Spring 12
A Summer 36
B Spring 41
B Summer 19

特定の行または列だけ選びたければ

d[1,] (行)
d[,1] (列)

行とか列を削除したいときは

d[,-c(2,3,4)] #(2,3,4列目を削除)

オブジェクトの削除

a, b, cという3つのオブジェクトを一度に消す rm(a,b,c) 

条件からデータを抽出

例えば季節(Season)がSpringのデータだけ抽出したい、とか。 d.spring <- subset(d, Season=="Spring")

データの取り出し方いろいろ

説明しにくいので、読んで分かれ自分。
#ベクトル作成
> v<-c(2,3,4,5,6)

#普通に表示
> v
[1] 2 3 4 5 6

#2で割って余りが0になる=TRUE
> v%%2==0
[1] TRUE FALSE TRUE FALSE TRUE

#TRUEになるデータだけピックアップ
> v[v%%2 ==0]
[1] 2 4 6

#TRUEのデータが何番目かを表示
> which(v%%2==0)
[1] 1 3 5

#1,3,5番目のデータをピックアップ、二つ上のコードと結果は同じだけど。
> v[which(v%%2==0)]
[1] 2 4 6

とりあえずplotしてみる

plot(x,y,…) という書き方なので以下だとX軸にdのSeason、Y軸にdのValueが表示されます。 plot(d$Season, d$Value, main="title of figure") ちなみに、タイトルが長すぎて改行を入れたい場合は、 main="title of figure\nsubtitle" のように改行したいところに\nを入れれば、"title of figure" と "subtitle"の間に改行が入る。
※Macの場合。Windowsでは¥nを入れる。

x軸の項目名が1,2,3...とかなってるけど任意の名前にしたいとき

plot(data, xaxt="n") とxaxtパラメータでx軸の名前を入れないようにして一旦描画。次に、 axis(side=1, at=c(1:n), labels=LabelName) としてx軸に上書き。sideパラメータは1:下,2:左,3:上,4:右。atはx軸の項目数。その数と同じだけのLabelNameを先に作っておいて、x軸の項目名を置き換えるわけです。このLabelNameは文字列(character)でもベクターでもOKなようです。ここで、項目名が長いために90度回転させたいならlasというパラメータを入れる。こちらの有り難いページによれば以下とのこと。
可能な値は 0 (標準・軸に平行), 1 (x軸,y軸とも水平), 2 (x軸,y軸とも軸に垂直),3 (x軸,y軸とも垂直(半時計回りで90度回転)) の4つ
axis(side=1, at=c(1:n), labels=LabelName, las=3)

ヒストグラムも描いてみようかな

hist(d$Value)

ggplot2てパッケージがあったよな、たしか

インストール(初回だけで良い) install.packages("ggplot2") 読み込み library("ggplot2")

ggplot2でもプロットしてみる

qplot(data=hoge.rule1, Season, Value, main="title of figure") 分類(Species)に基づいて色分けしたいときは
qplot(data=hoge.rule1, Season, Value, main="title of figure", color = Species)

ggplot2は + で表現を追加できる

facet_wrapで複数のプロットを一度に描ける。以下の例では種ごとにプロットを作成。scalesで軸の範囲を設定可能
+ facet_wrap( ~ Species, scales = "free_y")   レイヤーの発想で点を重ねることも可能。以下の例ではsizeが3の点の上に、sizeが1.5の薄いグレーの点を重ねることで赤い境界線だけに見えるプロットになる。
+ geom_point(size=3, color="red") + geom_point(size=1.5, color="grey90")

ggplot関数に+していくとqplotより複雑なことができる(らしい)

ggplotで基本的なデータ要素、X、Yを決めてあげて、それに+してどんなプロットの形にするか等を追加していくことが可能みたい。 p <- ggplot(d, aes ( Season, Value ) )
p + geom_boxplot ( aes ( fill = Species )

ggplot2のqplotで参照するページ

ggplot2のqplot関数のまとめ - ぬいぐるみライフ(仮)
qplot. ggplot2 0.9.3.1

結果をテキストファイルに書き出し

sink(“results.txt”) と書くと、これ以降の出力をresults.txtに書き出してくれる。止めるときは、 sink()

他に参考にするページ

Google の R の書き方案内

2013年10月7日月曜日

SNSと「自分」

Facebookがインフラになる一方で、やはりそうしたSNSに違和感を覚えて使わない人もいます。使わない理由は人それぞれでしょうが、プライバシーなどは最もよく聞く理由のひとつかもしれません。ちなみに僕自身はTwitterもFacebookも活発ではありませんが利用します。
さて、SNSを利用しない友人と話してて、少し興味深い話があったのでメモっておきます。

友人がSNSに違和感を覚える意見が、
「(リアルな)自分とは別の存在として、しかしあたかも他人にとっては自分であるかのように振舞う存在があるのが嫌」
というもの。
つまり「今日は気分が悪い」とかいう日々の気持ちの移り変わりがあったりして、「動的な存在」であるが、ネット上のアカウントはそうしたものに影響を受けない「静的な存在」であり、そうした静的存在が自分のあずかり知らぬところで「自分」をアピールするのが気味悪いということです。

なるほど、と思いました。
例えば、ネット上でのプロフィールに「◯◯という仕事をしており、将来は各国の架け橋になりたいです」なんて書いてたりすると、僕がたまたま「今日はしんどい、架け橋なんてどうでもいい」と思っていても、ネットでそのプロフィールを見た人は「なんてやる気のある人なんだ〜」というようなことを感じたりするわけです。その不一致が気持ち悪いというのも理解できます。
もちろん、しんどいときに代わりにPRしてくれるのであれば、それはメリットでもあります。使いかた、感じ方は人それぞれ、という当然の結論ですが、いわゆる自己同一性みたいな概念はSNS全盛の今どのように考えられるのか、専門家の話を聞いてみたくなりました。

これに関連して、WIREDに面白い記事が。
匿名性と実名性:「ネット上の人格」を考える

2013年9月20日金曜日

MEGA 5 でアラインメントを印刷する方法

普段あまり印刷はしないので後輩に聞かれて分からず、調べたことをメモしておきます。

MEGAの基本的な使いかたは以下をご参照ください。
http://togotv.dbcls.jp/20110705.html#p01

では、以下から印刷の方法です。

1. .megファイルを用意

アラインメントだけでしたら、.masファイルのみを使っている方も多いと思います。
これを以下の手順で.megファイルに変換します。.megファイルがあれば変換は必要ありません。
  1.  Data -> Export Alignment -> MEGA Format
  2. 適宜名前を付けて保存保存します

2. .megファイルを印刷用ファイルに変換して印刷

上で作成した.megファイルを開きます。
  1. Data -> Export Data を選択
    • megファイルのアラインメントは、一番上に使用配列群のコンセンサスが表示されます。個々の配列においては、コンセンサスと相同な配列が「・」で表示されます。このまま印刷したら「・」のままです。
      そうではなく配列を全部表示したい場合は、
       Display -> Use Identical Symbol
      のチェックをはずしてください。すべての文字が表示されます。
    • また、Color Cellのチェックを入れることで.megファイル上では文字に色をつけることができますが、印刷用ファイルには反映されません。色がつけば印刷したアラインメントがもっと見やすくなるんですが…。もし方法があれば教えてください。
  2. 以下のパラメータを適当に選択して「OK」して印刷用ファイルに変換
    • Title, Description = 空欄でも大丈夫。
    • Format = お好きに。どれでも良ければデフォルトの「MEGA」で。
    • Sites per line = 一行の文字数。だいたい40か50くらいでA4に収まります。なお、配列名が長いと一行に入る文字数が減りますので、その場合は配列名を変更しましょう。megファイルでは配列名をクリックしただけでは名前が変えられないので、Data -> Select & Edit Taxa/Groupsにおいて配列名をクリックし、一呼吸おいてまたクリックすると変更可能になります。masファイルに戻って配列名を変更しても構いません(もちろんその場合は再度megファイルに変換してください)。
      Interleaved Outputのチェックを外すと印刷用ファイルで配列名が消えます。
    • Writing site numbers = 配列の番号
    • Missing data and alignment gaps = 相同性のある部分だけを見せるか、等
  3. 出てきたウィンドウで罫線が引いてある範囲に入ってれば基本的にA4に収まるはずです。罫線から飛び出していたら、一度ウィンドウを閉じて、上記のSites per lineあたりを変更してA4に収まるよう調整しましょう。フォントとか大きさとか変えられるので、気になる方はどうぞ。
    調整できたらFile -> Printを選択するか、プリンターアイコンをクリック。
    パラメータを適当に選択して「OK」。基本的にデフォルトで大丈夫。
  4. あとは普通の印刷と同じです。
以上です。
正直、面倒ですね笑 もっと良い方法があれば知りたい。。。

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がこういう状況にも対応するまで待つほうがいいのか、私が特殊な状況だったのか。どうなんでしょうね。

以上です。