Class: MixedModels::LMMFormula
- Inherits:
-
Object
- Object
- MixedModels::LMMFormula
- Defined in:
- lib/mixed_models/LMMFormula.rb
Overview
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]
Instance Attribute Summary collapse
-
#content ⇒ Object
readonly
Returns the value of attribute content.
Instance Method Summary collapse
- #*(x) ⇒ Object
- #+(x) ⇒ Object
-
#initialize(content) ⇒ LMMFormula
constructor
A new instance of LMMFormula.
-
#to_input_for_lmm_from_daru ⇒ Object
Transform @content into a Hash containing multiple Arrays, which can be used as input to LMM#from_daru.
- #|(x) ⇒ Object
Constructor Details
#initialize(content) ⇒ LMMFormula
Returns a new instance of LMMFormula.
25 26 27 |
# File 'lib/mixed_models/LMMFormula.rb', line 25 def initialize(content) @content = content end |
Instance Attribute Details
#content ⇒ Object (readonly)
Returns the value of attribute content.
29 30 31 |
# File 'lib/mixed_models/LMMFormula.rb', line 29 def content @content end |
Instance Method Details
#*(x) ⇒ Object
35 36 37 38 |
# 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) ⇒ Object
31 32 33 |
# File 'lib/mixed_models/LMMFormula.rb', line 31 def +(x) LMMFormula.new(@content + x.content) end |
#to_input_for_lmm_from_daru ⇒ Object
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]
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# 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) ⇒ Object
40 41 42 |
# File 'lib/mixed_models/LMMFormula.rb', line 40 def |(x) LMMFormula.new([["random_effect"] + @content + x.content]) end |