lib/statsample/anova/contrast.rb
module Statsample
module Anova
class Contrast
attr_reader :psi
attr_reader :msw
include Summarizable
def initialize(opts=Hash.new)
raise "Should set at least vectors options" if opts[:vectors].nil?
@vectors=opts[:vectors]
@c=opts[:c]
@c1,@c2=opts[:c1], opts[:c2]
@t_options=opts[:t_options] || {:estimate_name=>_("Psi estimate")}
@name=opts[:name] || _("Contrast")
@psi=nil
@anova=Statsample::Anova::OneWayWithVectors.new(@vectors)
@msw=@anova.msw
end
# Hypothesis contrast, selecting index for each constrast
# For example, if you want to contrast x_0 against x_1 and x_2
# you should use
# c.contrast([0],[1,2])
def c_by_index(c1,c2)
contrast=[0]*@vectors.size
c1.each {|i| contrast[i]=1.quo(c1.size)}
c2.each {|i| contrast[i]=-1.quo(c2.size)}
@c=contrast
c(contrast)
end
def psi
if @psi.nil?
c(@c) if @c
c_by_index(@c1,@c2) if (@c1 and @c2)
end
@psi
end
def confidence_interval(cl=nil)
t_object.confidence_interval(cl)
end
# Hypothesis contrast, using custom values
# Every parameter is a contrast value. You should use
# the same number of contrast as vectors on class and the sum
# of constrast should be 0.
def c(args=nil)
return @c if args.nil?
@c=args
raise "contrast number!=vector number" if args.size!=@vectors.size
#raise "Sum should be 0" if args.inject(0) {|ac,v| ac+v}!=0
@psi=args.size.times.inject(0) {|ac,i| ac+(args[i]*@vectors[i].mean)}
end
def standard_error
sum=@vectors.size.times.inject(0) {|ac,i|
ac+((@c[i].rationalize**2).quo(@vectors[i].size))
}
Math.sqrt(@msw*sum)
end
alias :se :standard_error
def df
@vectors.inject(0) {|ac,v| ac+v.size}-@vectors.size
end
def t_object
Statsample::Test::T.new(psi, se, df, @t_options)
end
def t
t_object.t
end
def probability
t_object.probability
end
def report_building(builder)
builder.section(:name=>@name) do |s|
s.text _("Contrast:%s") % c.join(",")
s.parse_element(t_object)
end
end
end
end
end