Added link functions to genextreme, exponweib

master
pbrod 9 years ago
parent cced4aeb0b
commit b88a141d54

@ -21,7 +21,8 @@ from scipy.linalg import pinv2
from scipy import optimize from scipy import optimize
import numpy as np import numpy as np
from numpy import (alltrue, arange, zeros, log, sqrt, exp, expm1, from scipy.special import expm1, log1p
from numpy import (alltrue, arange, zeros, log, sqrt, exp,
atleast_1d, any, asarray, nan, pi, isfinite) atleast_1d, any, asarray, nan, pi, isfinite)
from numpy import flatnonzero as nonzero from numpy import flatnonzero as nonzero
@ -38,10 +39,9 @@ all = alltrue # @ReservedAssignment
def _expon_link(x, logSF, phat, ix): def _expon_link(x, logSF, phat, ix):
if ix == 1: if ix == 1:
return - (x - phat[0]) / logSF return - (x - phat[0]) / logSF
elif ix == 0: if ix == 0:
return x + phat[1] * logSF return x + phat[1] * logSF
else: raise IndexError('Index to the fixed parameter is out of bounds')
raise IndexError('Index to the fixed parameter is out of bounds')
def _weibull_min_link(x, logSF, phat, ix): def _weibull_min_link(x, logSF, phat, ix):
@ -56,6 +56,21 @@ def _weibull_min_link(x, logSF, phat, ix):
return phati return phati
def _exponweib_link(x, logSF, phat, ix):
a, c, loc, scale = phat
logP = -log(-expm1(logSF))
xn = (x - loc) / scale
if ix == 0:
return - logP / log(-expm1(-xn**c))
if ix == 1:
return log(-log1p(- logP**(1.0 / a))) / log(xn)
if ix == 2:
return x - (-log1p(- logP**(1.0/a))) ** (1.0 / c) * scale
if ix == 3:
return (x - loc) / (-log1p(- logP**(1.0/a))) ** (1.0 / c)
raise IndexError('Index to the fixed parameter is out of bounds')
def _genpareto_link(x, logSF, phat, ix): def _genpareto_link(x, logSF, phat, ix):
# Reference # Reference
# Stuart Coles (2004) # Stuart Coles (2004)
@ -83,42 +98,61 @@ def _genpareto_link(x, logSF, phat, ix):
return phati return phati
def _genextreme_link(x, logSF, phat, ix):
c, loc, scale = phat
loglogP = log(-log(-expm1(logSF)))
if ix == 2:
# link = -(x-loc)*c/expm1(c*log(-logP))
if c != 0.0:
phati = -(x - loc) * c / expm1(c * loglogP)
else:
phati = -(x - loc) / loglogP
elif ix == 1:
if c != 0:
phati = x + scale * expm1(c * loglogP) / c
else:
phati = x + scale * loglogP
elif ix == 0:
raise NotImplementedError(
'link(x,logSF,phat,i) where i=0 is not implemented!')
else:
raise IndexError('Index to the fixed parameter is out of bounds')
return phati
def _genexpon_link(x, logSF, phat, ix): def _genexpon_link(x, logSF, phat, ix):
_a, b, c, loc, scale = phat a, b, c, loc, scale = phat
xn = (x - loc) / scale xn = (x - loc) / scale
fact1 = (xn + expm1(-c * xn) / c) fact1 = (xn + expm1(-c * xn) / c)
if ix == 0: if ix == 0:
phati = b * fact1 + logSF phati = b * fact1 + logSF
elif ix == 1: elif ix == 1:
phati = (phat[0] - logSF) / fact1 phati = (a - logSF) / fact1
elif ix in [2, 3, 4]: elif ix in [2, 3, 4]:
raise NotImplementedError('Only implemented for index in [0,1]!') raise NotImplementedError('Only implemented for index in [0,1]!')
else: else:
raise IndexError('Index to the fixed parameter is out of bounds') raise IndexError('Index to the fixed parameter is out of bounds')
return phati return phati
def _rayleigh_link(x, logSF, phat, ix): def _rayleigh_link(x, logSF, phat, ix):
if ix == 1: if ix == 1:
return x - phat[0] / sqrt(-2.0 * logSF) return x - phat[0] / sqrt(-2.0 * logSF)
elif ix == 0: if ix == 0:
return x - phat[1] * sqrt(-2.0 * logSF) return x - phat[1] * sqrt(-2.0 * logSF)
else: raise IndexError('Index to the fixed parameter is out of bounds')
raise IndexError('Index to the fixed parameter is out of bounds')
def _trunclayleigh_link(x, logSF, phat, ix): def _trunclayleigh_link(x, logSF, phat, ix):
c, loc, scale = phat c, loc, scale = phat
if ix == 0:
xn = (x - loc) / scale
return - 2 * logSF / xn - xn / 2.0
if ix == 2: if ix == 2:
return x - loc / (sqrt(c * c - 2 * logSF) - c) return x - loc / (sqrt(c * c - 2 * logSF) - c)
elif ix == 1: if ix == 1:
return x - scale * (sqrt(c * c - 2 * logSF) - c) return x - scale * (sqrt(c * c - 2 * logSF) - c)
elif ix == 0: raise IndexError('Index to the fixed parameter is out of bounds')
xn = (x - loc) / scale
return - 2 * logSF / xn - xn / 2.0
else:
raise IndexError('Index to the fixed parameter is out of bounds')
LINKS = dict(expon=_expon_link, LINKS = dict(expon=_expon_link,
@ -127,7 +161,9 @@ LINKS = dict(expon=_expon_link,
genpareto=_genpareto_link, genpareto=_genpareto_link,
genexpon=_genexpon_link, genexpon=_genexpon_link,
rayleigh=_rayleigh_link, rayleigh=_rayleigh_link,
trunclayleigh=_trunclayleigh_link) trunclayleigh=_trunclayleigh_link,
genextreme=_genextreme_link,
exponweib=_exponweib_link)
def chi2isf(p, df): def chi2isf(p, df):

Loading…
Cancel
Save