test/unit/bio/sequence/test_common.rb in bio-1.4.2 vs test/unit/bio/sequence/test_common.rb in bio-1.4.3
- old
+ new
@@ -237,10 +237,14 @@
assert(rseqs[0] != rseqs[1])
assert(rseqs[0] != rseqs[2])
assert(rseqs[1] != rseqs[2])
end
+ end #class TestSequenceCommonRandomize
+
+ class TestSequenceCommonRandomizeChi2 < Test::Unit::TestCase
+
def chi2(hist, f, k)
chi2 = 0
(0...k).each do |i|
chi2 += ((hist[i] - f) ** 2).quo(f)
end
@@ -248,11 +252,11 @@
end
private :chi2
# chi-square test for distribution of chi2 values from
# distribution of index('a')
- def randomize_equiprobability
+ def randomize_equiprobability_chi2
# Reference: http://www.geocities.jp/m_hiroi/light/pystat04.html
seq = TSequence.new('ccccgggtta') # length must be 10
k = 10
hist = Array.new(k, 0)
iter = 200
@@ -278,14 +282,42 @@
chi2_f = chi2_iter.quo(k).to_f
chi2_chi2 = chi2(chi2_hist, chi2_f, k)
#$stderr.puts chi2_chi2
+ chi2_chi2
+ end
+ private :randomize_equiprobability_chi2
+
+ def randomize_equiprobability(&block)
## chi-square test, freedom 9, significance level 5%
- #assert_operator(16.919, :>, chi2_chi2, "test of chi2 < 16.919 failed (#{chi2_chi2})")
+ #critical_value = 16.919
+ #significance_level_message = "5%"
+ #
# chi-square test, freedom 9, significance level 1%
- assert_operator(21.666, :>, chi2_chi2, "test of chi2 < 21.666 failed (#{chi2_chi2})")
+ critical_value = 21.666
+ significance_level_message = "1%"
+
+ # max trial times till the test sucess
+ max_trial = 10
+
+ values =[]
+ max_trial.times do |i|
+ chi2_chi2 = randomize_equiprobability_chi2(&block)
+ values.push chi2_chi2
+ # immediately breaks if the test succeeds
+ break if chi2_chi2 < critical_value
+ $stderr.print "Bio::Sequence::Common#randomize test of chi2 (=#{chi2_chi2}) < #{critical_value} failed (expected #{significance_level_message} by chance)"
+ if values.size < max_trial then
+ $stderr.puts ", retrying."
+ else
+ $stderr.puts " #{values.size} consecutive times!"
+ end
+ end
+
+ assert_operator(values[-1], :<, critical_value,
+ "test of chi2 < #{critical_value} failed #{values.size} times consecutively (#{values.inspect})")
end
private :randomize_equiprobability
def test_randomize_equiprobability
randomize_equiprobability { |seq| seq.randomize }
@@ -317,10 +349,10 @@
# end
# newseq
# end
#end
- end
+ end #class TestSequenceCommonRandomizeChi2
class TestSequenceCommonSubseq < Test::Unit::TestCase
#def subseq(s = 1, e = self.length)