class Statsample::GLM::MLE::Probit

Probit MLE estimation.

Usage:

mle = Statsample::MLE::Probit.new
mle.newton_raphson(x,y)
beta       = mle.parameters
likelihood = mle.likelihood(x,y,beta)
iterations = mle.iterations

Protected Instance Methods

f(b,x) click to toggle source

F(B'Xi)

# File lib/statsample-glm/glm/mle/probit.rb, line 23
def f(b,x)
  p_bx=(x*b)[0,0] 
  GSL::Cdf::ugaussian_P(p_bx)
end
ff(b,x) click to toggle source

f(B'Xi)

# File lib/statsample-glm/glm/mle/probit.rb, line 28
def ff(b,x)
  p_bx=(x*b)[0,0] 
  GSL::Ran::ugaussian_pdf(p_bx)
end
first_derivative(x,y,b) click to toggle source

First derivative of log-likelihood probit function x: Matrix (NxM) y: Matrix (Nx1) p: Matrix (Mx1)

# File lib/statsample-glm/glm/mle/probit.rb, line 51
def first_derivative(x,y,b)
  raise "x.rows!=y.rows" if x.row_size!=y.row_size
  raise "x.columns!=p.rows" if x.column_size!=b.row_size            
  n = x.row_size
  k = x.column_size
  fd = Array.new(k)
  k.times {|i| fd[i] = [0.0]}
  n.times do |i|
    xi = Matrix.rows([x.row(i).to_a])
    fbx=f(b,xi)
    value1 = (y[i,0]-fbx)/ ( fbx*(1-fbx))*ff(b,xi) 
    k.times do |j|
      fd[j][0] += value1*xi[0,j]
    end
  end
  Matrix.rows(fd, true)
end
log_likelihood_i(xi,yi,b) click to toggle source

Log Likehood for x_i vector, y_i scalar and b parameters

# File lib/statsample-glm/glm/mle/probit.rb, line 43
def log_likelihood_i(xi,yi,b)
  fbx=f(b,xi)
  (yi.to_f*Math::log(fbx))+((1.0-yi.to_f)*Math::log(1.0-fbx))
end
measurement(data_set, coefficients) click to toggle source
# File lib/statsample-glm/glm/mle/probit.rb, line 17
def measurement data_set, coefficients
  (data_set * coefficients).map { |x| Distribution::Normal.cdf(x) }
end
second_derivative(x,y,b) click to toggle source

Second derivative of log-likelihood probit function x: Matrix (NxM) y: Matrix (Nx1) p: Matrix (Mx1)

# File lib/statsample-glm/glm/mle/probit.rb, line 73
def second_derivative(x,y,b)
  raise "x.rows!=y.rows" if x.row_size!=y.row_size
  raise "x.columns!=p.rows" if x.column_size!=b.row_size
  n = x.row_size
  k = x.column_size
  if Statsample.has_gsl?
    sum=GSL::Matrix.zeros(k)
  else
    sum=Matrix.zero(k)
  end
  n.times do |i|
    xi=Matrix.rows([x.row(i).to_a])
    fbx=f(b,xi)
    val=((ff(b,xi)**2) / (fbx*(1.0-fbx)))*xi.t*xi
    if Statsample.has_gsl?
      val=val.to_gsl
    end
    sum-=val
  end
  if Statsample.has_gsl?
    sum=sum.to_matrix
  end
  sum
end