9#ifndef _SATTERTHWAITE_H_
10#define _SATTERTHWAITE_H_
15#include <RcppArmadillo.h>
32 const double &sigSq_g,
33 const double &sigSq_e,
37 const vec &inv_s_delta,
38 const mat &inv_s_delta_Xu);
49 const mat
get_A()
const {
return A;}
50 const mat
get_B()
const {
return B;}
63 const vec &inv_s_delta,
64 const mat &inv_s_delta_Xu,
73 double sigSq_g, sigSq_e, delta;
82 const double &sigSq_g,
83 const double &sigSq_e,
87 const vec &inv_s_delta,
88 const mat &inv_s_delta_Xu):
92 delta(sigSq_e/sigSq_g) {
95 prep_gradient(s, Xu, inv_s_delta, inv_s_delta_Xu, Gamma_XX);
104 mat g = get_gradient(L);
107 double var_Lbeta, v_numerator, v_denom;
110 for(
int i=0; i<L.n_rows; i++){
112 var_Lbeta = as_scalar(L.row(i).t() * V * L.row(i));
113 v_numerator = 2 * pow(var_Lbeta, 2);
116 v_denom = as_scalar(g.row(i).t() * H_inv * g.row(i));
118 df(i) = v_numerator / v_denom;
125vec Satterthwaite<T>::get_gradient(
const mat &L)
const {
127 vec g(L.n_rows, 2, fill::zeros);
132 for(
int i=0; i<L.n_rows; i++){
134 invAL = solve(A, L.row(i));
137 c = as_scalar(invAL * B * invAL);
140 g(i,0) = as_scalar(L.row(i).t() * invAL - delta*c);
148void Satterthwaite<T>::set_hessian(
const vec &s){
155 double a = accu(1/(s + delta)) + (n-r)/delta;
158 double b = accu(1/pow(s + delta,2)) + (n-r)/pow(delta, 2);
160 H = mat(2,2, fill::zeros);
163 H(0,0) = (n - 2*delta*a + pow(delta,2)*b) / (2*pow(sigSq_g,2));
166 H(0,1) = (a - delta*b) / (2*pow(sigSq_g,2));
170 H(1,1) = b / (2*pow(sigSq_g,2));
178void Satterthwaite<T>::prep_gradient(
181 const vec &inv_s_delta,
182 const mat &inv_s_delta_Xu,
183 const mat &Gamma_XX) {
192 A = Xu.t() * inv_s_delta_Xu + Gamma_XX / delta;
196 B = Xu.t() *
scaleEachCol(Xu, pow(inv_s_delta,2)) + Gamma_XX / pow(delta, 2);
Satterthwaite(const int &n, const double &sigSq_g, const double &sigSq_e, const vec &s, const T &Xu, const mat &Gamma_XX, const vec &inv_s_delta, const mat &inv_s_delta_Xu)
Definition satterthwaite.h:80
const mat get_hessian() const
Definition satterthwaite.h:48
const mat get_A() const
Definition satterthwaite.h:49
const mat get_B() const
Definition satterthwaite.h:50
vec get_ddf(const mat &V, const mat &L) const
Definition satterthwaite.h:101
mat scaleEachCol(const mat &X, const vec &w)
Definition misc.h:16
Definition CleanData.h:17