PubMed でシンプソン係数

PubMed(生命科学系の論文検索サイト:http://www.ncbi.nlm.nih.gov/sites/entrez)の論文を使って,生命現象(or 遺伝子)の関係(共起)を調べよう!ってことでシンプソン係数の計算を題材にしてみました.シンプソン係数が大きいほど,入力した2遺伝子(2単語)が頻繁に同時に論文に現れるので,関係が強いと推定できます.

中で使っているRubyコードsimpson.rb(このエントリの最後に書きます)は,引数に2つの遺伝子(単語)を入れると,独立した検索数とシンプソン係数が出てきます.

./simpson.rb CDK2 CDK6
CDK2 CDK6 3779 743 321 0.432032301480485

上記の例では,CDK2, CDK6が検索語,CDK2が3779件,CDK6が743件,CDK2 & CDK6が321件,シンプソン係数は0.432...となっています.


シンプソン係数は汎用的なものなので,WikiPediaで共起を調べるには,
「たつをのChangeLog - Wikipediaキーワードリンクを使って関連語データを作ってみた」
( http://chalow.net/2007-06-09-3.html )などを参照.
Google や, Y!のAPIでも可能です.

  • シンプソン係数を求めるrubyのコード(simpson.rb)
#!/usr/bin/env ruby

require 'rexml/document'
require 'open-uri'

def count(gene)
  fp = open("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="+gene)
  source = fp.read
  fp.close
  doc = REXML::Document.new source
  return doc.elements['/eSearchResult/Count'].text.to_i
end

def simpson(gene1_count, gene2_count, gene12_count)
  if gene1_count <= 0 || gene2_count <= 0
    return nil
  elsif gene1_count < gene2_count
    return gene12_count.to_f / gene1_count.to_f
  end
  return gene12_count.to_f / gene2_count.to_f
end

def main(gene1,gene2)
  gene1_count = count(gene1)
  gene2_count = count(gene2)
  gene12_count = count(gene1 + "+" + gene2)
  s = simpson(gene1_count, gene2_count, gene12_count)
  puts [gene1, gene2, gene1_count, gene2_count, gene12_count, s].join("\t")
end

exit if ARGV.size != 2
main(ARGV[0],ARGV[1])