2013年3月20日水曜日

Writing R Extensions (version 2.15.2) 日本語訳を公開しました!

R 2.15.2 用に書かれたWriting R Extensionsを日本語に翻訳したドキュメント「Rの拡張を書く」を公開しました。slideshareからダウンロードできます。

Rを含め、統計学の更なる普及を期待して作成いたしました。是非ご活用ください。

2013年3月11日月曜日

C言語の関数中における文字列の交換

文字列を関数の仮引数として渡して、その交換を行う際には多少注意が要る。以下の例では、char *型の変数にポインタを通じてアクセスするので、呼び出す関数ではchar **型にする必要がある。関数に渡すものはアドレスなので、実引数はchar *型変数のアドレスとする必要がある(つまり&をつける)。比較のため、整数型変数を交換する場合と共にそのコードを示す。

#include <stdio.h>

void swap_int(int *a, int *b){
 int tmp = *a;
 *a = *b;
 *b = tmp;
}

/* 仮引数は*aaではなく**aaになることに注意 */
void swap_str(char **aa, char **bb){
 char *tmp = *aa;
 *aa = *bb;
 *bb = tmp;
}

int main(void){
 int x = 10;
 int y = 20;
 char *a = "hello";
 char *b = "world";

 printf("x = %d, y = %d\n", x, y); /* x = 10, y = 20 */
 swap_int(&x, &y);
 printf("x = %d, y = %d\n", x, y); /* x = 20, y = 10 */

 printf("a = %s, b = %s\n", a, b); /* a = hello, b = world */
 swap_str(&a, &b);
 printf("a = %s, b = %s\n", a, b); /* a = world, b = hello */

 return 0;
}

2013年3月4日月曜日

2013年2月の学習記録

2013年2月に学習した主な本一覧。

Rによる統計解析ハンドブック(pp.100~184)
演習問題がちょっと難しくなってきましたね...
はじめての集合と位相(pp.13~61)
実数やグラフなど、高校生の頃には疑問に思わなかったことを説明しているので、目から鱗です。
HTML/XHTML&スタイルシートデザインブック(pp.1~314 読了)
マウスが重なった時に画像を切り替える方法はJavaScriptしかないと思っていた。しかし、上に通常の状態の画像、下にマウスのアイコンが重なった時の画像を並べた画像を用意しておいて、マウスが重なった時に画像を表示する基準位置をCSSを使って切り替えるという方法でhtml+CSSのみでできるという手法が紹介されていたことが衝撃的でした。
詳解C言語 ポインタ完全攻略(pp.261~326 読了)
人文・社会科学の統計学(pp.1~58)

英文ドキュメント翻訳の作業は約92%まで到達。リリースまであと10日ぐらいかと予想してます。

2013年2月27日水曜日

TopCoder SRM464 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

numRedの赤い箱、numBlueの青い箱、numRedの赤い球、numBlueの青い球を使うゲームをしている。各ボールを箱に入れる。各箱は以下のようにして点数がつけられる。

  • 箱が赤で赤い球を含んでいればonlyRed点得る。
  • 箱が青で青い球を含んでいればonlyBlue点得る。
  • それ以外はbothColors点得る。

合計点はすべての箱の点数の合計である。可能性がある得られる点数の最大値を返せ。

私の解答はこちら。

public class ColorfulBoxesAndBalls {

 public int getMaximum(int numRed, int numBlue, int onlyRed, int onlyBlue, int bothColors) {
  int same = numRed * onlyRed + numBlue * onlyBlue;
  int diff;
  if( numRed < numBlue ){
   diff = bothColors * numRed + bothColors * numRed + onlyBlue * (numBlue - numRed);
  }else{
   diff = bothColors * numBlue + bothColors * numBlue + onlyRed * (numRed - numBlue);
  }
  return Math.max(same, diff);
 }

}

得点は232.88/250、1回のsubmitでシステムテストクリア。可能性があるのは箱と球の色がすべての箱で完全一致した場合と、できるだけ箱と球の色が一致しないようにした場合の2種類のみなので、それらについてのみ点数を検討すればOK。

2013年2月26日火曜日

TopCoder SRM463 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

タロウとハナコはバニーパズルで遊んでいる。1列にウサギが何匹か並んでいて、各ウサギの位置はbunnies[](昇順にソート済)という整数型配列で与えられている。ウサギは次のように1度だけ振る舞う:aとbの位置にいるウサギAとBを選ぶ。AはBを飛び越え2*b-aの位置に飛ぶ。もしその位置にウサギが既にいれば飛ぶことはできない。複数匹のウサギを飛び越えることもできない。以上の条件が成り立つとき、AとBの選び方の総数を返せ。なおAがBを飛び越えるのと、BがAを飛び越えるのは異なるものとする。

私の解答はこちら。

public class BunnyPuzzle {

 public int theCount(int[] bunnies) {
  int n = 0;
  // 左のウサギがその右の位置にいるウサギを飛び越える
  for( int i=0 ; i<bunnies.length ; i++ ){
   if( i == bunnies.length-2 ){ // 一番右の2匹の組は成立するペア
    n++;
    break;
   }
   int cur = bunnies[i];
   int tar = bunnies[i+1];
   int jumpto = bunnies[i] + 2 * (tar - cur);
   if( jumpto < bunnies[i+2] ) n++;
  }
  // 右のウサギがその左の位置にいるウサギを飛び越える
  for( int i=bunnies.length-1 ; i>=1 ; i-- ){
   if( i==1 ){ // 一番左の2匹の組は成立するペア
    n++;
    break;
   }
   int cur = bunnies[i];
   int tar = bunnies[i-1];
   int jumpto = bunnies[i] + 2 * (tar - cur);
   if( jumpto > bunnies[i-2] ) n++;
  }
  return n;
 }

}

得点は166.60/250、1回のsubmitでシステムテストクリア。全部の組を探索する必要はなく、隣り合う2匹に着目するのが簡単と気付くまでちょっと時間がかかりました。

2013年2月23日土曜日

TopCoder SRM462 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

アーチェリーでは、矢を標的に放ち標的の当たった位置によって得点を得る。この問題では、標的はN個の輪と中央の円からなるものとする。輪の幅と中央の円の半径は等しいとする。各目標の位置に割り当てられた得点は整数型の配列ringPoints[]で与えられる。得点は内側から外側へ順に与えられており、添字0は中央の円、添字Nは一番外側の輪の得点である。あなたはアーチェリーを始める。矢を放つたびに標的のランダムな場所に当たり、どの位置にあたる確率も等しいものとする。矢を放ったときの得点の期待値を返せ。

私の解答はこちら。

public class Archery {

 public double expectedPoints(int N, int[] ringPoints) {
  int total = 0;
  for( int i=0 ; i<ringPoints.length ; i++ ){
   // 各位置に当たる割合は内側から順に1, 3, 5, ..., 2N+1となる
   total += ringPoints[i]*(2*i+1); 
  }
  return total*1.0/((N+1)*(N+1)); // 1+3+...+(2N+1)=(N+1)^2で割って正規化
 }

}

得点は225.79/250、1回のsubmitでシステムテストクリア。

2013年2月19日火曜日

Rによる統計解析ハンドブック 第8章演習問題解答

This post is solutions of the chapter 8 of `A Handbook of Statistical Analyses Using R, Second Edition'. Chapter 6 and 7 will be posted later.

このポストはRによる統計解析ハンドブック(第2版)の第8章の解答になります。第6, 7章については後日掲載する予定です。

1

Although it is difficult to discern from the histogram, result of which kernel band is 3000 indicates that there are 6 peaks in density function. As kernel band gets lerger, we can't discern all of 6 peaks because they are mixed.

ヒストグラムからは判別しにくいが、カーネル幅が3000のときの結果から、密度関数からは峰が6つあることが示唆される。カーネル幅が大きいと峰が混ざるため、すべて判別できなくなる。

data("galaxies", package="MASS")

oldpar <- par(mfrow=c(2, 2))
do <- function(dat, ker, wid){
  h.info <- hist(dat, plot=FALSE)
  d.info <- density(dat, kernel=ker, width=wid)
  yr <- range(c(0, h.info$density, d.info$y))
  tit <- paste(ker, "kernal width = ", wid, collapse=" ")
  hist(dat, probability=TRUE, ylim=yr, main=tit)
  lines(d.info, lwd=2)
}

do(galaxies, "gaussian", 3000)
do(galaxies, "gaussian", 5000)
do(galaxies, "triangular", 3000)
do(galaxies, "triangular", 5000)
par(oldpar)

2

Data can be seen around (20, 10), and we can see that death rate is constant with birth one.

データは(20, 10)近辺に多く見られ、0.001の等高線からは出生率に関係なく死亡率は一定に近い傾向があることが見て取れる。

library(KernSmooth)
data("birthdeathrates", package="HSAUR2")
bdr.d <- bkde2D(birthdeathrates, bandwidth=sapply(birthdeathrates, dpik))
contour(bdr.d$x1, bdr.d$x2, bdr.d$fhat,
        xlab=names(birthdeathrates)[1], ylab=names(birthdeathrates)[2], 
        main="estimated density of birthdeathrates")

3

Note that plot.Mclust doesn't reflect option such as col and ylim. Graphs show that there is modality for female, and tendency that male develops schizophrenia earlier than female (Note that vertical axis is different between two graphs).

plot.Mclustはcol、ylimなどのオプションを指定しても反映されないことに注意。グラフを見ると、女性は二峰性があり、男性は女性よりも若いころに発症する傾向がある(縦軸の値が異なることに注意)。

library(mclust)
data("schizophrenia", package="HSAUR2")
# previous consideration (事前の考察)
boxplot(age~gender, data=schizophrenia, main="age distribution")
# split data(データの分割)
female <- subset(schizophrenia, gender=="female", select=age)
male <- subset(schizophrenia, gender=="male", select=age)
mc.fem <- Mclust(female)
mc.mal <- Mclust(male)

oldpar <- par(mfrow=c(1, 2))
plot(mc.fem, what="density", xlim=c(0, 70), ylim=c(0, 0.06))
plot(mc.mal, what="density", xlim=c(0, 70), ylim=c(0, 0.06))
par(oldpar)

フォロワー

ページビューの合計