正規分布への当てはまりの良さ

データが正規分布にどの程度当てはまっているかを調べるには、
(1)normal q-q plotにより、定性的に評価
(2)Kolmogorov-Smirnov test(K-S検定)やShapiro-Wilk test(S-W検定)を用いて、p値を指標に評価
の二つの方法があります。

今回はこれらの方法について取り扱いと思います。


(1)normal q-q plotにより、定性的に評価
normal q-q plotととは、標準正規分布とデータの分位点との関係を図示したもので,これが,直線上に 乗っているとデータが正規分布によくあてはまっていることがわかります。

以下には、1)正規分布 2)ポアソン分布3)ベータ分布4)カイ二乗分布
を母集団として、乱数を発生させて、正規分布にどの程度当てはまるかを定性的に評価したいと思います。

##########################################################################
# 1)正規分布
dat1 <- rnorm(1000, mean=10, sd=2)
png("dat1.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat1)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat1, col="red")
dev.off()


# 2)ポアソン分布
dat2 <- rpois(n=1000, lambda=5)
png("dat2.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat2)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat2, col="red")
dev.off()

# 3)ベータ分布
dat3 <- rbeta(n=1000, shape1=5, shape2=3)
png("dat3.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat3)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat3, col="red")
dev.off()

# 4)カイ二乗分布
dat4 <- rchisq(n=1000, df=11, ncp=0)
png("dat4.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat4)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat4, col="red")
dev.off()

##########################################################################

(2) K-S検定 S-W検定
##########################################################################

### 1)正規分布を例に少しオブジェクトの構造を解析する
#K-S検定はks.test()を使用
> ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1)))

One-sample Kolmogorov-Smirnov test

data:  dat1 
D = 0.0597, p-value = 0.8681
alternative hypothesis: two-sided 

> summary(ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1))))
            Length Class  Mode     
statistic   1      -none- numeric  
p.value     1      -none- numeric  
alternative 1      -none- character
method      1      -none- character
data.name   1      -none- character

#p値を単独で取得できそう!
> (ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1))))$p.value
[1] 0.8681218 #キター!!

###以下、各データに対して、K-S検定及びS-W検定を行う
#S-W検定はshapiro.test()を使用
> shapiro.test(dat1)

Shapiro-Wilk normality test

data:  dat1 
W = 0.9869, p-value = 0.434

> (shapiro.test(dat1))$p.value
[1] 0.4339936

###それでは各分布のサンプルについて検定を行います
# 1)正規分布
(ks.test(dat4, "pnorm", mean=mean(dat4), sd=sqrt(var(dat4))))$p.value
(shapiro.test(dat4))$p.value
> (ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1))))$p.value
[1] 0.8681218
> (shapiro.test(dat1))$p.value
[1] 0.4339936

# 2)ポアソン分布
> (ks.test(dat2, "pnorm", mean=mean(dat2), sd=sqrt(var(dat2))))$p.value
[1] 0.07005836
> (shapiro.test(dat2))$p.value
[1] 0.00998934

# 3)ベータ分布
> (ks.test(dat3, "pnorm", mean=mean(dat3), sd=sqrt(var(dat3))))$p.value
[1] 0.5573208
> (shapiro.test(dat3))$p.value
[1] 0.1299853


# 4)カイ二乗分布
> (ks.test(dat4, "pnorm", mean=mean(dat4), sd=sqrt(var(dat4))))$p.value
[1] 0.0003856757
> (shapiro.test(dat4))$p.value
[1] 1.577593e-17
##########################################################################

(1)の方法は直感的でわかりやすいですね。(2)の方法は、例数が少なかったり、母集団の分布が正規分布に似ていたりすると、なかなかp値は小さくならないようです。p値が0.05を下回らないからといって、母集団の分布が正規分布であるとはだれも保証はできません。

【参考文献】
・統計学の基礎
・R - Source 正規性の検定


統計局ホームページ

国勢調査の結果など国が持っているデータにWeb上でアクセスする方法がわかりました。
統計局ホームページに行けばよいのです。
http://www.stat.go.jp/

総務省統計局、
政策統括官(統計基準担当)
統計研修所
の共同運営による統計専門サイトだそうです。

国の統計の中枢機関として、私たちは、国勢調査を始め国勢の基本に関する統計の企画・作成・提供、国の統計全体の企画及び横断的な調整、また、国及び地方公共団体の統計職員に専門的な研修を行っています』だそうです。

統計や疫学が大好きな人間としては、とても興味深いですね。

手っ取り早く遊ぶには、
"日本の統計" http://www.stat.go.jp/data/nihon/index.htm
 にいくと良いと思います。

この中でも、2012年度版の"第2 人口・世帯" http://www.stat.go.jp/data/nihon/02.htm
の"年齢各歳別人口"のデータをダウンロードしてデータを可視化してみました。

これがダウンロードしたデータです。


このデータの中で、年齢と総数についての列を切り出して、年齢0 - 100の区間で棒グラフを作成したのが下です。


とても考えさせる図ですね。60代前半のベビーブームとそのジュニア世代にピークが見られるのがなんとも興味深いですね。そして、65歳以上の人口もかなりの割合を占めていることがわかります。

何も難しい統計手法を用いなくても、全体のデータの分布をしっかりと可視化することで、様々な情報を得ることができるのですね。

他にも細かい統計データが満載で、EXELデータも大量に手に入りますので、皆さんもぜひ、日本の将来を考える意味でもいろいろと眺めてみてください。


私のブログの人気記事ランキング

私は、このブログの中で比較的広範囲のトピックについて記事を書いています。

ブログ開設以来、アクセス数の多かった順に棒グラフ(Bloggerを触れば簡単にできます)を作成すると、以下のようになりました。


slaxやubuntuの基本的な設定に関する記事がとてもアクセスが多かったことがわかります。
大変興味深い結果だと思います。
私自身は、生物系の学問に興味が有り、必要に応じてこれらのトピックを扱っている訳ですが、検索エンジンを介すると、ubuntuなどのコモンな言葉がヒットしてくるようです。

シンプルな棒グラフですが、大変示唆に富んでいるデータなので記事に
しました(^^)

症例対照研究の統計学的バックグラウンドの詳細

今回は症例対照研究の統計学的なバックグランドについて考えたいと思います。
症例対照研究 case-control study / retrospective study、ある特定疾患の患者群と非患者群の2集団について、個人の過去の記録から、ある要因に曝露していたか否かを調べ、因果関係を研究するスタイルです。

症例対照研究では、現に存在する患者群と対照群を慎重に選定さえすれば、情報はすべて過去の記録を調べればよいので、割に簡単に行うことができる研究方法です。

症例対照研究では、オッズ比(図2のad/bc)から近似的に相対危険度を推定し、その大きさで、因果的関連のある要因を選び出すことが多いです。

オッズ比を用いて相対危険度を推定することに関して今回は少し深く扱います。

私たちが疫学を用いて知りたいことは本来、要因の相対危険度です。相対危険度とは図1のA/(A+B)とC/(C+D)の比です。相対危険度とはコホート研究(prospective study)を行うことで、下の表が決定されてはじめて求めることができます
もしも、症例対照研究において、図2のa/(a+b)とc/(c+d)の比を求めようとするものなら大間違いです。なぜなら、要因の有無別に分けたa + bとc + dは意味を持たないからです。a+b, c+dは患者群と対照群を同じ割合で代表しているわけではないからです。

#図1 コホート研究の分割表


#図2 症例対照研究の分割表



それでは、症例対照研究で要因と結果の因果関係をするうえで有用なパラメータは何なのでしょうか。
実はこれがオッズ比です。Q1およびQ2 を未知の標本の抽出率として(症例対照研究は未知のコホートを想定している)、

a + c = Q1(A + C)より
a = Q1A, c = Q1C

b + d = Q2(B + D)より
b =Q2B, d = Q2D
として
想定する母集団のコホートのオッズ比は、
AD/BC = (a/Q1)(d/Q2)/(c/Q1)(b/Q2) = ad/bc
となる。
この結果から、症例対照研究において、サンプルのオッズ比を計算することは、母集団のオッズ比を反映することになる。

ところで、私たちの本当の目的は相対危険度を求めることである。
冒頭で挙げた『症例対照研究では、オッズ比(図2のad/bc)から近似的に相対危険度を推定し、その大きさで、因果的関連のある要因を選び出すことが多いです。』という一文の本質に迫りたいと思います。
オッズ比から近似的に相対危険度を推定できるのは、一般に罹患率や死亡率などの小さい発生率のものに限られます。
これらの率では、図1において
A + B ~= B
C + D ~= D
と近似できるのです。なぜなら、A<<B, C<<Dだからです。
このとき、
{ A/(A+B)} / {C/(C+D)} ~= {A/B} / {C/D} = AD/BC = ad/bc
となります。
以上のことから、

『症例対照研究では、オッズ比(図2のad/bc)から近似的に相対危険度を推定し、その大きさで、因果的関連のある要因を選び出すことが多いです。』

と言うことができます。


################### 以下実例  #####################
新版 医学への統計学  p136より

「女性について肺癌患者108名、対照群108名を選出し、喫煙歴について調査してみると、下の表が得られた。相対危険度を推定し、その有意性の検定、ならびに95%信頼区間を求めよ」



この問題を考える上で大切なことは、下の(1)式で示すχ値の二乗値が標準正規分布に従うことです。

具体的な計算は以下のようになります。以下の式(4)は、,Miettienのの検定に基づく信頼区間と呼ばれています。

計算の結果、危険率5%の条件下でオッズ比は1よりも有意に大きいことがわかります。また、オッズ比の95%信頼区間は、1.19 〜 3.54 となります。有意差検定の結果を反映して、信頼区間には1が含まれていません。
一般に肺癌の罹患率は小さいため、オッズ比 2.05(1.19,3.54)は近似的に喫煙の肺癌罹患に関しての相対危険度と考えることができます。

【参考文献】
古川俊之 丹後俊郎『医学への統計学』朝倉書店 1993 133 - 136pp


レビュー論文に入り込むバイアスの種類


レビュー論文とは、ある研究分野における著名人がその分野をサマーライズした論文のことである。総説論文とも呼ばれる。

レビュー論文を作成するにあたって、著者が「文献を引用して論説を述べる」という行為において入り込みうるバイアスの種類について把握しておくことは大変重要なことです。一般のオリジナルアーティクルならば、introduction, material & method, resultまでは比較的フェアなものである可能性が高く、discussionの所で著者の解釈が入ってきます。それに対して、レビュー論文は基本的に既知の知識を基に構成されていくため、さまざまな部分でバイアスが入り込む余地があります。

以下にバイアスの種類を上げます。
  1. タンス論文バイアスと
  2. 言語バイアス
  3. 報告バイアス
  4. 文献収集バイアス
  5. 質的バイアス
  6. 個人バイアス
1.タンス論文バイアス
統計学的有意差が出なかった論文や、面白い結果が出ずにお蔵入りになっている研究は圧倒的に多く、出版されているのは行われた研究のうち、面白いデータが得られたほんの一部のものであることからくるバイアス。

2.言語バイアス
重要な結果の出た研究は英語論文として発表される傾向があり、そのため執筆者は英語の論文しか引用しないことからくるバイアス。

3.報告バイアス
研究者が自分の研究においてさまざまな結果が出たにも関わらず、有意差のあるアウトカムだけを選んで論文にすることからくるバイアス。

4.文献収集バイアス
電子検索方式に関係する。文献収集方法によって、特定の論文を見落としてしまうことによるバイアス。

5.質的バイアス
質の低い研究でバイアスを含む可能性のある論文を引用したとしたら、総説自体もバイアスを含む可能性があることからくるバイアス。

6.個人バイアス
意識的にせよ、無意識にせよ、執筆者が総説を結論づける際に個人的な考えを反映させることからくるバイアス。例えばディスカッションにおいて、いくつかの論文にのみ特別に焦点を当て、他の論文をまったく引用しないというような具合である。

これらのバイアスを眺めてみると、私たちが何かの報告を基にして意見を述べる時に入りうるバイアスと共通しているものが多い気がします。

最後にシステマティックレビューについて紹介します。

システマティックレビュー(系統的レビュー/ Systematic review)とは、あるテーマに関する既存の研究論文を網羅的にか頼りなく収集して、メタアナリシス(meta-analysis)と呼ばれる統計学的手法を用いて解析したものです。

【参考文献】
Stuart Porter著 武田裕子訳 『ここからはじめる研究入門』医学書院igakushoinn 2011 104 - 107





多変量解析の概略

多変量解析とは、一つの目的変数(従属変数)に対して複数の説明変数(独立変数)からなる多変量データを扱うデータ解析のことです。

統計学学習の最初の方で登場する単変量解析(一つの従属変数を一つの独立変数により説明する)の一般化と考えても差し支えないと思います。

疫学の研究で多変量解析を使用する目的としては、交絡因子の影響の除去と、従属変数の予測があります。

疫学でよく用いられる多変量解析は、重回帰分析、ロジスティック・モデル、コックスの比例ハザード・モデル、ポアソン回帰分析の4つであると言われています。

下に、多変量解析の種類と従属変数の性質及びその適用についての表を示します。



#どのような独立変数を選んだよいのか
一見すると独立変数は多ければ多いほど良いように感じてしまいます。しかし、現実の現象に関わるであろう独立変数は従属変数への寄与の差はあれど、無数にあると考えられます。下に挙げた参考文献の214-215には多変量解析の目的にしたがって二つの考え方を挙げています。
・交絡因子の制御

交絡因子の制御を目的とする場合、、交絡すると理論的に考えられる変数はすべてモデル投入するべきであるとされています。
・従属変数の予測

従属変数の予測では、できるだけ少ない変数で妥当性の高い予測を行う必要があります。オーバーフィッティングの問題も無視できません。オーバーフィッティングとは、ある一定期間やある一定範囲(ミクロ)のデータを使って全体的(マクロ)な特徴を捕らえようとするときそのミクロな世界の特徴に過剰に合致(フィット)しすぎてマクロな世界の特徴を表すものではなくなってしまうことを指します。





【参考文献】
中村良一「基礎から学ぶ 楽しい疫学」医学書院 2002 204 - 215pp

形態学のおすすめデータベース

解剖学および組織学についてのWebデータベースを紹介します。


######ヒト Homo sapiens ######

# The Internet Pathology Laboratory for Medical Education
肉眼解剖、肉眼病理、組織学、組織病理学を網羅した極めて優れたデータベース。サイト内を歩き回るだけで時間が過ぎるのを忘れるくらい楽しめます。極めて教育的かつ実践的なサイトです。


#Zygote Body
以前はGoogleが運営していました。Webブラウザを使用して、人の解剖の3Dグラフィックスを自由自在に閲覧することができます。設定を変えることで、表層からの深さを調整することができます。


#InnerBody
ひとつ上のInnerBodyと同じコンセプトのwebsiteです。Zygote Bodyに比べてアノテーションがしっかり付いていますが、動作が遅いのが難点です。



#病理コア画像
日本病理学会が編集している病理画像のデータベースです。画像数は少ないですが、マクロからミクロまでの流れがしっかりと明記されています。また、アノテーションが付けられているため、独学の助けになります。

#Surgical Pathology Atlas Image Database
解説はいまいちわかりにくいですが、画像の量は豊富かつ高解像度です。ものによっては解説も丁寧です。


#Color Images of Histological Sections
http://www.udel.edu/biology/Wags/histopage/colorpage/colorpage.htm
正常構造が多数掲載されています。画質が荒いのが難点ですが。


#Atlas of Pathology images
利用するのに登録が必要ですが、その分だけかなり本格的な画像お見ることができます。目の覚めるような高画質のスライドが手に入ります。

#Virtual Slide List for Medical Histology Course
http://www.med.umich.edu/histology/dmindex.html
豊富なヴァーチャルスライドを無料で閲覧することができます。しかも高画質です。

#Histology Guide - A virtual histology laboratory
http://www.histologyguide.org/index.html
このサイトもなかなかの優れもの。インターフェースがわかりやすいので、すぐに使いこなすことができる。見ているだけで幸せになれます。
#The Virtual Human Embryo
https://www.ehd.org/virtual-human-embryo/
ヒトの発生の各過程のサンプルが見れます。


#######################################################



######## 獣医学一般の組織学 ###########

#Veterinary Histology
獣医学一般の組織学のスライドがたくさん掲載されています。説明も丁寧です。



#Veterinary Histology Atlas
http://www.uff.br/atlashistovet/IngApresentacao.htm
シンプルに獣医学の組織学がまとめてあります


######### マウス ##########

#The Anatomy of the Laboratory Mouse
http://www.informatics.jax.org/cookbook/contents.shtml
マウスの肉眼病理のシェーマがたくさん載っています。どれも懇切丁寧でわかりやすいです。

# Atlas of Laboratory Mouse Histology
http://ctrgenpath.net/static/atlas/mousehistology/
マウスの解剖学のシェーマや、実際の組織像がとても載せられています。どれも非常に見やすいのでおすすめです。

################ゼブラフィッシュ ##################
Zebrafish Atlas
http://zfatlas.psu.edu/
ゼブラフィッシュのさまざまな発生段階の組織切片をあたかも自分が見ているかのように自由に動かしたり倍率を変えたりして観察が可能です。アングルも3方向すべてそろっています。ここまで優れたデータベースを作るのには大変お金とマンパワーがかかったと想像します。

真核生物の誕生 - ミトコンドリアとの共生

真核生物はメタン生成古細菌とαプロテオバクテリアによる廃棄物のやり取りをもとにした共生が今からおよそ21億年前に行われたことがきっかけとされています(水素節)。

各々の細菌は以下のような特徴を持っていました。

#メタン生成古細菌
二酸化炭素と水素から、ブドウ糖とエネルギーを生み出し、メタンを放出

#α-プロテオバクテリア
酸素を使ってエネルギーを生み出し、水素を放出。

約22億年前の酸素の増加によって、大気中の水素は反応して水となったため、メタン生成古細菌にとって極端な水素不足となりました。そこで、水素を生成するα-プロテオバクテリアを取り込んで共生することにより、水素を補うことに成功しました。真核生物の誕生です。

α-プロテオバクテリアは現代のミトコンドリアとなります。

哺乳類の受精時に細胞核とミトコンドリア核が異なる遺伝様式を取るという事実から、太古の昔(22億年前)には、二つが別の生物であったことを示唆します。

【参考文献】 
豊橋市自然史博物館 『豊橋市自然史博物館 総合案内』 
梅田真樹『そこが知りたい 動物のなぞ』久美株式会社 2011年 7 - 9pp


シアノバクテリアが担った役割

シアノバクテリア(ドメ イン : 真正細菌 Bacteria 門 : シアノバクテリア門 Cyanobacteria)は藍藻類と呼ばれもしますが、れっきとした真性最近です。

シアノバクテリアは、今からおよそ27億年前に光合成の能力を獲得してから10億年前まで
にかけて、浅い海で大量に発生しました。そして、大量の酸素を発生させました。

原始の細菌(古細菌)は、他の細菌とは異なり、メタン生成というエネルギー様式を持ちます。この影響で、原始の地球の大気には、現在の500倍以上のメタンが存在していました。
シアノバクテリアが光合成をするようになり、大気中の酸素濃度が上昇すると、酸素がメタンと化学反応を起こして、大気中のメタン濃度は徐々に低下していきました。その結果、メタンの温室効果(二酸化炭素の20倍)は低下して、とうとう22-23億年前には高緯度域だけでなく赤道域まで氷河が進出し、大陸も海洋もすてて氷に覆われ、「全球凍結」と呼ばれる状態になりました。

シアノバクテリアは植物のミトコンドリアの祖先としても有名です。原始的な植物細胞の細胞質内にシアノバクテリアが入り込み、共生状態を維持した結果、現在の植物細胞になったと考えられています。

先カンブリア紀のシアノバクテリアの痕跡として、ソトロマトライトとよばれる化石が残っています。ストロマトライトは、シアノバクテリアの表面の粘質層に、水中をただよう砂や泥の粒が付着してかたまり、縞模様を形成したまま化石となったものです。大きな岩のように見えます。

【参考文献】

豊橋市自然史博物館 『豊橋市自然史博物館 総合案内』
梅田真樹『そこが知りたい 動物のなぞ』久美株式会社 2011年 7 - 9pp

カンブリア爆発の前後の動物群

5.4億年に生物の多様性が飛躍的に増大した出来事をカンブリア爆発と呼びます。
カンブリア爆発の前には(1)エディアカラ動物群、(2)カンブリア爆発の後にはバージェス動物群と呼ばれる動物群が存在しました。
それぞれについて特徴を述べます。

(1)エディアカラ動物群 : Ediacaran Fauna
オーストラリア、アデレードの北部にあるエディアカラ丘陵から、クラゲやゴカイの仲間と思われる動物の化石が発見され、「エディアカラ動物群」と名付けられました。この動物群は今から6億年前から5億4200万年前に、地球上に最初に現れた大型の動物のグループで、襲う敵のいない、おだやかな環境に暮らしていました。これらは、先カンブリア時代の終わり頃に絶滅してしまい、子孫を残すことができませんでした。


(2)バージェス動物群 : Burgess Fauna
カナダ西部、ロッキー山脈のバージェス近くの頁岩(バージェス頁岩)から、70属130腫、数万個数万個にものぼる化石が発見され、「バージェス動物群」と呼ばれています。この中には、現在の無脊椎動物の祖先がほとんど含まれるだけでなく、脊椎動物の祖先らしい動物も見られ、カンブリア紀に生物が爆発的に増えた証拠となっています。これと同じ頃の化石が、中国の雲南(ユンナン)省の澄江(チェンジャン)やインドなど、世界の34カ所から見つかっています。
#代表的動物
・アノマリカリス
カンブリア紀最大の肉食動物。
・ピカイア
脊索動物の祖先。私たち人間の遠い祖先でもあります。カンブリア紀の時期(5.4億年前)に私たちの祖先はこのような形態であったかと思うと、不思議な気分になります。



【参考文献】
豊橋市自然史博物館 『豊橋市自然史博物館 総合案内』
井出利憲「分子生物学講義中継 生物の多様性と進化の驚異」羊土社 2010 37pp

疫学研究デザインの分類

疫学研究デザインは以下のように分類されます。


#################################################
1.観察疫学研究 observational epidemiology
  a.記述疫学研究 descriptive studies
  b.生態学的研究 ecologic studies
  c.横断研究 cross-sectional studies
  d.コホート研究 cohort studies
  e.症例対照研究 case-control studies
2.介入疫学研究 interventional epidemiology
  a.個人割付介入研究 individual intervention
  b.集団割付介入研究 group intervention
#################################################

各々のデザインについて


#1.a.記述疫学研究 descriptive studies
暴露に触れずに疾病頻度を明らかにするもの。

#1.b.生態学的研究 ecologic studies
既存のデータを利用して、集団間の暴露と疾病頻度の関係を比較することによって、疾病の危険因子を模索するための研究。
曝露や疾病発生を個人単位ではなく、集団としてしか把握しないため、結果は次の研究のための仮説形成に留め、コホート研究を行うことが一般的である。

#1.c.横断研究 cross-sectional studies
個人の暴露と疾病発生の評価を同時に行うもの。
疾病発生によって変化する可能性がある暴露については、疾病状態が疾病発生の原因なのか、それとも疾病発生のために暴露状況が変化したものかを十分に検討する必要がある。

#1.d.コホート研究 cohort studies
まず曝露群と非曝露群を設定する。次に、これらの集団を観察していき、両群での疾病発生頻度を観察し、比較する。
観察の方向性は「曝露」→「疾病発生」であり、疾病の自然史に矛盾しない
追跡を完全に行うことは難しく、かつ時間、手間、研究費を大量に消費する。
稀な疾患を対象といsたコホート研究は事実上不可能。

#1.e.症例対照研究 case-control studies
症例群(患者群)と適切な対照群を設定し、それぞれの群で曝露状況を比較し、曝露と疾病発生の関連を明らかにする研究デザイン。
観察の方向性は「疾病発生」→「曝露」であり、疾病の自然史に逆行する
オッズ比を計算し、これをもって相対危険とする。
疾病発生が出発点なので、稀な疾患でも頑張って症例を集め、適切な対照群を設定すれば、研究として成立する。

2.介入疫学研究 interventional epidemiology
コホート研究とほとんど同じ。
唯一違うのは、介入研究では介入群(曝露群)と介入群(非曝露群)の指定を研究者が行う点にある。
コホート研究や症例対照研究では完全に制御できな可能性がある交絡因子を完全に制御できることが期待される。
倫理面での配慮が必要(もちろん、医学研究はすべて倫理面の配慮が必要ではあるが)。



【参考文献】
中村良一「基礎から学ぶ 楽しい疫学」医学書院 2002 45 - 78pp

症例対症研究とオッズ比

症例対照研究(case - control study)は別名, 後ろ向き調査(retrospective study)と呼ばれ、コホート調査とは逆に『患者群と非患者群についき原因と思われる因子を有する割合を比較するもの』です。対照群を身長に設定することが肝となります。
調査対象者から因子の有無を調査し、以下に示すような2×2分割表を作成してオッズ比の計算を行うのが流れとなります。下の表では肺癌と喫煙の関係性について調べることを目的としています。

オッズ比というのは、患者群、コントロール群の二つのグループでそれぞれの因子(喫煙)の有無に関するオッズを計算し、それらの比を取った物です。
(A/C)/(B/D) = AD/BC

対照群は任意に設定されるため、下の表における A/(A + B)やC/(C + D)といった計算がナンセンスであることに注意が必要となります。A + BやC + Dの計算することに意味があるのは、『喫煙している集団と喫煙していない集団』を想定してしまうことになり誤りです。

前向き試験であれば、A + Bや C+Dを計算することに関して意義があります。この場合は、原因(喫煙)を先に入手して、結果(肺癌の発病の有無)を後から確認するからです。症例対照研究では、結果を入手してから原因を調べるため、このようなロジックは通用しません。

症例対照研究では、オッズ比を相対危険(Rerative Risk)と解釈します。


【参考文献】
古川俊之 丹後俊郎『医学への統計学』朝倉書店 1993 4 - 5pp

科学研究の基本的サイクル

統計学を学習する上で科学研究の基本的サイクルを意識することは非常に重要です。なぜなら、統計学が科学にとってどのような位置づけであるかを見極めることができるからです。

古川俊之先生、丹後俊郎先生が書かれた名著「医学への統計学」には以下の三つが科学研究の基本的サイクルとして挙げられています。

1) 新しい仮説の設定(hypothesis generation)
2) 必要なデータの収集(data collection)
3) データに基づく仮説の検証(hypothesis testing)

これを眺めていると、どの工程においても統計学の本質を意識した振る舞いが要求されることが理解されます。

【参考文献】
古川俊之 丹後俊郎『医学への統計学』朝倉書店 1993 1pp

JFrameコンポーネントを利用したコンポーネントの追加


Javaが好まれる理由の一つにGUIアプリケーションの開発が容易であることが挙げられる。これは、Swingというパッケイージを用いて達成されます。今回は、Swingを用いたアプリケーション、すなわちSwingアプリケーションに関する基本事項について書きます。

キーワード)
コンテナ、コンポーネント、Swingパッケージ、JFrameクラス

############################################################
//Components.java

//javax.swingのパッケージをまるごとimport
import javax.swing.*;
//javax.awtのパッケージをまるごとimport
import java.awt.*;

public class Components{
public static void main(String[] args){

//JFクラスのコンストラクトを用いてコンテナを作成
JFrame frame = new JFrame("コンポーネントのレイアウト");

//レイアウトマネージャを生成
FlowLayout f_layout = new FlowLayout();
//レイアウトマネージャを適用
frame.setLayout(f_layout);

//コンポーネントの作成
JButton button = new JButton("ボタンです");
JLabel label = new JLabel("ラベルです");
JTextField text = new JTextField("テキストフィールドです", 15);

//コンポオー年との追加
frame.add(button);
frame.add(label);
frame.add(text);

//終了時の動作指定
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//フレームサイズを設定
frame.setSize(350, 110);
//フレームを可視化
frame.setVisible(true);
}
}
############################################################


############################################################
プログラムのテスト
$ java Components


############################################################








############################################################
#javax.swingパッケージに含まれるクラスを調べるには以下のリンクへ
http://docs.oracle.com/javase/jp/6/api/javax/swing/package-summary.html


javax.swingパッケージの中にJFrameというクラスが含まれていることがわかりました。
############################################################

############################################################
#JFrameクラスの仕様は以下のリンクで書くにすることができます。




############################################################

レイアウトマネージャについて一言。Swingアプリケーションでコンポーネントのレイアウトを行う時は、レイアウトマネージャと呼ばれるオブジェクトを使用します。全部で11種類のレイアウトマネージャが存在し、それらを組み合わせてレイアウトをデザインすることができるようになっています。



【参考文献】
丸の内とら『Java入門教室』SE SHOEISHA 2012 346 - 355pp

Javaにおけるエラー処理(例外処理)


Javaにはtry ~ catch文を用いて例外処理(エラー処理)を行うことが可能です。
基本フォーマットは以下のようです。

try{
実行する文1;
実行する文2;
実行する文3;
} catch (例外クラス 変数名)
{
例外が発生した時に実行する文;
}

try{}内でエラーが発生したらcatch内の変数に向けて例外オブジェクトがthrowされます。
下のプログラムはシンプルな実装例で



######################################################

// Exception.java

//Consoleクラスを呼び込む
import java.io.Console;

public class Exception {
    public static void main(String[] args) {
// int型の変数を宣言
        int input;
//Consoleクラスを使用する準備
        Console console = System.console();
        System.out.println("数字を入力してください。");
//例外処理。try内でエラーが出たら、例外オブジェクトをthrowする
            try {
                input = Integer.parseInt(console.readLine());
//例外オブジェクトをキャッチ
            } catch(NumberFormatException e) {
                System.out.println("エラー");
System.out.println("例外オブジェクトの中身は:" + e);
            }
}
}
######################################################

########テスト##########
$ java Exception 

数字を入力してください。
2


$ java Exception
数字を入力してください。
hoge
エラー
例外オブジェクトの中身は:java.lang.NumberFormatException: For input string: "hoge"

###########################



IntegerクラスのメッソドであるparseIntの仕様については以下のサイトで検索することができます。





【参考文献】
丸の内とら『Java入門教室』SE SHOEISHA 2012 126-134pp

Consoleクラスを使ったデータの受け取り(クラスの読み込みの実例)


Consoleクラスを用いて、ユーザー側から文字入力を受け取るプログラムです。
Consoleクラスのメソッド及びそれぞれの例外処理に関しての情報は下記のサイトにのっています。

Consoleクラスはフルネームは"java.io.Console"と言います。"java.io"部分はパッケージ名です。このページには、ConsoleクラスのMethodについて記述がされています。クラスによっては、このページにメソッドだけでなくフィールドについても記載されています。

Consoleクラスに実装されているreadLineメソッドの仕様を眺めてみます。

java.ioパッケージに含まれるようなので、java.ioパッケージに含まれるClassのSummaryを眺めてみます。



SystemクラスやStringクラスの代表されるJava Core APIライブラリの代表的クラスの場合は、デフォルトでimportされるので、明示的にimportする必要はありません。一方、Consoleクラスなどのその他一般のクラスを利用しようと考えた場合は、その都度クラスをimportする必要があります。

#ソースコードの編集
$ vim aisatsu.java

// aisatsu.java
//Consoleクラスのimport
//Consoleクラスを利用すると、CUIでの有用なインターフェースが提供される
import java.io.Console;
public class aisatsu{
 public static void main(String[] args){
  //変数の宣言
  String name;
  //Consoleクラスを使用するための準備
  Console console = System.console();
  System.out.println("Input your name, please.");
  //ユーザーの入力を取得して、変数に代入する。
  //Consoleクラスのメソッド(readLine)を呼び出す
  name = console.readLine();
  System.out.println("Hello, " + name);
 }
}

#コンパイルしてテスト
$ java aisatsu
Input your name, please.
Kappa
Hello, Kappa



上のソースコードでは、文頭に"import java.io.Console"と宣言することで、Consoleクラスをimportしていました。import文を書かなくても、"java.io.Console"のようにパッケージ名とクラス名を合わせて指定することで、ソースコード内でクラスを参照することもできます。


// aisatsu.java
public class aisatsu{
 public static void main(String[] args){
  //変数の宣言
  String name;
  //Consoleクラスを使用するための準備。
  //パッケージ名とクラス名を書く。
  java.io.Console console = System.console();
  System.out.println("Input your name, please.");
  //ユーザーの入力を取得して、変数に代入する。
  //Consoleクラスのメソッド(readLine)を呼び出す
  name = console.readLine();
  System.out.println("Hello, " + name);
 }
}


【参考文献】
丸の内とら『Java入門教室』SE SHOEISHA 2012 75-83pp

1998年に、Wattsとその指導教員のStrogatzは本格的な複雑ネットワーク研究の幕開けとなる論文を発表しました。
彼らのモデルは、平均次数を大きくしすぎずに、小さい平均距離(L)と大きいクラスター係数(C)を同時に達成するネットワーク、すなわち、スモールワールド・ネットワークとなるものです。

WSモデルの作り方
(1)平均頂点Nと平均次数<k>を定める。<k>は偶数とする。
(2)拡張サイクルを作る。すなわち、頂点N個を輪状に置き、拡張点を輪の右隣<k>/2個までの頂点と隣接させる。拡張点の次数は<k>となる。
(3)枝は合計<k>N/2ある。そのうち、割合p(0=<p=<1)だけの枝、つまりp<k>N/2本を選ぶ。各枝は等確率で選ばれるとする。
(4)選んだ枝のそれぞれについて、片方の端点とはつないだままにして、もう片方の端点から切り離す。どちらの端点を切り離すかは半々の確率で決める。
(5)宙に浮いた各枝の新しい端点をネットワーク全体の中から等確率に1つ選び、枝を作る。この操作をつなぎかえ、新しい枝を近道またはショートカットと呼ぶ。新しい端点を選ぶときには、
(ⅰ)ループと多重辺を避け
(ⅱ)元の拡張サイクルの枝を復元してしまうような頂点をさける
こと。



####### RでWSモデルのシュミレーション############

####レギュラーグラフ(拡張サイクル)の作成関数の定義#####
regular.g <- function(n, k){
reg <- matrix(0, n, n)
for(i in 1 : n){
for(j in 1 : k){
if(i + j <=n)
reg[i, i+j] <- 1
else
reg[i, i+j-n] <- 1
}
}
(reg <- symmetrize(reg))
}
#######################################

#regular.g関数のテスト
test.g <- regular.g(20,4)

#グラフの描写
library(sna)
png("regular.png")
gplot(test.g, gmode="graph", mode="circle", main="Regular graph (n=20, k=4)")
dev.off()

#pを変化させて辺の架け替えを行う

g <- regular.g(20,4)

#p = 0
rew.g1 <- rewire.ws(g, 0)

#p = 0.2
rew.g2 <- rewire.ws(g1, 0.2)

#p = 1.0
rew.g3 <- rewire.ws(g1, 1.0)

#図示
png("ws1.png")
gplot(rew.g1, gmode="graph", mode="circle", main="p = 0")
dev.off()

png("ws2.png")
gplot(rew.g2, gmode="graph", mode="circle", main="p = 0.2")
dev.off()

png("ws3.png")
gplot(rew.g3, gmode="graph", mode="circle", main="p = 1.0")
dev.off()
pが小さいうちはレギュラーグラフに類似した構造で、p値を大きくするとランダムグラフに近づくことが定性的に理解することができます。

それでは、クラスター係数、平均距離、そして次数分布はpの値の変化に伴ってどのように変化しているのでしょうか。以下では、これらの値を計算し、可視化を行います。





【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp
増田直紀 今野紀雄『複雑ネットワーク』2010 近代科学社  83-86pp

オブジェクト指向プログラミングの基本用語


オブジェクト指向型プログラミングに関する各種用語の整理を行いました。大部分は、文末に挙げた参考文献に依拠しています。

#手続き型言語
  • C, Pascal, BASICなど
  • 編成単位が原始的
  • データの扱いが大雑把(local, globalの2種類よりも細かく柔軟性のある指定ができない)
  • アクセスしてはいけない関数からの不注意なアクセスというプログラミングエラーが頻繁に起きる
  • そのデータにアクセする必要な視覚のある関数だけがアクセスできて、ほかからはデータが見えないようにするにはオブジェクト指向型言語が必要
#オブジェクト指向型言語
  • OPP :  object oriented programming
  • 関数と変数の両方をおさめたプログラミング単位:オブジェクト を規定
  • C言語の構造体をヒントに拡張した
#オブジェクト
  • フィールド:オブジェクトの中の変数
  • メソッド:オブジェクトの中の関数
  • 無関係なメソッドや行儀の悪いメソッドがあるオブジェクトのフィールドにアクセスができないようになっている。
#クラス
  • 形はまったく同じでもメソッドの処理内容やフィールドの内容が少しずつ違うオブジェクトをいくつも作成するのは手間がかかる。
  • クラスという概念は、一定の形をしたオブジェクトの仕様書みたいなもの。
#オブジェクトの作成
  • クラスの定義を書いただけでは、そのクラスのオブジェクトは作られない
  • C言語の構造体でもやはり、構造体の定義をかいただけでは何も変数は作られない
  • newというキーワードを使ってオブジェクトを生成
  • オブジェクトの生成と同時に、そのオブジェクトの参照を、そのオブジェクトのクラス型指定としてついている変数に収める必要がある
  • 実際にクラスからオブジェトを作成することをインスタンス作成(instantiation)という
  • オブジェクトのことを「クラスのインスタンス」ということがある。
#オブジェクトのメッソドへのアクセス
  • "."を用いてオブジェクトとそのメソッドやフィールを結びつける
               例  object.field    object.method
#コンストラクタ
  • コンストラクタはnewを用いてオブジェクトを作るときに、自動的に呼び出さる。
  • コンストラクタの名前は常にクラスの名前と同じ
  • コンストラクタの中には、オブジェクトが最初に作られた時の状態や、その時に行われるべき操作などが書かれる。
  • コンストラクタがないと、不必要に多いメソッドを作ってしまうことになる
#publicとprivate
  • publicとprivateはアクセス指定(access modifier)と呼ばれる
  • クラスのメソッドやフィールドに外からアクセスできるか・できないかを指定する
  • privateが付いているフィールやメソッドは、そのクラスの中のメソッドからしかアクセスできない
  • publicが付いているフィールドやメソッドは、その他のクラスから呼び出すことができる
#クラスのフィールド(つまりデータ)は、通常はprivateにして、メソッドの方をpublicにする
  • このようにすることで、他のクラスのメソッドが断り無く勝手にデータを書き換えたりできないので、データが保護される。
  • 外部からのクラスのデータにアクセスする必要があったら、必ずそのクラスのメソッドを使うようにすることができる
  • 『データは女王蜂のみたいなものです。巣の奥深くに隠しておいて、働き蜂のメソッドたちに世話をさせるのです。』
#継承(inheritance)
  • 既存のクラスから派生させたクラスとして、既存のクラスの拡張版のような新しいクラスを作ること
  • 元のクラスをスーパークラス(super class)と呼ぶ
  • 新たに定義されるクラスをサブクラス(subclass)と呼ぶ
  • スーパークラスからサブクラスを作ることは拡張(extend)していることに等しい。そのため、キーワードはextendを使用
  • 既存のクラスに新たな特徴を加えることが容易にできるし、元となる1つのクラスを軸として関連クラスの集まりを定義できるので、設計の点で有利である
#多形性(polymorphism)
  • 多形性とは、クラスがそれぞれ異なる複数のオブジェクトに対して、同じ取り扱いができる状態のこと
  • それらの異なるクラスは、同一のクラスからのサブクラスでなけれbならない
  • クラスが異なる複数のオブジェクトに対して、同じ名前のメソッドを呼び呼び出せるが、そのメソッドの処理内容が少しずつ違う状態のことをpolymorphismと呼ぶ
  • 柔軟で臨機応変な取り扱いを自動的に行うこと
  • 多形性はプログラムの設計とコーディングを単純化し、わかりやすくする
#ソフトウェア工学
  • ソフトウェアの全生涯には、仕様決定、設計、審査、コーディング(狭義のプログラミング)、試験、生産、メンテナンスが含まれる
  • ソフトウェア工学そのものは抽象的な学問なので、大規模なプロジェクトを実際に体験した人でないと具体的な理解が難しい
【参考文献】

Robert Lafore 著 岩谷 宏訳 『Javaで学ぶアルゴリズムとデータ構造』ソフトバンク 1999 8 - 16 pp

Javaアプレットのビュア

作成したJava appletの出来映えを確認したい場合は、appletviewerというコマンドを使用します。
例として、Javaでアプレットを使用しながらアルゴリズムを学べる『Javaで学ぶアルゴリズムとデータ構造』という本 (http://www.sbcr.jp/products/4797306947.html) に付属するサンプルを閲覧してみます。


$ appletviewer ~/Javaで学ぶアルゴリズムとデータ構造/DSA/JAVAAPPS/JAVA-1.1/Chap02/Array


一昔前のJavaだと、Chromeなどのブラウザでは付属のアプレットが動かないことがしばしば見られます。Webブラウザが対応していないためです。そのためApplet Viewerは重宝されます。


【参考文献】
Robert Lafore 著 岩谷 宏訳 『Javaで学ぶアルゴリズムとデータ構造』ソフトバンク 1999