]遺伝子多型解析を数か月でできるようになるために〜第2回

  • 『Applied Statistical Genetics With R』の読み会シリーズの目次
  • 2011/05/27
  • 第1章
    • 遺伝子とは
    • スタディデザイン
    • 機能性を標的にするか・代理を標的にするか
      • 機能性多型を標的に
      • 遺伝子なり領域を標的にしてLDで
    • 標的を定めるか、定めないか
      • ターゲット
      • ゲノムワイド連鎖解析・ゲノムワイド関連解析等の仮説フリー
  • Genome情報とその他の中間形質情報との違い
    • Genome情報と形質との関連を調べることと、中間形質と形質を調べることの違いについて

http://www.genome.med.kyoto-u.ac.jp/func-gen-photo/albums/StatGenetTextbook/2-1.jpeg
http://www.genome.med.kyoto-u.ac.jp/StatGenet/RY%E8%AC%9B%E7%BE%A9%E9%96%A2%E4%BF%82/2011/IkagakukennkyuuStatGenet2011.jpg

  • phenotypeとcovariates
    • phenotypeが複数の基準からなるときのことなどをディスカッション
  • 実習
    • ウェブ上のテキストファイルを直接読みこみ
fmsURL <- "http://people.umass.edu/foulkes/asg/data/FMS_data.txt"
fms <- read.delim(file=fmsURL,header=T,sep="\t")
  • geneticsパッケージを使う
    • 解説文書PDF
    • geneticsパッケージのgenotypeオブジェクトのsummary関数でHu's heterozygosityが計算される
    • \frac{2n}{2n-1}(1-\sum_{i} p_i^2)が式
    • 検体数が少ないときの補正(不偏推定量)
$`African Am`

Number of samples typed: 43 (97.7%)

Allele Frequency: (2 alleles)
   Count Proportion
A     60        0.7
G     26        0.3
NA     2         NA


Genotype Frequency:
    Count Proportion
A/A    23       0.53
A/G    14       0.33
G/G     6       0.14
NA      1         NA

Heterozygosity (Hu)  = 0.4268126
Poly. Inf. Content   = 0.3328711


install.packages("genetics")
library(genetics)
  • 色々関数
    • head(),tail()
    • attach()は、データベースをアタッチする
      • そうすると、関数に「何か」を与えると、その名前を変数としていないかをattachedされたオブジェクトに関して探索してくれる
attach(fms)
head(id) #idという変数をattachedなfmsに探しに行く
head() # では、そもそも探しに行かない
  • 欠損値など
> 関数<-c("is.null()","is.na()","is.nan()","is.finite()","is.infinite()","complete.cases()")
> 対象<-c("NULL","NA","NaN","有限か否か","無限か否か","欠測か否か")
> data.frame("関数"=関数,"対象"=対象)
              関数       対象
1        is.null()       NULL
2          is.na()         NA
3         is.nan()        NaN
4      is.finite() 有限か否か
5    is.infinite() 無限か否か
6 complete.cases() 欠測か否
#http://www.people.umass.edu/foulkes/asg.html

fmsURL <- "http://people.umass.edu/foulkes/asg/data/FMS_data.txt"

fms <- read.delim(file=fmsURL,header=T,sep="\t")




# read.table関数

#参考
#--------------------------------------------------------------------------
#fname<-c("read.csv","read.csv2","read.delim","read.delim2","read.fwf")
#header<-c(rep("TRUE",4),FALSE)
#sep<-c(",",";",rep("\t",3))
#dec<-c(".",",",".",",",".")
#youto<-c("区切りがカンマの場合","区切りがコロンの場合(小数点がカンマ)","区切りがタブの場合","区切りがタブの場合(小数点がカンマ)","(1行の各欄の桁数widthを指定して読み込む)")
#table_variation<-data.frame("関数名"=fname,"header"=header,"sep"=sep,"dec"=dec,"用途"=youto)
#table_variation
#---------------------------------------------------------------------------

#read.delim関数やread.csv関数は、read.table関数からの派生(ラッパー関数)。
#これらにおいては、header sep quote decは既定なので指定しなくてよい。
#---------------------------------------------------------------------------
#table_variation[3,]
#---------------------------------------------------------------------------

#つまり、以下の3つは同じ意味。
#---------------------------------------------------------------------------
fms <- read.delim(file=fmsURL,header=T,sep="\t")
fms <- read.delim(file=fmsURL)
fms <- read.table(file=fmsURL,header=T,sep="\t")
#---------------------------------------------------------------------------
#一番上の式は、「馬から落馬」している

#ちなみに、
fms <- read.table(file=fmsURL,header=T)
#でも実はいけるよう。sep=""とsep="\t"は指定しなくても読んでくれる。
#sep=","は読んでくれなかった。きちんと指定するか、read.csv関数を使用する。

#read.tableを使ったらheaderをちゃんと指定すること。
#TはTRUE、FはFALSE。(headerがある(TRUE)、ない(FALSE))

#いろいろ読み込んでみてください。
# example0 タブ区切り、ヘッダーあり
# example0.1 コンマ区切り、ヘッダーあり
# example0.2 スペース区切り、ヘッダーなし

#仕組みさえわかれば、あとは自分が使いやすい形式を。





#表からデータを取り出してくる。

#Ageだけ取り出したい場合
#---------------------------------------------------------------------------
fms$Age
#---------------------------------------------------------------------------

#1~25番目だけ
#---------------------------------------------------------------------------
fms$Age[1:25]
#---------------------------------------------------------------------------

#データフレームで
data.frame(fms$Age)[1:25]
#これはエラー。
#データフレームにしたら行と列の指定が必要。
#---------------------------------------------------------------------------
data.frame(fms$Age)[1:25,]
data.frame(fms$Age,fms$id)[1:25,]
#---------------------------------------------------------------------------


#いちいちfms$での指定が面倒なので
#---------------------------------------------------------------------------
attach(fms)
data.frame(id,actn3_r577x, actn3_rs540874, actn3_rs1815739, actn3_1671064, Term, Gender, Age, Race, NDRM.CH, DRM.CH)[1:20,]
#---------------------------------------------------------------------------






#集計してくれるsummary関数
#---------------------------------------------------------------------------
 GenoCount<-summary(actn3_rs540874)
 GenoCount
#---------------------------------------------------------------------------

#もちろん、genotype以外でも集計してくれる。
#数字なら、最大・最小・中央値・平均値などをだしてくれる。
#---------------------------------------------------------------------------
summary(Race)

summary(Age)
#---------------------------------------------------------------------------



#Allele Frequencyを計算していく。
#---------------------------------------------------------------------------
attach(fms)
GenoCount<-summary(actn3_rs540874)
GenoCount

NumbObs<-sum(!is.na(actn3_rs540874))
NumbObs
#---------------------------------------------------------------------------





#数を合計してくれるsum関数。しかし...
#---------------------------------------------------------------------------
sum(actn3_rs540874)
class(actn3_rs540874)
#---------------------------------------------------------------------------
#これではだめ。
#factorは数えられない。

#---------------------------------------------------------------------------
length(actn3_rs540874)
#---------------------------------------------------------------------------
#数えられるが、NAの数も含まれている。
#そこで、NAだけ除いたベクトルを定義し直す、という方法も考えうる。


#[1から20を]取り出すなら
#---------------------------------------------------------------------------
aaa<-actn3_rs540874[1:20]
aaa
#---------------------------------------------------------------------------
#[NA以外を]取り出すなら
#---------------------------------------------------------------------------
aaa<-actn3_rs540874[!is.na(actn3_rs540874)]
aaa
#---------------------------------------------------------------------------


#その大きさ
#---------------------------------------------------------------------------
length(aaa)
NumbObs
#---------------------------------------------------------------------------



#!は論理演算子の一つ。「〜でない」
#is.na()は、NAに対してTRUEを、それ以外に対してFALSEを与える。
#---------------------------------------------------------------------------
aaa<-c(1,2,3,NA,5,6,7,NA,9)
is.na(aaa)
!is.na(aaa)
#---------------------------------------------------------------------------

#classはlogical
#---------------------------------------------------------------------------
class(is.na(aaa))
#---------------------------------------------------------------------------

#logicalのベクトルにsum関数を当てはめると
#---------------------------------------------------------------------------
sum(!is.na(aaa))
#---------------------------------------------------------------------------
#TRUEのものを合計してくれる。


#その他の論理演算子
#---------------------------------------------------------------------------
関数<-c("is.null()","is.na()","is.nan()","is.finite()","is.infinite()","complete.cases()")
対象<-c("NULL","NA","NaN","有限か否か","無限か否か","欠測か否か")
data.frame("関数"=関数,"対象"=対象)
#---------------------------------------------------------------------------
#fmsDataの、Ageを合計してみる。
#---------------------------------------------------------------------------
sum(Age)
#---------------------------------------------------------------------------
#これではNA。

#---------------------------------------------------------------------------
sum(!is.na(Age))
class(!is.na(Age))
#---------------------------------------------------------------------------
#括弧内がlogicalなので、TUREの数をカウントしてくれたのみ。


#ちなみに、Ageはもともとinteger(整数値)。
#numericとの違いは、
#---------------------------------------------------------------------------
aaa<-c(1.2,2.3,3.4,4.5,5.6)
aaa
class(aaa)
as.integer(aaa)
#---------------------------------------------------------------------------


#NAを取り除いたinteger vectorにして、合計する。
#---------------------------------------------------------------------------
sum(Age[!is.na(Age)])
#---------------------------------------------------------------------------

#もっとスマートな方法もありました。
#---------------------------------------------------------------------------
sum(Age,na.rm=TRUE)
#---------------------------------------------------------------------------
#NAをremoveする。

#しかし、length関数は2つの引数を認めてくれないので、後者の方法は使えない。
# 





#閑話休題。
#allele frequencyの続き。
#---------------------------------------------------------------------------
GenoCount
GenoFreq<-as.vector(GenoCount/NumbObs)
GenoFreq
#---------------------------------------------------------------------------
#この場合、左からAA,GA,GG,NAのFrequencyが計算。
#ちなみに、as.vectorにしなくても計算には支障ないですが、AAとかいう表示がついて回#ります。
#---------------------------------------------------------------------------
aaa<-c(GenoCount/NumbObs)
aaa
aaA<-(2*aaa[1]+aaa[2])/2
aaA
#---------------------------------------------------------------------------

#普通に計算。
#---------------------------------------------------------------------------
FreqA<-(2*GenoFreq[1]+GenoFreq[2])/2
FreqA
FreqG<-(2*GenoFreq[3]+GenoFreq[2])/2
FreqG
#---------------------------------------------------------------------------


#楽をしたいのでpackageを使う。
#---------------------------------------------------------------------------
install.packages("genetics")
library(genetics)
#---------------------------------------------------------------------------

#---------------------------------------------------------------------------
Geno<-genotype(actn3_rs540874,sep="")
summary(Geno)
#---------------------------------------------------------------------------
#sep=""をきちんと設定しないと動いてくれません。注意。



#試し用
#---------------------------------------------------------------------------
aaa<-c(rep(c("CC","AA","CA","CA"),10))
bbb<-c("C/A","C/C","A/A","C/A","C/A","C/C","A/A","C/A","C/A","C/C","A/A","C/A","C/A","C/C")
#---------------------------------------------------------------------------

#genotype関数は、次のように変換してくれる関数です。
#---------------------------------------------------------------------------
aaa
genotype(aaa)
class(aaa)
#---------------------------------------------------------------------------

#真似をして作っても…
#---------------------------------------------------------------------------
bbb<-c("C/A","C/C","A/A","C/A","C/A","C/C","A/A","C/A","C/A","C/C","A/A","C/A","C/A","C/C")
summary(bbb)
#---------------------------------------------------------------------------

#classを変えてみる
#---------------------------------------------------------------------------
summary(as.factor(bbb))
#---------------------------------------------------------------------------

#これならいける
#---------------------------------------------------------------------------
summary(as.genotype(bbb))
#---------------------------------------------------------------------------

#でも、↓ではgenotype属性がついてくれない。
#---------------------------------------------------------------------------
aaa
as.genotype(aaa)
#---------------------------------------------------------------------------
#やはり、genotype関数を使うのが便利そうです。




#その他
#---------------------------------------------------------------------------
hgdpURL<-"http://people.umass.edu/foulkes/asg/data/HGDP_AKT1.txt"
hgdp<-read.delim(file=hgdpURL)
hgdp[1:20,]
#---------------------------------------------------------------------------


#---------------------------------------------------------------------------
vircoURL<-"http://people.umass.edu/foulkes/asg/data/Virco_data.csv"
virco<-read.csv(file=vircoURL)
#---------------------------------------------------------------------------




#problems
#1.3
#---------------------------------------------------------------------------
library(genetics)
attach(fms)
summary(genotype(actn3_1671064,sep=""))
#---------------------------------------------------------------------------
tapply(genotype(actn3_1671064,sep=""), Race, summary)
#---------------------------------------------------------------------------
# tapply(A,B,f):AをBごとにfする


#1.4
#---------------------------------------------------------------------------
library(genetics)
attach(hgdp)
summary(genotype(AKT1.C6024T,sep=""))
tapply(genotype(AKT1.C6024T,sep=""), Geographic.area, summary)
#---------------------------------------------------------------------------

#1.5
#---------------------------------------------------------------------------
library(genetics)
attach(virco)
summary(virco[,c("P1","P10","P30","P71","P82","P90")])
#---------------------------------------------------------------------------
MutNumVirco<-colSums(virco[,c("P1","P10","P30","P71","P82","P90")]!="-")
Length<-apply(virco[,c("P1","P10","P30","P71","P82","P90")],2,length)
MutNumVirco/Length
#---------------------------------------------------------------------------