class MixedModels::LMMFormula

Defines a syntax to specify and store a model formula. The stored formula can be transformed into Arrays that can be used as input to LMM#from_daru. Not intended for direct use by the user of the MixedModels gem.

Usage

intercept = MixedModels::lmm_variable(:intercept)
x         = MixedModels::lmm_variable(:x)
y         = MixedModels::lmm_variable(:y)
u         = MixedModels::lmm_variable(:u)
w         = MixedModels::lmm_variable(:w)
z         = intercept + x + y + x*y + 
            (intercept + x + y + x*y| u) + 
            (intercept | w)
input     = z.to_input_for_lmm_from_daru
input[:fixed_effects] # => [:intercept, :x, :y, [:x, :y]]
input[:random_effects] # => [[:intercept, :x, :y, [:x, :y]], [:intercept]]
input[:grouping] # => [:u, :w]

Attributes

content[R]

Public Class Methods

new(content) click to toggle source
# File lib/mixed_models/LMMFormula.rb, line 25
def initialize(content)
  @content = content
end

Public Instance Methods

*(x) click to toggle source
# File lib/mixed_models/LMMFormula.rb, line 35
def *(x)
  raise "can only call if both operands are single variables" if content.size !=1 || x.content.size !=1
  LMMFormula.new([["interaction_effect", @content[0], x.content[0]]])
end
+(x) click to toggle source
# File lib/mixed_models/LMMFormula.rb, line 31
def +(x)
  LMMFormula.new(@content + x.content)
end
to_input_for_lmm_from_daru() click to toggle source

Transform +@content+ into a Hash containing multiple Arrays, which can be used as input to LMM#from_daru

Usage

intercept = MixedModels::lmm_variable(:intercept)
x         = MixedModels::lmm_variable(:x)
u         = MixedModels::lmm_variable(:u)
y         = intercept + x + (intercept + x | u)
input     = y.to_input_for_lmm_from_daru
input[:fixed_effects] # => [:intercept, :x]
input[:random_effects] # => [[:intercept, :x]]
input[:grouping] # => [:u]
# File lib/mixed_models/LMMFormula.rb, line 58
def to_input_for_lmm_from_daru
  lmm_from_daru_input = Hash.new
  lmm_from_daru_input[:fixed_effects]  = Array.new
  lmm_from_daru_input[:random_effects] = Array.new
  lmm_from_daru_input[:grouping]       = Array.new

  @content.each do |item|
    if item.is_a?(Symbol) then
      lmm_from_daru_input[:fixed_effects].push(item)
    elsif item.is_a?(Array) then
      c = Marshal.load(Marshal.dump(item)) # in order to keep @content unchanged

      if c[0] == "interaction_effect" then
        c.shift
        raise "bi-variate interaction effects allowed only" unless c.length == 2
        lmm_from_daru_input[:fixed_effects].push(c)

      elsif c[0] == "random_effect" then
        c.shift

        # get grouping structure
        grp = c.pop
        case
        when grp.is_a?(Symbol)
          lmm_from_daru_input[:grouping].push(grp)
        when grp.is_a?(Array) && grp[0] == "interaction_effect"
          grp.shift
          raise "bi-variate nested effects allowed only" unless grp.length == 2
          lmm_from_daru_input[:grouping].push(grp)
        else
          raise "invalid formulation of the random effects grouping structure in LMMFormula"
        end

        # get random effects terms
        ran_ef = Array.new
        c.each do |cc|
          case
          when cc.is_a?(Symbol)
            ran_ef.push(cc)
          when cc.is_a?(Array) && cc[0] == "interaction_effect"
            cc.shift
            raise "bi-variate interaction effects allowed only" unless cc.length == 2
            ran_ef.push(cc)
          else
            raise "invalid formulation of random effects in LMMFormula"
          end
        end
        lmm_from_daru_input[:random_effects].push(ran_ef)

      else
        raise "invalid formulation of LMMFormula.content"
      end
    else
      raise "invalid formulation of LMMFormula.content"
    end
  end

  return lmm_from_daru_input
end
|(x) click to toggle source
# File lib/mixed_models/LMMFormula.rb, line 40
def |(x)
  LMMFormula.new([["random_effect"] + @content + x.content])
end