ページ

ラベル R の投稿を表示しています。 すべての投稿を表示
ラベル R の投稿を表示しています。 すべての投稿を表示

2013年6月18日火曜日

Rのコンソールの出力をカラー表示にするパッケージ

パソコンのシステム入れ替えにともなって、いつものようにR用のエディタ(VIM)も再設定。

その際、Rのコンソールの出力をカラー表示にするパッケージを発見。

なにやらCRANのポリシーに反するそうで、インストールは以下のようにR上で直接ダウンロード&インストール


download.file("http://www.lepem.ufc.br/jaa/colorout_1.0-1.tar.gz", destfile = "colorout_1.0-1.tar.gz")
install.packages("colorout_1.0-1.tar.gz", type = "source", repos = NULL)


パッケージをロードすると、自動でカラー出力になる。

まあ.....ちょっと気持ち悪い気もするが.....いや気持ち悪い

カラーハイライトはエディタだけでいいかな

2013年4月9日火曜日

Rcpp+inlineを使ってみた

まえから気になっていたRcpp+inlineを使ってみた

単純な繰り返しループの集計計算がかなり時間がかかるので、Rcppでどれくらい改善されるか挑戦

まずは通常のコード

非常に単純で以下のxとBeta,Alphaの線形結合のquantileを求めるというもの。
x <- rnorm(100)
Beta <- Alpha <- rnorm(1000000)
res1 <- sapply(1:length(x), function(i) 
               quantile(exp(Beta*x[i]+Alpha)/(1+exp(Beta*x[i]+Alpha)),probs=0.025))
次にRcpp+inline
library(Rcpp)
library(inline)
src <- "NumericVector xx(x);
  NumericVector beta(b);
  NumericVector alpha(a);
  Function quantile(\"quantile\");
  int xsize=xx.size(), bsize=beta.size();
  NumericVector mu(bsize);
  NumericVector res(xsize);
  for(unsigned long int i=0; i < xsize; i++){
   for(unsigned long int j=0; j < bsize; j++){
    double dummy=exp(beta[j]*xx[i]+alpha[j]);
    mu[j]=0.0;
    mu[j]=dummy/(1.0+dummy);
   }
   res[i]=0.0;
   res[i]=as(quantile(mu, _[\"probs\"]=0.025));
  }
  return res;"

fun.R <- cxxfunction(signature(x="numeric",a="numeric",b="numeric"),
       src,plugin="Rcpp")

結果
x <- rnorm(100)
Beta <- Alpha <- rnorm(1000000)
system.time(res1 <- sapply(1:length(x), function(i) 
    quantile(exp(Beta*x[i]+Alpha)/(1+exp(Beta*x[i]+Alpha)),probs=0.025)))
   ユーザ   システム       経過  
    19.162      1.008     20.169 
system.time(res2 <- fun.R(x,Beta,Alpha))
   ユーザ   システム       経過  
     8.936      0.932      9.870 
計算結果も同じだった
summary(res1-res2)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      0       0       0       0       0       0 
RcppでRの関数を使うのではなく、GNU Scientific Library (GSL)のquantile(gsl_stats_quantile_from_sorted_data)も試してみたけどこちらは通常のRの1.5倍ぐらいの時間がかかった....
何がボトルネックなんだろう...

2013年4月8日月曜日

R メジャーバージョンアップ

知りませんでしたが、Rのバージョンがアップされたようです。

統計解析ツール「R」、8年半ぶりのメジャーバージョンアップ版「R 3.0.0」リリース

ニュースをみるといろいろと変わっているようです。

2011年12月5日月曜日

Vimにvim-r-pluginをインストール

ubuntuで、VIMからRを使えるようにするため、vim-r-pluginをインストールする

まず必要なライブラリ等々をインストール
sudo apt-get install libevent-1.4-2 libevent-dev libncurses5-dev

tmux(>=1.3)も必要なのだが、ubuntuのリポジトリには1.1しかないので、ソースからインストール
tmuxのサイトから最新版(1.5)をダウンロード
適当なディレクトリに展開してインストール
$ .configure
$ make
$ sudo make install

screen.vim pluginもインストール
Screen (vim + gnu screen/tmux)のページからscreen.vbaの最新版をダウンロード

vimでscreen.vbaを開いて
$ vim screen.vba

インストール
:so %

Vim-R-plugin : Plugin to work with Rからvim-r-plugin-****.zipをダウンロード。
今日現在の最新版は、vim-r-plugin-111114.zip

ホームディレクトリ直下の.vim以下に展開
$ unzip vim-r-plugin-111114.zip -d ~/.vim

vimを起動してヘルプタグを追加
$ vim
:helptags ~/.vim/doc

.vimrcに以下を書き込にホームディレクトリに保存
set nocompatible
syntax enable
filetype plugin on
filetype indent on

以上で完了

使うにはスクリプトファイルをvimで読み込み\rfとタイプするとRが起動する
$ vim test.R
\rf



使い方を勉強しよう...

2011年7月15日金曜日

Rで同じ名前の関数を実行

Rのいくつかのパッケージでは同じ名前の関数がある。

たとえば、gamパッケージとmgcvパッケージのgam()や、pROCパッケージとPresenceAbsenceパッケージのauc()など

これらの関数は基本的に後から読みだしたパッケージの関数名が上書きされるので、その前に読みだしたパッケージの関数を使いたいと思ってもそのままでは使えない。

この問題は、パッケージ名を指定して関数を実行することで回避できる。

パッケージ名::関数名

例えば
mgcv::gam()

2011年6月29日水曜日

ESSでアンダーバーを入力する

小一時間ぐらいはまってしまいました。

emacsでessでRを使おうとすると"_"(アンダーバー、アンダースコア)が奪われて、入力できなくなる。
アンダーバーはオブジェクト名によく使うので無効にしておく

こちらを参考に、.emacsに以下を追加
(ess-toggle-underscore nil)

2011年6月22日水曜日

ubuntuでrgdal

ubuntu上のRでspgrass6を使うときの防備録

通常ではrgdalのインストール中にエラーがでる。
こちらのサイトを参考に、以下のパッケージをインストール

sudo aptitude install gdal libgdal-dev libproj-dev

2011年4月12日火曜日

BAM

しばらく自粛していましたが,投稿を再開します。

今日はBAMについて

Rで一般化加法モデル(Generalized Additive Model)を使うにはmgcvを使うことが多いと思う。
mgcvでGAMを行うには,関数gam()を使うが,これとは別に関数bam()もある。


ヘルプページによると
Generalized additive models for very large datasets
とある。


詳しく説明を読むと
Description:

Fits a generalized additive model (GAM) to a very large data set,the term `GAM' being taken to include any quadratically penalized GLM. The degree of smoothness of model terms is estimated as part of fitting. In use the function is much like ‘gam’, except that the numerical methods are designed for datasets containing upwards of several tens of thousands of data. The advantage of ‘bam’ is much lower memory footprint than ‘gam’, but it can also be much faster, for large datasets.
gamとは推定方法が異なるが,どうも計算が速いらしい。


実際に使ってみると確かに速い。
(もう少し確認が必要だが...)結果はほとんど変わらないように見える。
自分のデータ(約7000件)では,これまで80秒ぐらいかかっていたが,約半分ぐらいまで短くなる。


もし大規模なデータを使っていて,さらにMuMInでモデル選択をしたい方はお試しあれ。
ただバージョンによってcontrolの指定方法が異なるので要注意。

2011年2月2日水曜日

RとFortranの演算速度の比較

そろそろFortranもお勉強しようかとおもい、プログラムをしてみることに!!

作業は、2地点間の距離と角度を求めるというシンプルなもの
ただ、データ数が多く、組み合わせが全部で22,232,390もある。

まずRでプログラミング
特に変なことはしていないと思いますが...

Tree<-read.csv("TreePlot",header=T)
IncW3<-read.table("IncW3Th10S3",header=T,sep=" ")
IncW5<-read.table("IncW5Th10S3",header=T,sep=" ")
IncW11<-read.table("IncW11Th10S3",header=T,sep=" ")

Tree<-as.matrix(Tree[,1:5])
IncW3<-as.matrix(IncW3)
IncW5<-as.matrix(IncW5)
IncW11<-as.matrix(IncW11)

DistW3<-matrix(rep(NA,nrow(Tree)*nrow(IncW3)*7),ncol=7)
DistW5<-matrix(rep(NA,nrow(Tree)*nrow(IncW5)*7),ncol=7)
DistW11<-matrix(rep(NA,nrow(Tree)*nrow(IncW11)*7),ncol=7)

for (i in 1:nrow(Tree)){
 for (j in 1:nrow(IncW3)){
 DistW3[i*j,1:4]<-c(Tree[i,4:5],IncW3[j,1:2])
 DistW3[i*j,5]<-sqrt((Tree[i,4]-IncW3[j,1])^2+(Tree[i,5]-IncW3[j,2])^2)
 DistW3[i*j,6]<-atan((Tree[i,5]-IncW3[j,2])/(Tree[i,4]-IncW3[j,1]))
 DistW3[i*j,7]<-atan((Tree[i,5]-IncW3[j,2])/(Tree[i,4]-IncW3[j,1]))*180/pi
 }
 for (j in 1:nrow(IncW5)){
 DistW5[i*j,1:4]<-c(Tree[i,4:5],IncW5[j,1:2])
 DistW5[i*j,5]<-sqrt((Tree[i,4]-IncW5[j,1])^2+(Tree[i,5]-IncW5[j,2])^2)
 DistW5[i*j,6]<-atan((Tree[i,5]-IncW5[j,2])/(Tree[i,4]-IncW5[j,1]))
 DistW5[i*j,7]<-atan((Tree[i,5]-IncW5[j,2])/(Tree[i,4]-IncW5[j,1]))*180/pi
 }
 for (j in 1:nrow(IncW11)){
 DistW11[i*j,1:4]<-c(Tree[i,4:5],IncW11[j,1:2])
 DistW11[i*j,5]<-sqrt((Tree[i,4]-IncW11[j,1])^2+(Tree[i,5]-IncW11[j,2])^2)
 DistW11[i*j,6]<-atan((Tree[i,5]-IncW11[j,2])/(Tree[i,4]-IncW11[j,1]))
 DistW11[i*j,7]<-atan((Tree[i,5]-IncW11[j,2])/(Tree[i,4]-IncW11[j,1]))*180/pi
 }
}

結果
ユーザ   システム       経過  
  1522.730      1.510   1528.272 

約25分ぐらいですか

次にFortranの場合
コードはこちら
program DistCalc
 implicit none
 real,dimension(1565,5)::Tree
 real,dimension(7146,3)::IncW3
 real,dimension(4952,3)::IncW5
 real,dimension(2108,3)::IncW11
 real pi
 real DistW3(1565*7146),AngW3(1565*7146)
 real DistW5(1565*4952),AngW5(1565*4952)
 real DistW11(1565*2108),AngW11(1565*2108)
 integer i,j 

 open(10, file='Tree')
 open(20, file='IncW3')
 open(30, file='IncW5')
 open(40, file='IncW11')
 read(10,*) ((Tree(i,j),j=1,5),i=1,1565) !iは行、jは列
 read(20,*) ((IncW3(i,j),j=1,3),i=1,7146)
 read(30,*) ((IncW5(i,j),j=1,3),i=1,4952)
 read(40,*) ((IncW11(i,j),j=1,3),i=1,2108)

 do i=1,1565
  do j=1,7146
  DistW3(i*j) = sqrt((Tree(i,4)-IncW3(j,1))**2 + (Tree(i,5)-IncW3(j,2))**2)
  AngW3(i*j) = atan2((Tree(i,5)-IncW3(j,2)),(Tree(i,4)-IncW3(j,1)))
  end do
 end do

 do i=1,1565
  do j=1,4952
  DistW5(i*j) = sqrt((Tree(i,4)-IncW5(j,1))**2 + (Tree(i,5)-IncW5(j,2))**2)
  AngW5(i*j) = atan2((Tree(i,5)-IncW5(j,2)),(Tree(i,4)-IncW5(j,1)))
  end do
 end do

 do i=1,1565
  do j=1,2108
  DistW11(i*j) = sqrt((Tree(i,4)-IncW11(j,1))**2 + (Tree(i,5)-IncW11(j,2))**2)
  AngW11(i*j) = atan2((Tree(i,5)-IncW11(j,2)),(Tree(i,4)-IncW11(j,1)))
  end do
 end do

 pi=4*atan(1.0)

 open(50,file="DistW3")
 do i=1,1565
  do j=1,7146
  write(50,*) Tree(i,4), Tree(i,5), IncW3(j,1), IncW3(j,2),&
   DistW3(i*j), AngW3(i*j), (AngW3(i*j)*180)/pi
  end do
 end do

 open(70,file="DistW5")
 do i=1,1565
  do j=1,4952
  write(70,*) Tree(i,4), Tree(i,5), IncW5(j,1), IncW5(j,2),&
   DistW5(i*j), AngW5(i*j), (AngW5(i*j)*180)/pi
  end do
 end do

 open(80,file="DistW11")
 do i=1,1565
  do j=1,2108
  write(80,*) Tree(i,4), Tree(i,5), IncW11(j,1), IncW11(j,2),&
   DistW11(i*j), AngW11(i*j), (AngW11(i*j)*180)/pi
  end do
 end do

end program DistCalc

で結果はというと、一目瞭然ですね!!
$ f95 DistCalc.f90
$ ./a.out

real 3m20.994s
user 3m14.140s
sys 0m5.330s

今回の場合には、Fortranのコードを書くだけで結構時間がかかった(まだ初心者なので)ので、Rだけで作業しても良かったかもしれません。
ですが、今後のことを考えてもFortranをお勉強したほうが良いですね〜
できればC++もお勉強したいのですが...

2010年5月23日日曜日

グラフィックディバイス

今までまったく知らなかったけど、RはSVG形式でもグラフを出力できる!!
パッケージ 'grDevices' の情報
これまではわざわざPDFに出力してInkscapeで編集、
またはEPSに出力してpstoeditでSVG形式に変換してからInkscapeで編集していた。

 pstoedit -f plot-svg *.eps *.svg
けど、これからはInkscape標準のSVG形式で出力すことにしよう!!

> dev.print(svg,file="filename.svg")
> dev.off()

2010年4月27日火曜日

サポートページ

かなり遅くなったけど、植生情報の14号に執筆した「Rを活用した毎木データの解析」のサポートページを開設しました。

Rによる毎木調査データの処理(Rプログラミング入門)サポートページ

もしよかったら立ち寄ってみてください。

2009年7月7日火曜日

ひさびさにPSTOEDIT!! pstoedit

さてさて皆さんはRで書いたグラフをどのようにして加工しているでしょうか?

私の場合はというと、MacOSXをメインに使っていた時代には、adobeのイラスト
レーターがインストールされていたので、"dev.copy2eps"でEPS形式で出力して
イラストレーターで細かな修正・加工をしていた。

でも去年、一昨年くらいからUbuntuをメインに使い始めたので、イラストレー
ターで加工するわけにもいかなくなった。

ubuntuでは、イラストレーターの代わりにInkscapeを愛用しているので、できれ
ばRのグラフをInkscapeで加工できるようにしたい!!

ということで使い始めたのが"pstoedit"!!

非常に使いやすくていろいろなフォーマットに変換してくれる!!
手持ちのイラストレーターがCS(11.0)なので試してないけど、古いファイルな
らイラストレーター(.ai)も変換しれくれるみたい

そのほかにもいろいろな形式に変換することができる
http://www.pstoedit.net/

使い方はいたって簡単で、Inkscapeで読み込み可能なSVG形式にするにはコマン
ドラインから

pstoedit -f plot-svg <EPS形式のファイル名> <SVG形式のファイル名>

でOK!!

ほかの形式に変換したい場合には、"−f"オプション以降を、対応する形式に書
き換えればいい

おお〜!!らくちん!!

詳しく知りたい人は、こちらのサイトを見てください
http://d.hatena.ne.jp/postmaster/20051116/1132115822
http://www.geocities.jp/ne_o_t/GMT-USE/sonota/pstoedit.htm

2008年3月20日木曜日

数値の四捨五入と表示桁数

Rの防備録



数値を扱う際には、有効数字を考えなければいけない。

さてさて、Rにいろいろと計算をさせると、その結果は7桁で表示される(デフォルトの表示桁数)。

これを変更するには、関数option()の引数digitsを使う。





 >option(digits=2)   #表示桁数を2桁に変更







さらに、四捨五入のようにデータをまるめることが必要なときもある。

そんなときは、関数round()を使う。ただし、このとき正確には四捨五入ではない(場合がある)。

詳しくは、こちらを参照





 >round(x,digits=2)   #小数点以下2桁で丸める







ちなみに、書式付きでオブジェクトを表示する関数sprintf()もある。ただしこちらは、ダブルクオートがついてしまう。要注意。

2008年1月30日水曜日

Rで低水準作図!!

 学会用のプレゼンでグラフが必要になったので、Rで作図してみることにしました。作成したのはこんなグラフです!!



crosssection.png

 このグラフは、河川の横断面図を表しています。堤防から堤防までの地形図です。



 最近Rをはじめとしてソースコードやら関数やらの物覚えが悪いので、とりあえず貼り付けておきます。







df<-read.table("data.txt",header=T)

X11()

#ディバイス領域を縦に3分割

par(mfrow=c(3,1))

#マージンを変更

par(mar=c(4,4,0,4))

#x軸、y軸の目盛を設定

int_x<-seq(-100,900,by=100)

int_y<-seq(-8,16,by=4)

#1番目のグラフをプロット

plot(df$X_16.4_1962,df$Y_16.4_1962,xlim=c(-100,900)

,ylim=c(-8,16),xlab="",ylab="",type="l",axes=F,

col=1)

lines(df$X_16.4_1972,df$Y_16.4_1972,col=2)

lines(df$X_16.4_1982,df$Y_16.4_1982,col=3)

lines(df$X_16.4_1991,df$Y_16.4_1991,col=4)

lines(df$X_16.4_2002,df$Y_16.4_2002,col=6)

axis(side=1,pos=-8,at=int_x)

axis(side=2,pos=-100,at=int_y)



<中略>

#eps形式で保存

dev.copy2eps(file="crosssection.eps",

width=8,height=10)





 やっぱりRのグラフは綺麗ですね〜!!

2008年1月15日火曜日

ubuntu7.10にRのインストール

データマイニングソフトRをインストールしました。



WindowsやMacの場合には、ここらん本家からダウンロードしてきて簡単にインストールできるんだけど、Linuxの場合にはちょっとはまりました。



最初は、Synapticから簡単にいけるだろ!!!と思っていたけど...

実際にインストールして使っていると、パッケージを新たにインストールするときに...



はまってしまった...



なんか、gcc と fortran compiler (f2c or g77)あたりの依存関係で怒られてしまった...



くぅ...



ってなわけで、Synapticで一度完全にアンインストールした後に、コマンドラインから...





$sudo aptitude update

$sudo aptitude install r-base-core






依存関係にあるファイルもインストールされて無事完了!



試しに、パッケージのインストール





$R

>install.packages("パッケージ名")






無事にパッケージの追加も完了!