[r-cran-vgam] 13/63: Import Upstream version 0.7-8
Andreas Tille
tille at debian.org
Tue Jan 24 13:54:22 UTC 2017
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository r-cran-vgam.
commit 9effe6eb4b224f15cae78619268a0d1724c14120
Author: Andreas Tille <tille at debian.org>
Date: Tue Jan 24 14:16:47 2017 +0100
Import Upstream version 0.7-8
---
DESCRIPTION | 8 +-
NAMESPACE | 48 +-
NEWS | 59 +
R/aamethods.q | 73 +-
R/add1.vglm.q | 2 +-
R/attrassign.R | 2 +-
R/bAIC.q | 110 ++
R/build.terms.vlm.q | 2 +-
R/calibrate.q | 2 +-
R/cao.R | 2 +-
R/cao.fit.q | 7 +-
R/coef.vlm.q | 10 +-
R/cqo.R | 2 +-
R/cqo.fit.q | 2 +-
R/deviance.vlm.q | 2 +-
R/effects.vglm.q | 2 +-
R/family.aunivariate.q | 302 +++-
R/family.basics.q | 2 +-
R/family.binomial.q | 414 ++++--
R/family.bivariate.q | 2 +-
R/family.categorical.q | 120 +-
R/family.censored.q | 2 +-
R/family.circular.q | 2 +-
R/family.extremes.q | 35 +-
R/family.fishing.q | 80 ++
R/family.functions.q | 2 +-
R/family.genetic.q | 2 +-
R/family.glmgam.q | 137 +-
R/family.loglin.q | 4 +-
R/family.mixture.q | 22 +-
R/family.nonlinear.q | 41 +-
R/family.normal.q | 122 +-
R/family.positive.q | 274 +++-
R/family.qreg.q | 485 +++----
R/family.rcqo.q | 2 +-
R/family.rrr.q | 33 +-
R/family.survival.q | 2 +-
R/family.ts.q | 2 +-
R/family.univariate.q | 236 ++-
R/family.vglm.q | 2 +-
R/family.zeroinf.q | 458 ++++--
R/fitted.vlm.q | 6 +-
R/generic.q | 2 +-
R/links.q | 2 +-
R/logLik.vlm.q | 7 +-
R/model.matrix.vglm.q | 71 +-
R/mux.q | 5 +-
R/plot.vglm.q | 94 +-
R/predict.vgam.q | 4 +-
R/predict.vglm.q | 11 +-
R/predict.vlm.q | 126 +-
R/print.summary.others.q | 9 +-
R/print.vglm.q | 18 +-
R/print.vlm.q | 5 +-
R/qrrvglm.control.q | 2 +-
R/qtplot.q | 4 +-
R/residuals.vlm.q | 2 +-
R/rrvglm.R | 2 +-
R/rrvglm.control.q | 2 +-
R/rrvglm.fit.q | 4 +-
R/s.q | 2 +-
R/s.vam.q | 2 +-
R/smart.R | 2 +-
R/step.vglm.q | 2 +-
R/summary.others.q | 2 +-
R/summary.vgam.q | 7 +-
R/summary.vglm.q | 6 +-
R/summary.vlm.q | 2 +-
R/uqo.R | 2 +-
R/vgam.R | 2 +-
R/vgam.control.q | 2 +-
R/vgam.fit.q | 2 +-
R/vgam.match.q | 2 +-
R/vglm.R | 107 +-
R/vglm.control.q | 2 +-
R/vglm.fit.q | 5 +-
R/vlm.R | 2 +-
R/vlm.wfit.q | 4 +-
R/vsmooth.spline.q | 37 +-
R/zzz.R | 2 +-
data/ruge.R | 6 +-
data/wffc.R | 2924 ++++++++++++++++++++++++++++++++++++++
data/wffc.indiv.R | 94 ++
data/wffc.nc.R | 351 +++++
data/wffc.teams.R | 14 +
man/AICvlm.Rd | 100 ++
man/DeLury.Rd | 176 +++
man/VGAM-package.Rd | 19 +-
man/alaplace3.Rd | 4 +-
man/benfUC.Rd | 130 ++
man/betabin.ab.Rd | 24 +-
man/betabinUC.Rd | 20 +-
man/betabinomial.Rd | 22 +-
man/binom2.or.Rd | 12 +-
man/binom2.rho.Rd | 50 +-
man/binom2.rhoUC.Rd | 120 ++
man/binomialff.Rd | 10 +-
man/bisa.Rd | 2 +-
man/bminz.Rd | 5 +-
man/brat.Rd | 2 +-
man/calibrate.Rd | 2 +-
man/cao.Rd | 10 +-
man/chest.Rd | 2 +
man/cqo.Rd | 4 +-
man/cumulative.Rd | 45 +-
man/enzyme.Rd | 10 +-
man/erf.Rd | 7 +-
man/fitted.vlm.Rd | 4 +-
man/fnormUC.Rd | 2 +-
man/fnormal1.Rd | 4 +-
man/gev.Rd | 8 +-
man/grc.Rd | 6 +-
man/lirat.Rd | 6 +-
man/lms.bcg.Rd | 28 +-
man/lms.bcn.Rd | 27 +-
man/lms.yjn.Rd | 29 +-
man/logUC.Rd | 15 +-
man/logff.Rd | 6 +-
man/loglinb2.Rd | 19 +-
man/lqnorm.Rd | 6 +-
man/lvplot.rrvglm.Rd | 4 +-
man/micmen.Rd | 38 +-
man/mix2exp.Rd | 2 +-
man/mix2normal1.Rd | 16 +-
man/mix2poisson.Rd | 3 +-
man/model.matrixvlm.Rd | 8 +-
man/multinomial.Rd | 59 +-
man/negbinomial.Rd | 77 +-
man/normal1.Rd | 2 +-
man/notdocumentedyet.Rd | 5 +-
man/nzc.Rd | 15 +-
man/persp.qrrvglm.Rd | 12 +-
man/plotvgam.control.Rd | 15 +-
man/poissonff.Rd | 17 +-
man/posbinomUC.Rd | 7 +-
man/posnegbinUC.Rd | 118 ++
man/posnegbinomial.Rd | 31 +-
man/posnormUC.Rd | 14 +-
man/posnormal1.Rd | 10 +-
man/pospoisUC.Rd | 4 +-
man/pospoisson.Rd | 2 +-
man/riceUC.Rd | 2 +-
man/riceff.Rd | 4 +-
man/rposnegbin.Rd | 85 --
man/rrvglm-class.Rd | 12 +
man/rrvglm.Rd | 6 +-
man/rrvglm.control.Rd | 44 +-
man/ruge.Rd | 9 +-
man/s.Rd | 9 +-
man/skellam.Rd | 14 +-
man/skellamUC.Rd | 3 +-
man/tikuv.Rd | 3 +-
man/trplot.qrrvglm.Rd | 6 +-
man/undocumented-methods.Rd | 7 +
man/uqo.Rd | 2 +-
man/vgam-class.Rd | 21 +-
man/vgam.Rd | 17 +-
man/vglm-class.Rd | 12 +
man/vglm.Rd | 15 +-
man/vonmises.Rd | 12 +-
man/vsmooth.spline.Rd | 4 +-
man/wffc.P2star.Rd | 71 +
man/wffc.Rd | 184 +++
man/wffc.indiv.Rd | 49 +
man/wffc.nc.Rd | 52 +
man/wffc.teams.Rd | 44 +
man/zanegbinUC.Rd | 79 +
man/zanegbinomial.Rd | 32 +-
man/zapoisUC.Rd | 77 +
man/zapoisson.Rd | 14 +-
man/zibinomUC.Rd | 2 +-
man/{zinbUC.Rd => zinegbinUC.Rd} | 44 +-
man/zinegbinomial.Rd | 10 +-
man/zipebcom.Rd | 9 +-
man/zipfUC.Rd | 2 +-
man/zipoisUC.Rd | 10 +-
man/zipoisson.Rd | 10 +-
src/fgam.f | 12 +-
src/lerchphi.c | 5 +-
src/lms.f | 36 +-
src/rgam.f | 212 +--
src/testf90.f90 | 20 +
src/tyeepolygamma.f | 25 +
src/vgam.f | 1080 +++++++-------
184 files changed, 8482 insertions(+), 2354 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index bb043a1..0f6845b 100755
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,10 +1,10 @@
Package: VGAM
-Version: 0.7-7
-Date: 2008-05-14
+Version: 0.7-8
+Date: 2009-02-05
Title: Vector Generalized Linear and Additive Models
Author: Thomas W. Yee <t.yee at auckland.ac.nz>
Maintainer: Thomas Yee <t.yee at auckland.ac.nz>
-Depends: R (>= 2.4.0), splines, methods, stats, stats4
+Depends: R (>= 2.5.0), splines, methods, stats, stats4
Description: Vector generalized linear and additive models, and
associated models (Reduced-Rank VGLMs, Quadratic RR-VGLMs,
Reduced-Rank VGAMs). This package fits many models and
@@ -15,4 +15,4 @@ License: GPL-2
URL: http://www.stat.auckland.ac.nz/~yee/VGAM
LazyLoad: yes
LazyData: yes
-Packaged: Wed May 14 11:18:25 2008; yee
+Packaged: Thu Feb 5 13:51:42 2009; yee
diff --git a/NAMESPACE b/NAMESPACE
index d34113f..686ac9f 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -70,6 +70,7 @@ dinv.gaussian, pinv.gaussian, rinv.gaussian, wald, expexp1, expexp)
export(A1A2A3, a2m, AAaa.nohw,
+AICvlm, AICvgam, AICrrvglm,
anova.vgam,
anova.vglm,
beta4,
@@ -166,7 +167,7 @@ vglm.multinomial.deviance.control, vglm.vcategorical.control,
vlm, vlm.control,
vnonlinear.control,
wweights, yeo.johnson,
-zipf, dzipf, pzipf,
+dzipf, pzipf, zipf,
zeta, zetaff,
dzeta)
@@ -175,11 +176,18 @@ export(lm2vlm.model.matrix)
- importFrom(stats, model.matrix)
- importFrom(stats, model.frame)
- importFrom(stats, terms)
+ importFrom("stats", model.matrix)
+ importFrom("stats", model.frame)
+ importFrom("stats", terms)
+ importFrom("stats", "coef")
+ importFrom("stats", "logLik")
+ importFrom("graphics", "plot")
+ importFrom("stats", "vcov")
+
+ importFrom("stats", "AIC")
+
@@ -199,7 +207,8 @@ export(dgpd, pgpd, qgpd, rgpd, gpd)
export(dgev, pgev, qgev, rgev, gev, egev)
export(dlaplace, plaplace, qlaplace, rlaplace, laplace)
export(dalaplace, palaplace, qalaplace, ralaplace,
- alaplace1, alaplace2, alaplace3)
+ alaplace1.control,
+ alaplace1, alaplace2, alaplace3)
export(dcard, pcard, qcard, rcard, cardioid)
export(fff, fff.control,
mbesselI0,
@@ -213,8 +222,9 @@ dbetageom, pbetageom, rbetageom, betageometric,
betaprime,
betaII,
zipebcom,
-binom2.or, dbinom2.or, rbinom2.or,
-binom2.rho, binomialff, biplot.rrvglm, brat,
+binom2.or, dbinom2.or, rbinom2.or,
+binom2.rho, dbinom2.rho, rbinom2.rho,
+binomialff, biplot.rrvglm, brat,
bratt, Brat, calibrate.qrrvglm.control, calibrate.qrrvglm,
calibrate, cao.control,
cao, ccoef, cdf.lmscreg, cgo, chisq, clo,
@@ -233,6 +243,7 @@ export(dggamma, pggamma, qggamma, rggamma)
export(
+dbenf, pbenf, qbenf, rbenf,
genbetaII, genpoisson, geometric,
dlino, plino, qlino, rlino, lino,
grc,
@@ -254,17 +265,15 @@ export(
meplot, meplot.default, meplot.vlm,
guplot, guplot.default, guplot.vlm,
negbinomial, normal1, tobit, Opt,
-dzinb, pzinb, qzinb, rzinb, zinegbinomial,
persp.qrrvglm, plotdeplot.lmscreg, plotqrrvglm, plotqtplot.lmscreg,
plotvgam.control, plotvgam,
cenpoisson,
poissonff,
-dposnorm, pposnorm, qposnorm, rposnorm, posnormal1,
dposbinom, pposbinom, qposbinom, rposbinom, posbinomial,
-posnegbinomial,
+dposnegbin, pposnegbin, qposnegbin, rposnegbin, posnegbinomial,
+dposnorm, pposnorm, qposnorm, rposnorm, posnormal1,
dpospois, ppospois, qpospois, rpospois, pospoisson,
-qtplot.lmscreg, quasibinomialff, quasipoissonff, rdiric,
-rig, rposnegbin,
+qtplot.lmscreg, quasibinomialff, quasipoissonff, rdiric, rig,
rrar, rrvglm.control,
rrvglm.optim.control)
@@ -278,17 +287,23 @@ qrrvglm.control,
uqo.control, uqo,
vgam.control, vgam, vglm.control, vglm,
vsmooth.spline,
-weibull, yip88, zanegbinomial, zapoisson,
+weibull, yip88,
+dzanegbin, pzanegbin, qzanegbin, rzanegbin, zanegbinomial,
+dzapois, pzapois, qzapois, rzapois, zapoisson,
+dzibinom, pzibinom, qzibinom, rzibinom, zibinomial,
+dzinegbin, pzinegbin, qzinegbin, rzinegbin, zinegbinomial,
dzipois, pzipois, qzipois, rzipois, zipoisson,
mix2exp, mix2normal1, mix2poisson,
mix2exp.control, mix2normal1.control, mix2poisson.control,
skewnormal1, dsnorm, rsnorm,
-tikuv, dtikuv, ptikuv, qtikuv, rtikuv,
-dzibinom, pzibinom, qzibinom, rzibinom, zibinomial)
+tikuv, dtikuv, ptikuv, qtikuv, rtikuv)
+export(DeLury,
+ wffc.P1, wffc.P1star, wffc.P2, wffc.P2star
+)
exportClasses("vglmff", "vlm", "vglm", "vgam",
@@ -316,6 +331,7 @@ exportMethods(
"terms",
"model.frame",
"model.matrix",
+"AIC",
"deviance", "logLik", "vcov",
"calibrate", "cdf", "ccoef", "df.residual",
"lv", "Max", "Opt", "Tol",
diff --git a/NEWS b/NEWS
index 4fc85e2..7e96c2d 100755
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,65 @@
**************************************************
+ CHANGES IN VGAM VERSION 0.7-8
+
+NEW FEATURES
+
+ o [dpqr]benf() written for Benford's distribution.
+ o plog() and dlog() improved.
+ o multinomial() now has a refLevel argument to specify the
+ reference or baseline level of the factor.
+ o binom2.or() has a new argument 'morerobust'.
+ o Renamed arguments in mix2normal1().
+ o DeLury() written.
+ o [dpqr]-type functions related to the negative binomial distribution
+ have changed wrt argument names and order.
+ o [pq]posnegbin(), [dpqr]zapois(), [dr]zanegbin() written.
+ o [dpqr]zinb() renamed to [dpqr]zinegbin().
+ o lms.bcn(), lms.bcg(), lms.yjn() have zero=c(1,3) as the new default.
+ This will increase the chances of successive convergence.
+ o Renamed arguments in lms.bcn(), lms.bcg(), lms.yjn(), e.g.,
+ link.sigma is now lsigma.
+ Some new arguments added too, e.g., llambda.
+ o Works for R 2.5.0 and later (not 2.4.0 and later).
+ Compatible with R 2.7.2.
+ o Contains Fortran 90 code (since 0.7-7, actually). This will
+ cause problems on older Linux machines without such a
+ compiler. Actually, removing the .f90 file(s) will not be too
+ much of a problem as there is very little F90 code in use by
+ the package at the moment.
+ o New functions: dbinom2.rho(), rbinom2.rho(), dposnegbin(),
+ o New data: wffc, wffc.indiv, wffc.teams, wffc.nc.
+ o Improved functions: binom2.rho(), micmen(), negbinomial(),
+ poissonff(), posnegbinomial(), zanegbinomial(),
+ o A new form2 argument has been added to vglm().
+ VGAM family functions such as micmen() have the regressor inputted
+ using form2 now, rather than the regressor argument.
+ The resulting usage is a more elegant.
+ Fitted objects have a few more slots and formulas put in set
+ places on the object.
+ o AIC() methods functions has been modified.
+
+
+BUG FIXES
+
+ o The big bug whereby vgam(... ~ s(x), ... ) did not work under
+ Windows was due to a single array element that was not initialized.
+ Evidently, Linux compilers seemed to have set it to zero.
+ Funny, the code has worked for decade or so...
+ o dposbinom() was buggy at x=0. Also it now handles size=0 and
+ prob=0 or prob=1.
+ o pzipois() was buggy at x<0.
+ o dbetabin.ab(log=T) was incorrect outside its support.
+ o zipf() did not handle 0 < s < 1.
+ o data(ruge) was faulty.
+ o summary(rrvglmObject) failed.
+ o persp.cao(ylim=) did not work.
+ o plotvgam() failed when se=TRUE and which.cf was specified.
+
+
+
+
CHANGES IN VGAM VERSION 0.7-7
NEW FEATURES
diff --git a/R/aamethods.q b/R/aamethods.q
index f735ecc..9f054e1 100644
--- a/R/aamethods.q
+++ b/R/aamethods.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -166,6 +166,7 @@ if(is.R())
setClass("vlm", representation(
"assign" = "list",
"call" = "call",
+ "callXm2" = "call",
"coefficients" = if(is.R()) "numeric" else "named",
"constraints" = "list",
"contrasts" = "list",
@@ -192,6 +193,8 @@ setClass("vlm", representation(
"terms" = "list",
"weights" = "matrix",
"x" = if(is.R()) "matrix" else "model.matrix",
+ "Xm2" = if(is.R()) "matrix" else "model.matrix",
+ "Ym2" = if(is.R()) "matrix" else "model.matrix",
"xlevels" = "list",
"y" = "matrix")
) else
@@ -318,6 +321,8 @@ prototype(anova=data.frame())) else
"terms" = "list",
"weights" = "matrix",
"x" = if(is.R()) "matrix" else "model.matrix",
+ "Xm2" = if(is.R()) "matrix" else "model.matrix",
+ "Ym2" = if(is.R()) "matrix" else "model.matrix",
"xlevels" = "list",
"y" = "matrix")
)
@@ -392,60 +397,6 @@ setGeneric("Coefficients", function(object, ...)
-if(FALSE) {
-
-if(!isGeneric("AIC"))
- setGeneric("AIC", function(object, ..., k=2) standardGeneric("AIC"),
- package="VGAM")
-
-AIC.vlm = function(object, ..., k=2) {
- ed = object at misc$estimated.dispersion
- no.dpar = if(length(ed) && is.logical(ed) && ed)
- length(object at misc$dispersion) else 0
- -2 * logLik(object, ...) + k * (length(coef(object)) + no.dpar)
-}
-
-AIC.vgam = function(object, ..., k=2) {
- ed = object at misc$estimated.dispersion
- no.dpar = if(length(ed) && is.logical(ed) && ed)
- length(object at misc$dispersion) else 0
- nldf = if(is.Numeric(object at nl.df)) sum(object at nl.df) else 0
- -2 * logLik(object, ...) + k * (length(coef(object)) + no.dpar + nldf)
-}
-
-AIC.rrvglm = function(object, ..., k=2) {
- ed = object at misc$estimated.dispersion
- no.dpar = if(length(ed) && is.logical(ed) && ed)
- length(object at misc$dispersion) else 0
- elts.tildeA = (object at misc$M - object at control$Rank) * object at control$Rank
- -2 * logLik(object, ...) + k * (length(coef(object)) + no.dpar + elts.tildeA)
-}
-
-AIC.qrrgvlm = function(object, ..., k=2) {
- stop("this function not written yet")
-}
-
-setMethod("AIC", "vlm",
- function(object, ..., k=2)
- AIC.vlm(object, ..., k=k))
-
-setMethod("AIC", "vglm",
- function(object, ..., k=2)
- AIC.vlm(object, ..., k=k))
-
-setMethod("AIC", "vgam",
- function(object, ..., k=2)
- AIC.vgam(object, ..., k=k))
-
-setMethod("AIC", "rrvglm",
- function(object, ..., k=2)
- AIC.rrvglm(object, ..., k=k))
-
-setMethod("AIC", "qrrvglm",
- function(object, ..., k=2)
- AIC.qrrvglm(object, ..., k=k))
-}
-
if(!isGeneric("logLik"))
setGeneric("logLik", function(object, ...) standardGeneric("logLik"),
package="VGAM")
@@ -562,5 +513,17 @@ if(!isGeneric("weights"))
+if(!isGeneric("AIC"))
+ setGeneric("AIC", function(object, ..., k=2) standardGeneric("AIC"),
+ package="VGAM")
+
+
+
+
+
+
+
+
+
diff --git a/R/add1.vglm.q b/R/add1.vglm.q
index 4162d6d..14ac247 100644
--- a/R/add1.vglm.q
+++ b/R/add1.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/attrassign.R b/R/attrassign.R
index d568440..d80e1c0 100644
--- a/R/attrassign.R
+++ b/R/attrassign.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/bAIC.q b/R/bAIC.q
new file mode 100644
index 0000000..152bbf2
--- /dev/null
+++ b/R/bAIC.q
@@ -0,0 +1,110 @@
+# These functions are
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
+
+
+
+
+
+
+
+
+if(TRUE) {
+
+
+AICvlm = function(object, ..., k=2) {
+ estdisp = object at misc$estimated.dispersion
+ no.dpar = if(length(estdisp) && is.logical(estdisp) && estdisp)
+ length(object at misc$dispersion) else 0
+ -2 * logLik.vlm(object, ...) + k * (length(coefvlm(object)) + no.dpar)
+}
+
+AICvgam = function(object, ..., k=2) {
+ estdisp = object at misc$estimated.dispersion
+ no.dpar = if(length(estdisp) && is.logical(estdisp) && estdisp)
+ length(object at misc$dispersion) else 0
+ nldf = if(is.Numeric(object at nl.df)) sum(object at nl.df) else 0
+ -2 * logLik.vlm(object, ...) + k * (length(coefvlm(object)) + no.dpar + nldf)
+}
+
+AICrrvglm = function(object, ..., k=2) {
+ estdisp = object at misc$estimated.dispersion
+ no.dpar = if(length(estdisp) && is.logical(estdisp) && estdisp)
+ length(object at misc$dispersion) else 0
+ elts.tildeA = (object at misc$M - object at control$Rank) * object at control$Rank
+ -2 * logLik.vlm(object, ...) + k * (length(coefvlm(object)) +
+ no.dpar + elts.tildeA)
+}
+
+AICqrrgvlm = function(object, ..., k=2) {
+ stop("this function not written yet")
+}
+
+setMethod("AIC", "vlm",
+ function(object, ..., k=2)
+ AICvlm(object, ..., k=k))
+
+setMethod("AIC", "vglm",
+ function(object, ..., k=2)
+ AICvlm(object, ..., k=k))
+
+setMethod("AIC", "vgam",
+ function(object, ..., k=2)
+ AICvgam(object, ..., k=k))
+
+setMethod("AIC", "rrvglm",
+ function(object, ..., k=2)
+ AICrrvglm(object, ..., k=k))
+
+setMethod("AIC", "qrrvglm",
+ function(object, ..., k=2)
+ AICqrrvglm(object, ..., k=k))
+}
+
+
+if(FALSE) {
+
+
+
+AICvglm = function(object, ..., k=2) {
+ crit = logLik.vlm(object, ...)
+ -2 * crit + k * length(coef(object))
+}
+
+
+
+
+
+AICrrvglm = function(object, ..., k=2) {
+ stop("not working yet")
+ crit = logLik.vlm(object)
+ sign = -2
+ if(!length(crit) || !is.numeric(crit)) {
+ crit = deviance(object)
+ sign = 1
+ }
+ if(!length(crit) || !is.numeric(crit))
+ stop("can't get at the deviance or loglikelihood of the object")
+
+ sign * crit + 2 * (length(coef(object)) +
+ object at control$rank * (object at misc$M - object at control$rank))
+}
+
+
+
+ # setGeneric("AIC", function(object, ..., k = 2) standardGeneric("AIC"))
+
+setMethod("AIC", signature(object="vglm"),
+ function(object, ..., k=2)
+ AICvglm(object, ..., k=k))
+
+
+
+setMethod("AIC", signature(object="rrvglm"),
+ function(object, ..., k=2)
+ AICrrvglm(object, ..., k=k))
+
+
+}
+
+
+
diff --git a/R/build.terms.vlm.q b/R/build.terms.vlm.q
index 9439027..4551040 100644
--- a/R/build.terms.vlm.q
+++ b/R/build.terms.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/calibrate.q b/R/calibrate.q
index 9bebf9e..cff6e66 100644
--- a/R/calibrate.q
+++ b/R/calibrate.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/cao.R b/R/cao.R
index 686277e..d88d900 100644
--- a/R/cao.R
+++ b/R/cao.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/cao.fit.q b/R/cao.fit.q
index 0001107..cc03a18 100644
--- a/R/cao.fit.q
+++ b/R/cao.fit.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -1633,7 +1633,7 @@ persp.cao = function(x,
MSratio = M / NOS # First value is g(mean) = quadratic form in lv
xlim = if(length(xlim)) xlim else range(coefobj at lv[,1])
- if(!length(ylim)) {
+ if(!length(ylim.orig <- ylim)) {
ylim = if(Rank==1) c(0, max(fvmat)*stretch) else range(coefobj at lv[,2])
}
xlim = rep(xlim, length=2)
@@ -1668,7 +1668,8 @@ persp.cao = function(x,
if(Rank==1) {
if(plot.it) {
- ylim = c(0, max(fitvals[,whichSpecies.numer])*stretch) # A revision
+ if(!length(ylim.orig))
+ ylim = c(0, max(fitvals[,whichSpecies.numer])*stretch) # A revision
col = rep(col, len=length(whichSpecies.numer))
lty = rep(lty, len=length(whichSpecies.numer))
lwd = rep(lwd, len=length(whichSpecies.numer))
diff --git a/R/coef.vlm.q b/R/coef.vlm.q
index 5df7239..ac16497 100644
--- a/R/coef.vlm.q
+++ b/R/coef.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -166,15 +166,15 @@ Coef.vlm <- function(object, ...) {
object at misc$intercept.only &&
trivial.constraints(object at constraints)) {
- answer = eta2theta(rbind(coef(object)),
- link=object at misc$link,
- earg=object at misc$earg)
+ answer = eta2theta(rbind(coefvlm(object)),
+ link = object at misc$link,
+ earg = object at misc$earg)
answer = c(answer)
if(length(ntmp2 <- names(tmp2)) == object at misc$M)
names(answer) = ntmp2
answer
} else {
- coef(object, ... )
+ coefvlm(object, ... )
}
}
diff --git a/R/cqo.R b/R/cqo.R
index f343d6c..aef3edc 100644
--- a/R/cqo.R
+++ b/R/cqo.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
cqo <- function(formula,
diff --git a/R/cqo.fit.q b/R/cqo.fit.q
index 60892e1..7531f3b 100644
--- a/R/cqo.fit.q
+++ b/R/cqo.fit.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/deviance.vlm.q b/R/deviance.vlm.q
index 646218e..67e3e9b 100644
--- a/R/deviance.vlm.q
+++ b/R/deviance.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/effects.vglm.q b/R/effects.vglm.q
index f6af963..cf930f8 100644
--- a/R/effects.vglm.q
+++ b/R/effects.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.aunivariate.q b/R/family.aunivariate.q
index 25a2457..934c648 100644
--- a/R/family.aunivariate.q
+++ b/R/family.aunivariate.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -336,26 +336,42 @@ riceff = function(lvee="loge", lsigma="loge",
dskellam = function(x, mu1, mu2, log=FALSE) {
- log.arg = log
- rm(log)
+ log.arg = log; rm(log)
if( !is.logical( log.arg ) || length( log.arg )!=1 )
stop("bad input for 'log.arg'")
- if( log.arg ) {
+
+ L = max(length(x), length(mu1), length(mu2))
+ x = rep(x, len=L); mu1 = rep(mu1, len=L); mu2 = rep(mu2, len=L);
+ ok2 <- is.finite(mu1) && is.finite(mu2) & (mu1 >= 0) & (mu2 >= 0)
+ ok3 <- (mu1 == 0) & (mu2 > 0)
+ ok4 <- (mu1 > 0) & (mu2 == 0)
+ ok5 <- (mu1 == 0) & (mu2 == 0)
+ if(log.arg) {
ans = -mu1 - mu2 + 2 * sqrt(mu1*mu2) +
0.5 * x * log(mu1) - 0.5 * x * log(mu2) +
log(besselI(2 * sqrt(mu1*mu2), nu=x, expon=TRUE))
+ ans[ok3] = dpois(x=-x[ok3], lambda=mu2[ok3], log=TRUE)
+ ans[ok4] = dpois(x=-x[ok4], lambda=mu1[ok4], log=TRUE)
+ ans[ok5] = dpois(x= x[ok5], lambda=0.0, log=TRUE)
+ ans[x != round(x)] = log(0.0)
} else {
ans = (mu1/mu2)^(x/2) * exp(-mu1-mu2 + 2 * sqrt(mu1*mu2)) *
besselI(2 * sqrt(mu1*mu2), nu=x, expon=TRUE)
+ ans[ok3] = dpois(x=-x[ok3], lambda=mu2[ok3])
+ ans[ok4] = dpois(x=-x[ok4], lambda=mu1[ok4])
+ ans[ok5] = dpois(x= x[ok5], lambda=0.0)
+ ans[x != round(x)] = 0.0
}
- ans[(x != round(x))] = 0
- ans[!is.finite(mu1) | !is.finite(mu2) | (mu1 <= 0) | (mu2 <= 0)] = NA
+ ans[!ok2] = NaN
ans
}
+
+
+
+
rskellam = function(n, mu1, mu2) {
- if(!is.Numeric(n, integ=TRUE,allow=1)) stop("bad input for argument \"n\"")
rpois(n, mu1) - rpois(n, mu2)
}
@@ -393,7 +409,8 @@ skellam = function(lmu1="loge", lmu2="loge",
"Mean: mu1-mu2", "\n",
"Variance: mu1+mu2"),
constraints=eval(substitute(expression({
- constraints = cm.vgam(matrix(1,M,1), x, .parallel, constraints, int= TRUE)
+ constraints = cm.vgam(matrix(1,M,1), x, .parallel, constraints,
+ int=TRUE)
constraints = cm.zero.vgam(constraints, x, .zero, M)
}), list( .parallel=parallel, .zero=zero ))),
initialize=eval(substitute(expression({
@@ -409,8 +426,8 @@ skellam = function(lmu1="loge", lmu2="loge",
lm.wfit(x=x, y=y, w=w, method="qr")
var.y.est = sum(w * junk$resid^2) / junk$df.residual
mean.init = weighted.mean(y, w)
- mu1.init = max((var.y.est + mean.init) / 2, 0.01)
- mu2.init = max((var.y.est - mean.init) / 2, 0.01)
+ mu1.init = max((var.y.est + mean.init)/2, 0.01)
+ mu2.init = max((var.y.est - mean.init)/2, 0.01)
mu1.init = rep(if(length( .imu1)) .imu1 else mu1.init, length=n)
mu2.init = rep(if(length( .imu2)) .imu2 else mu2.init, length=n)
etastart = cbind(theta2eta(mu1.init, .lmu1, earg= .emu1),
@@ -440,9 +457,10 @@ skellam = function(lmu1="loge", lmu2="loge",
if( is.logical( .parallel ) && length( .parallel )==1 &&
.parallel )
sum(w * log(besselI(2*mu1, nu=y, expon=TRUE))) else
- sum(w * (-mu1 - mu2 + 2 * sqrt(mu1*mu2) +
+ sum(w * (-mu1 - mu2 +
0.5 * y * log(mu1) -
0.5 * y * log(mu2) +
+ 2 * sqrt(mu1*mu2) + # Use this when expon=TRUE
log(besselI(2 * sqrt(mu1*mu2), nu=y, expon=TRUE))))
}
}, list( .lmu1=lmu1, .lmu2=lmu2,
@@ -805,4 +823,266 @@ slash = function(lmu="identity", lsigma="loge", emu=list(), esigma=list(),
+dnefghs = function(x, tau) {
+ ans = sin(pi*tau) * exp((1-tau)*x) / (pi*(1+exp(x)))
+ ans[(tau < 0) | (tau > 1)] = NA
+ ans
+}
+
+
+
+nefghs = function(link="logit", earg=list(), itau=NULL, method.init=1)
+{
+ if(length(itau) && !is.Numeric(itau, positi=TRUE) || any(itau >= 1))
+ stop("argument \"itau\" must be in (0,1)")
+ if(mode(link) != "character" && mode(link) != "name")
+ link = as.character(substitute(link))
+ if(!is.list(earg)) earg = list()
+ if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
+ method.init > 2)
+ stop("'method.init' must be 1 or 2")
+
+ new("vglmff",
+ blurb=c("Natural exponential family generalized hyperbolic ",
+ "secant distribution\n",
+ "f(y) = sin(pi*tau)*exp((1-tau)*y)/(pi*(1+exp(y))\n\n",
+ "Link: ",
+ namesof("tau", link, earg=earg), "\n\n",
+ "Mean: pi / tan(pi * tau)\n"),
+ initialize=eval(substitute(expression({
+ if(ncol(cbind(y)) != 1)
+ stop("response must be a vector or a one-column matrix")
+ predictors.names = namesof("tau", .link, earg=.earg, tag=FALSE)
+
+ if(!length(etastart)) {
+ wmeany = if( .method.init == 1) weighted.mean(y,w) else
+ median(rep(y,w))
+ if(abs(wmeany) < 0.01) wmeany = 0.01
+ tau.init = atan(pi / wmeany) / pi + 0.5
+ tau.init[tau.init < 0.03] = 0.03
+ tau.init[tau.init > 0.97] = 0.97
+ tau.init = rep( if(length( .itau )) .itau else tau.init, len=n)
+ etastart = theta2eta(tau.init, .link, earg=.earg)
+ }
+ }), list( .link=link, .earg=earg, .itau=itau, .method.init=method.init ))),
+ inverse=eval(substitute(function(eta, extra=NULL) {
+ tau = eta2theta(eta, .link, earg=.earg)
+ pi / tan(pi * tau)
+ }, list( .link=link, .earg=earg ))),
+ last=eval(substitute(expression({
+ misc$link = c(tau= .link)
+ misc$earg = list(tau = .earg)
+ misc$expected = TRUE
+ misc$method.init= .method.init
+ }), list( .link=link, .earg=earg, .method.init=method.init ))),
+ loglikelihood=eval(substitute(
+ function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
+ tau = eta2theta(eta, .link, earg=.earg)
+ if(residuals) stop("loglikelihood residuals not implemented yet") else
+ sum(w * (log(sin(pi*tau)) - log(pi) + (1-tau)*y - log1p(exp(y))) )
+ }, list( .link=link, .earg=earg ))),
+ vfamily=c("nefghs"),
+ deriv=eval(substitute(expression({
+ tau = eta2theta(eta, .link, earg=.earg)
+ dl.dtau = pi / tan(pi * tau) - y
+ dtau.deta = dtheta.deta(tau, .link, earg=.earg)
+ w * dl.dtau * dtau.deta
+ }), list( .link=link, .earg=earg ))),
+ weight = eval(substitute(expression({
+ d2l.dtau2 = (pi / sin(pi * tau))^2
+ wz = d2l.dtau2 * dtau.deta^2
+ w * wz
+ }), list( .link = link ))))
+}
+
+
+
+
+logF = function(lshape1="loge", lshape2="loge",
+ eshape1=list(), eshape2=list(),
+ ishape1=NULL, ishape2=1,
+ method.init=1)
+{
+ if(length(ishape1) && !is.Numeric(ishape1, positi=TRUE))
+ stop("argument \"ishape1\" must be positive")
+ if( # length(ishape2) &&
+ !is.Numeric(ishape2, positi=TRUE))
+ stop("argument \"ishape2\" must be positive")
+ if(mode(lshape1) != "character" && mode(lshape1) != "name")
+ lshape1 = as.character(substitute(lshape1))
+ if(mode(lshape2) != "character" && mode(lshape2) != "name")
+ lshape2 = as.character(substitute(lshape2))
+ if(!is.list(eshape1)) eshape1 = list()
+ if(!is.list(eshape2)) eshape2 = list()
+ if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
+ method.init > 2)
+ stop("'method.init' must be 1 or 2")
+
+ new("vglmff",
+ blurb=c("log F distribution\n",
+ "f(y) = exp(-shape2*y)/(beta(shape1,shape2)*",
+ "(1+exp(-y))^(shape1+shape2))\n\n",
+ "Link: ",
+ namesof("shape1", lshape1, earg=eshape1),
+ ", ",
+ namesof("shape2", lshape2, earg=eshape2),
+ "\n\n",
+ "Mean: digamma(shape1) - digamma(shape2)"),
+ initialize=eval(substitute(expression({
+ if(ncol(cbind(y)) != 1)
+ stop("response must be a vector or a one-column matrix")
+ predictors.names = c(
+ namesof("shape1", .lshape1, earg=.eshape1, tag=FALSE),
+ namesof("shape2", .lshape2, earg=.eshape2, tag=FALSE))
+
+ if(!length(etastart)) {
+ wmeany = if( .method.init == 1) weighted.mean(y,w) else
+ median(rep(y,w))
+
+
+ shape1.init = shape2.init = rep( .ishape2, len=n)
+ shape1.init = if(length( .ishape1)) rep( .ishape1, len=n) else {
+ index1 = (y > wmeany)
+ shape1.init[index1] = shape2.init[index1] + 1/1
+ shape1.init[!index1] = shape2.init[!index1] - 1/1
+ shape1.init = pmax(shape1.init, 1/8)
+ shape1.init
+ }
+ etastart = cbind(theta2eta(shape1.init, .lshape1, earg=.eshape1),
+ theta2eta(shape2.init, .lshape2, earg=.eshape2))
+ }
+ }), list( .lshape1=lshape1, .lshape2=lshape2,
+ .eshape1=eshape1, .eshape2=eshape2,
+ .ishape1=ishape1, .ishape2=ishape2,
+ .method.init=method.init ))),
+ inverse=eval(substitute(function(eta, extra=NULL) {
+ shape1 = eta2theta(eta[,1], .lshape1, earg=.eshape1)
+ shape2 = eta2theta(eta[,2], .lshape2, earg=.eshape2)
+ digamma(shape1) - digamma(shape2)
+ }, list( .lshape1=lshape1, .lshape2=lshape2,
+ .eshape1=eshape1, .eshape2=eshape2 ))),
+ last=eval(substitute(expression({
+ misc$link = c(shape1= .lshape1, shape2= .lshape2)
+ misc$earg = list(shape1= .eshape1, shape2= .eshape2)
+ misc$expected = TRUE
+ misc$method.init= .method.init
+ }), list( .lshape1=lshape1, .lshape2=lshape2,
+ .eshape1=eshape1, .eshape2=eshape2,
+ .method.init=method.init ))),
+ loglikelihood=eval(substitute(
+ function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
+ shape1 = eta2theta(eta[,1], .lshape1, earg=.eshape1)
+ shape2 = eta2theta(eta[,2], .lshape2, earg=.eshape2)
+ if(residuals) stop("loglikelihood residuals not implemented yet") else
+ sum(w * (-shape2*y - lbeta(shape1, shape2) -
+ (shape1 + shape2) * log1p(exp(-y))) )
+ }, list( .lshape1=lshape1, .lshape2=lshape2,
+ .eshape1=eshape1, .eshape2=eshape2 ))),
+ vfamily=c("logF"),
+ deriv=eval(substitute(expression({
+ shape1 = eta2theta(eta[,1], .lshape1, earg=.eshape1)
+ shape2 = eta2theta(eta[,2], .lshape2, earg=.eshape2)
+ tmp888 = digamma(shape1 + shape2) - log1p(exp(-y))
+ dl.dshape1 = tmp888 - digamma(shape1)
+ dl.dshape2 = tmp888 - digamma(shape2) - y
+ dshape1.deta = dtheta.deta(shape1, .lshape1, earg=.eshape1)
+ dshape2.deta = dtheta.deta(shape2, .lshape2, earg=.eshape2)
+ w * cbind(dl.dshape1 * dshape1.deta, dl.dshape2 * dshape2.deta)
+ }), list( .lshape1=lshape1, .lshape2=lshape2,
+ .eshape1=eshape1, .eshape2=eshape2 ))),
+ weight = eval(substitute(expression({
+ tmp888 = trigamma(shape1 + shape2)
+ d2l.dshape12 = trigamma(shape1) - tmp888
+ d2l.dshape22 = trigamma(shape2) - tmp888
+ d2l.dshape1shape2 = -tmp888
+ wz = matrix(0, n, dimm(M))
+ wz[,iam(1,1,M=M)] = d2l.dshape12 * dshape1.deta^2
+ wz[,iam(2,2,M=M)] = d2l.dshape22 * dshape2.deta^2
+ wz[,iam(1,2,M=M)] = d2l.dshape1shape2 * dshape1.deta * dshape2.deta
+ w * wz
+ }), list( .lshape1=lshape1, .lshape2=lshape2,
+ .eshape1=eshape1, .eshape2=eshape2 ))))
+}
+
+
+dbenf = function(x, ndigits=1, log=FALSE) {
+ if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+ stop("argument 'ndigits' must be 1 or 2")
+ lowerlimit = ifelse(ndigits==1, 1, 10)
+ upperlimit = ifelse(ndigits==1, 9, 99)
+ log.arg = log; rm(log)
+ ans = x * NA
+ indexTF = is.finite(x) & (x >= lowerlimit)
+ ans[indexTF] = log10(1 + 1/x[indexTF])
+ ans[!is.na(x) & !is.nan(x) & ((x < lowerlimit) |
+ (x > upperlimit) |
+ (x != round(x)))] = 0.0
+ if(log.arg) log(ans) else ans
+}
+
+
+rbenf = function(n, ndigits=1) {
+ if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+ stop("argument 'ndigits' must be 1 or 2")
+ lowerlimit = ifelse(ndigits==1, 1, 10)
+ upperlimit = ifelse(ndigits==1, 9, 99)
+ use.n = if((length.n <- length(n)) > 1) length.n else
+ if(!is.Numeric(n, integ=TRUE, allow=1))
+ stop("bad input for argument \"n\"") else n
+ myrunif = runif(use.n)
+ ans = rep(lowerlimit, length = use.n)
+ for(ii in (lowerlimit+1):upperlimit) {
+ indexTF = (pbenf(ii-1, ndigits=ndigits) < myrunif) &
+ (myrunif <= pbenf(ii, ndigits=ndigits))
+ ans[indexTF] = ii
+ }
+ ans
+}
+
+
+pbenf = function(q, ndigits=1, log.p=FALSE) {
+ if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+ stop("argument 'ndigits' must be 1 or 2")
+ lowerlimit = ifelse(ndigits==1, 1, 10)
+ upperlimit = ifelse(ndigits==1, 9, 99)
+ ans = q * NA
+ floorq = floor(q)
+ indexTF = is.finite(q) & (floorq >= lowerlimit)
+ ans[indexTF] = log10(1 + floorq[indexTF]) - ifelse(ndigits==1, 0, 1)
+ ans[!is.na(q) & !is.nan(q) & (q>=upperlimit)] = 1
+ ans[!is.na(q) & !is.nan(q) & (q< lowerlimit)] = 0
+ if(log.p) log(ans) else ans
+}
+
+
+
+
+qbenf = function(p, ndigits=1) {
+ if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+ stop("argument 'ndigits' must be 1 or 2")
+ lowerlimit = ifelse(ndigits==1, 1, 10)
+ upperlimit = ifelse(ndigits==1, 9, 99)
+ bad = !is.na(p) & !is.nan(p) & ((p < 0) | (p > 1))
+ if(any(bad))
+ stop("bad input for 'p'")
+
+ ans = rep(lowerlimit, length = length(p))
+ for(ii in (lowerlimit+1):upperlimit) {
+ indexTF = is.finite(p) &
+ (pbenf(ii-1, ndigits=ndigits) < p) &
+ (p <= pbenf(ii, ndigits=ndigits))
+ ans[indexTF] = ii
+ }
+
+ ans[is.na(p) | is.nan(p)] = NA
+ ans[!is.na(p) & !is.nan(p) & (p==0)] = lowerlimit
+ ans[!is.na(p) & !is.nan(p) & (p==1)] = upperlimit
+ ans
+}
+
+
+
+
+
+
diff --git a/R/family.basics.q b/R/family.basics.q
index 3b07bec..afaa560 100644
--- a/R/family.basics.q
+++ b/R/family.basics.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.binomial.q b/R/family.binomial.q
index 5a4e408..18d3e9e 100644
--- a/R/family.binomial.q
+++ b/R/family.binomial.q
@@ -1,13 +1,12 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
process.binomial2.data.vgam <- expression({
- if(!is.matrix(y))
- {
+ if(!is.matrix(y)) {
yf <- as.factor(y)
lev <- levels(yf)
llev <- length(lev)
@@ -19,9 +18,7 @@ process.binomial2.data.vgam <- expression({
colnamesy <- paste(lev, ":", c("00","01","10","11"), sep="")
dimnames(y) <- list(names(yf), colnamesy)
input.type <- 1
- } else
- if(ncol(y)==2)
- {
+ } else if(ncol(y)==2) {
if(!all(y==0 | y==1))
stop("response must contains 0's and 1's only")
col.index <- y[,2] + 2*y[,1] + 1 # 1:4
@@ -30,9 +27,7 @@ process.binomial2.data.vgam <- expression({
y[cbind(1:nn,col.index)] <- 1
dimnames(y) <- list(dimnames(y)[[1]], c("00","01","10","11"))
input.type <- 2
- } else
- if(ncol(y)==4)
- {
+ } else if(ncol(y)==4) {
input.type <- 3
} else
stop("response unrecognized")
@@ -304,7 +299,7 @@ rbinom2.or = function(n, mu1,
binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
emu=list(), emu1=emu, emu2=emu, eoratio=list(),
imu1=NULL, imu2=NULL, ioratio = NULL,
- zero=3, exchangeable=FALSE, tol=0.001)
+ zero=3, exchangeable=FALSE, tol=0.001, morerobust=FALSE)
{
if(mode(lmu) != "character" && mode(lmu) != "name")
lmu = as.character(substitute(lmu))
@@ -387,27 +382,49 @@ binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
}, list( .lmu1=lmu1, .lmu2=lmu2,
.emu1=emu1, .emu2=emu2, .eoratio=eoratio,
.loratio=loratio ))),
- loglikelihood= function(mu, y, w, residuals = FALSE, eta, extra=NULL)
- if(residuals) stop("loglikelihood residuals not implemented yet") else
- sum(w * y * log(mu)),
+ loglikelihood=eval(substitute(
+ function(mu, y, w, residuals = FALSE, eta, extra=NULL) {
+ if(residuals) stop("loglikelihood residuals not implemented yet") else {
+ if( .morerobust) {
+ vsmallno = 1.0e4 * .Machine$double.xmin
+ mu.use = mu
+ mu.use[mu.use < vsmallno] = vsmallno
+ sum(w * y * log(mu.use))
+ } else
+ sum(w * y * log(mu))
+ }
+ }, list( .morerobust=morerobust ))),
vfamily=c("binom2.or", "binom2"),
deriv=eval(substitute(expression({
- pmargin = cbind(mu[,3]+mu[,4], mu[,2]+mu[,4])
- oratio = mu[,4]*mu[,1] / (mu[,2]*mu[,3])
+ smallno = 1.0e4 * .Machine$double.eps
+iii = c(46,55,63)
+iii = c(39)
+iii = 1:n
+ mu.use = mu
+ mu.use[mu.use < smallno] = smallno
+ mu.use[mu.use > 1-smallno] = 1-smallno
+ pmargin = cbind(mu.use[,3]+mu.use[,4], mu.use[,2]+mu.use[,4])
+ pmargin[,1] = pmax(smallno, pmargin[,1])
+ pmargin[,1] = pmin(1-smallno, pmargin[,1])
+ pmargin[,2] = pmax(smallno, pmargin[,2])
+ pmargin[,2] = pmin(1-smallno, pmargin[,2])
+
+ oratio = mu.use[,4]*mu.use[,1] / (mu.use[,2]*mu.use[,3])
+ use.oratio = pmax(smallno, oratio)
a.temp = 1 + (pmargin[,1]+pmargin[,2])*(oratio-1)
b.temp = -4 * oratio * (oratio-1) * pmargin[,1] * pmargin[,2]
temp9 = sqrt(a.temp^2 + b.temp)
coeff12 = -0.5 + (2*oratio*pmargin - a.temp) / (2*temp9)
- dl.dmu1 = coeff12[,2] * (y[,1]/mu[,1]-y[,3]/mu[,3]) -
- (1+coeff12[,2]) * (y[,2]/mu[,2]-y[,4]/mu[,4])
+ dl.dmu1 = coeff12[,2] * (y[,1]/mu.use[,1]-y[,3]/mu.use[,3]) -
+ (1+coeff12[,2]) * (y[,2]/mu.use[,2]-y[,4]/mu.use[,4])
- dl.dmu2 = coeff12[,1] * (y[,1]/mu[,1]-y[,2]/mu[,2]) -
- (1+coeff12[,1]) * (y[,3]/mu[,3]-y[,4]/mu[,4])
+ dl.dmu2 = coeff12[,1] * (y[,1]/mu.use[,1]-y[,2]/mu.use[,2]) -
+ (1+coeff12[,1]) * (y[,3]/mu.use[,3]-y[,4]/mu.use[,4])
- coeff3 = (y[,1]/mu[,1] - y[,2]/mu[,2] - y[,3]/mu[,3] + y[,4]/mu[,4])
- Vab = 1 / (1/mu[,1] + 1/mu[,2] + 1/mu[,3] + 1/mu[,4])
- dp11.doratio = Vab / oratio
+ coeff3 = (y[,1]/mu.use[,1] - y[,2]/mu.use[,2] - y[,3]/mu.use[,3] + y[,4]/mu.use[,4])
+ Vab = pmax(smallno, 1 / (1/mu.use[,1] + 1/mu.use[,2] + 1/mu.use[,3] + 1/mu.use[,4]))
+ dp11.doratio = Vab / use.oratio
dl.doratio = coeff3 * dp11.doratio
w * cbind(dl.dmu1 * dtheta.deta(pmargin[,1], .lmu1, earg= .emu1),
@@ -417,17 +434,18 @@ binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
.emu1=emu1, .emu2=emu2, .eoratio=eoratio,
.loratio=loratio ))),
weight=eval(substitute(expression({
- Deltapi = mu[,3]*mu[,2] - mu[,4]*mu[,1]
- myDelta = mu[,1] * mu[,2] * mu[,3] * mu[,4]
+ Deltapi = mu.use[,3]*mu.use[,2] - mu.use[,4]*mu.use[,1]
+ myDelta = pmax(smallno, mu.use[,1] * mu.use[,2] * mu.use[,3] * mu.use[,4])
pqmargin = pmargin * (1-pmargin)
+ pqmargin[pqmargin < smallno] = smallno
wz = matrix(0, n, 4)
wz[,iam(1,1,M)] = (pqmargin[,2] * Vab / myDelta) *
dtheta.deta(pmargin[,1], .lmu1, earg= .emu1)^2
wz[,iam(2,2,M)] = (pqmargin[,1] * Vab / myDelta) *
dtheta.deta(pmargin[,2], .lmu2, earg= .emu2)^2
- wz[,iam(3,3,M)] = (Vab / oratio^2) *
- dtheta.deta(oratio, .loratio, earg= .eoratio)^2
+ wz[,iam(3,3,M)] = (Vab / use.oratio^2) *
+ dtheta.deta(use.oratio, .loratio, earg= .eoratio)^2
wz[,iam(1,2,M)] = (Vab * Deltapi / myDelta) *
dtheta.deta(pmargin[,1], .lmu1, earg= .emu1) *
dtheta.deta(pmargin[,2], .lmu2, earg= .emu2)
@@ -438,98 +456,246 @@ binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
}
+dbinom2.rho = function(mu1,
+ mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+ rho=0,
+ exchangeable=FALSE,
+ colnames=c("00", "01", "10", "11"),
+ ErrorCheck=TRUE)
+{
+ if(ErrorCheck) {
+ if(!is.Numeric(mu1, positive=TRUE) || max(mu1) >= 1)
+ stop("bad input for argument 'mu1'")
+ if(!is.Numeric(mu2, positive=TRUE) || max(mu2) >= 1)
+ stop("bad input for argument 'mu2'")
+ if(!is.Numeric(rho) || min(rho) <= -1 || max(rho) >= 1)
+ stop("bad input for argument 'rho'")
+ if(exchangeable && max(abs(mu1 - mu2)) > 0.00001)
+ stop("argument 'exchangeable' is TRUE but 'mu1' and 'mu2' differ")
+ }
+
+ n = max(length(mu1), length(mu2), length(rho))
+ rho = rep(rho, len=n)
+ mu1 = rep(mu1, len=n)
+ mu2 = rep(mu2, len=n)
+ eta1 = qnorm(mu1)
+ eta2 = qnorm(mu2)
+ p11 = pnorm2(eta1, eta2, rho)
+ p01 = mu2 - p11
+ p10 = mu1 - p11
+ p00 = 1 - p01 - p10 - p11
+ matrix(c(p00,p01,p10,p11), n, 4, dimnames=list(NULL,colnames))
+}
+
+
+
+rbinom2.rho = function(n, mu1,
+ mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+ rho=0,
+ exchangeable=FALSE,
+ twoCols=TRUE,
+ colnames=if(twoCols) c("y1","y2") else c("00", "01", "10", "11"),
+ ErrorCheck=TRUE)
+{
+ if(ErrorCheck) {
+ if(!is.Numeric(n, integer=TRUE, posit=TRUE, allow=1))
+ stop("bad input for argument 'n'")
+ if(!is.Numeric(mu1, positive=TRUE) || max(mu1) >= 1)
+ stop("bad input for argument 'mu1'")
+ if(!is.Numeric(mu2, positive=TRUE) || max(mu2) >= 1)
+ stop("bad input for argument 'mu2'")
+ if(!is.Numeric(rho) || min(rho) <= -1 || max(rho) >= 1)
+ stop("bad input for argument 'rho'")
+ if(exchangeable && max(abs(mu1 - mu2)) > 0.00001)
+ stop("argument 'exchangeable' is TRUE but 'mu1' and 'mu2' differ")
+ }
+
+ dmat = dbinom2.rho(mu1=mu1, mu2=mu2, rho=rho, exchang=exchangeable,
+ ErrorCheck=ErrorCheck)
+
+ answer = matrix(0, n, 2, dimnames=list(NULL, if(twoCols) colnames else NULL))
+ yy = runif(n)
+ cs1 = dmat[,"00"] + dmat[,"01"]
+ cs2 = cs1 + dmat[,"10"]
+ index = (dmat[,"00"] < yy) & (yy <= cs1)
+ answer[index,2] = 1
+ index = (cs1 < yy) & (yy <= cs2)
+ answer[index,1] = 1
+ index = (yy > cs2)
+ answer[index,] = 1
+ if(twoCols) answer else {
+ answer4 = matrix(0, n, 4, dimnames=list(NULL, colnames))
+ answer4[cbind(1:n, 1 + 2*answer[,1] + answer[,2])] = 1
+ answer4
+ }
+}
+
+
+binom2.rho.control <- function(save.weight=TRUE, ...)
+{
+ list(save.weight=save.weight)
+}
-binom2.rho <- function(lrho="rhobit", erho=list(),
- init.rho=0.4, zero=3, exchangeable=FALSE)
+binom2.rho = function(lrho="rhobit", erho=list(),
+ imu1=NULL, imu2=NULL,
+ init.rho=NULL,
+ zero=3, exchangeable=FALSE, nsimEIM=NULL)
{
if(mode(lrho) != "character" && mode(lrho) != "name")
- lrho <- as.character(substitute(lrho))
+ lrho = as.character(substitute(lrho))
if(!is.list(erho)) erho = list()
+ lmu12 = "probit"
+ emu12 = list()
+ if(is.Numeric(nsimEIM)) {
+ if(!is.Numeric(nsimEIM, allow=1, integ=TRUE))
+ stop("bad input for argument 'nsimEIM'")
+ if(nsimEIM <= 100)
+ warning("'nsimEIM' should be an integer greater than 100")
+ }
new("vglmff",
blurb=c("Bivariate probit model\n",
"Links: ",
- "probit(mu1), probit(mu2); ",
+ namesof("mu1", lmu12, earg= emu12), ", ",
+ namesof("mu2", lmu12, earg= emu12), ", ",
namesof("rho", lrho, earg= erho)),
constraints=eval(substitute(expression({
- constraints <- cm.vgam(matrix(c(1,1,0,0,0,1),3,2), x,
- .exchangeable, constraints, intercept.apply=TRUE)
- constraints <- cm.zero.vgam(constraints, x, .zero, M)
+ constraints = cm.vgam(matrix(c(1,1,0,0,0,1),3,2), x,
+ .exchangeable, constraints, intercept.apply=TRUE)
+ constraints = cm.zero.vgam(constraints, x, .zero, M)
}), list( .exchangeable=exchangeable, .zero=zero ))),
deviance=Deviance.categorical.data.vgam,
initialize=eval(substitute(expression({
eval(process.binomial2.data.vgam)
- predictors.names <- c(
- namesof("mu1", "probit", earg= list(), short=TRUE),
- namesof("mu2", "probit", earg= list(), short=TRUE),
- namesof("rho", .lrho, earg= .erho, short=TRUE))
- if(is.null(etastart))
- etastart <- cbind(theta2eta(mu[,3]+mu[,4], "probit", earg= list()),
- theta2eta(mu[,2]+mu[,4], "probit", earg= list()),
- theta2eta(.init.rho, .lrho, earg= .erho))
- }), list( .lrho=lrho, .erho=erho, .init.rho=init.rho ))),
+ predictors.names = c(
+ namesof("mu1", .lmu12, earg= .emu12, short=TRUE),
+ namesof("mu2", .lmu12, earg= .emu12, short=TRUE),
+ namesof("rho", .lrho, earg= .erho, short=TRUE))
+
+ if(is.null( .nsimEIM)) {
+ save.weight <- control$save.weight <- FALSE
+ }
+ if(is.null(etastart)) {
+ mu1.init= if(is.Numeric(.imu1)) rep(.imu1, len=n) else mu[,3]+mu[,4]
+ mu2.init= if(is.Numeric(.imu2)) rep(.imu2, len=n) else mu[,2]+mu[,4]
+ rho.init = if(is.Numeric(.init.rho)) rep( .init.rho, len=n) else {
+ temp4 = oratio = mu[,1] * mu[,4] / (mu[,2] * mu[,3])
+ temp4[oratio <= 0.1] = -0.6
+ temp4[oratio > 0.1] = -0.4
+ temp4[oratio > 0.5] = -0.2
+ temp4[oratio > 0.9] = -0.1
+ temp4[oratio > 1.1] = 0.1
+ temp4[oratio > 2.0] = 0.3
+ temp4[oratio > 6.0] = 0.6
+ temp4[oratio > 15.0] = 0.8
+ temp4
+ }
+ etastart = cbind(theta2eta(mu1.init, .lmu12, earg= .emu12),
+ theta2eta(mu2.init, .lmu12, earg= .emu12),
+ theta2eta(rho.init, .lrho, earg= .erho))
+ }
+ }), list( .lmu12=lmu12, .emu12=emu12, .nsimEIM=nsimEIM,
+ .lrho=lrho, .erho=erho,
+ .imu1=imu1, .imu2=imu2, .init.rho=init.rho ))),
inverse=eval(substitute(function(eta, extra=NULL) {
- pm <- cbind(pnorm(eta[,1]),pnorm(eta[,2]))
- rho <- eta2theta(eta[,3], .lrho, earg= .erho)
- p11 <- pnorm2(eta[,1], eta[,2], rho)
- p01 <- pm[,2]-p11
- p10 <- pm[,1]-p11
- p00 <- 1-p01-p10-p11
+ pmargin = cbind(eta2theta(eta[,1], .lmu12, earg= .emu12),
+ eta2theta(eta[,2], .lmu12, earg= .emu12))
+ rho = eta2theta(eta[,3], .lrho, earg= .erho)
+ p11 = pnorm2(eta[,1], eta[,2], rho)
+ p01 = pmargin[,2]-p11
+ p10 = pmargin[,1]-p11
+ p00 = 1-p01-p10-p11
cbind("00"=p00, "01"=p01, "10"=p10, "11"=p11)
- }, list( .lrho=lrho, .erho=erho ))),
+ }, list( .lmu12=lmu12, .emu12=emu12, .lrho=lrho, .erho=erho ))),
last=eval(substitute(expression({
- misc$link <- c(mu1 = "probit", mu2 = "probit", rho = .lrho)
- misc$earg <- list(mu1 = list(), mu2 = list(), rho = .erho)
- }), list( .lrho=lrho, .erho=erho ))),
- link=eval(substitute(function(mu, extra=NULL) {
- if(is.null(extra))
- stop("rho must be passed into $link through \"extra\"")
- pm <- cbind(mu[,3]+mu[,4], mu[,2]+mu[,4])
- cbind("probit(mu1)"=qnorm(pm[,1]),
- "probit(mu2)"=qnorm(pm[,2]),
- "link(rho)"=theta2eta(extra, .lrho, earg= .erho))
- }, list( .lrho=lrho, .erho=erho ))),
+ misc$link = c(mu1 = .lmu12, mu2 = .lmu12, rho = .lrho)
+ misc$earg = list(mu1 = .emu12, mu2 = .emu12, rho = .erho)
+ misc$nsimEIM = .nsimEIM
+ misc$expected = TRUE
+ }), list( .lmu12=lmu12, .emu12=emu12, .lrho=lrho, .erho=erho,
+ .nsimEIM=nsimEIM ))),
vfamily=c("binom2.rho", "binom2"),
deriv=eval(substitute(expression({
- pm <- cbind(pnorm(eta[,1]),pnorm(eta[,2]))
- rho <- eta2theta(eta[,3], .lrho, earg= .erho)
- p11 <- pnorm2(eta[,1], eta[,2], rho)
- p01 <- pm[,2]-p11
- p10 <- pm[,1]-p11
- p00 <- 1-p01-p10-p11
-
- B <- (eta[,2]-rho*eta[,1])/sqrt(1-rho^2)
- A <- (eta[,1]-rho*eta[,2])/sqrt(1-rho^2)
- phi1 <- dnorm(eta[,1])
- phi2 <- dnorm(eta[,2])
- PhiA <- pnorm(A)
- PhiB <- pnorm(B)
-
- ff <- dnorm2(eta[,1], eta[,2], rho)
- d1 = phi1*(PhiB*(y[,4]/p11-y[,2]/p01) + (1-PhiB)*(y[,3]/p10-y[,1]/p00))
- d2 = phi2*(PhiA*(y[,4]/p11-y[,3]/p10) + (1-PhiA)*(y[,2]/p01-y[,1]/p00))
- dl.drho <- (y[,4]/p11-y[,3]/p10-y[,2]/p01+y[,1]/p00)* ff
- drho.deta <- dtheta.deta(rho, .lrho, earg= .erho)
- w * cbind(d1, d2, dl.drho * drho.deta)
- }), list( .lrho=lrho, .erho=erho ))),
+ pmargin = cbind(eta2theta(eta[,1], .lmu12, earg= .emu12),
+ eta2theta(eta[,2], .lmu12, earg= .emu12))
+ rhovec = eta2theta(eta[,3], .lrho, earg= .erho)
+ p11 = pnorm2(eta[,1], eta[,2], rhovec)
+ p01 = pmargin[,2]-p11
+ p10 = pmargin[,1]-p11
+ p00 = 1-p01-p10-p11
+
+ ABmat = (eta[,1:2] - rhovec*eta[,2:1]) / sqrt(1-rhovec^2)
+ PhiA = pnorm(ABmat[,1])
+ PhiB = pnorm(ABmat[,2])
+ onemPhiA = pnorm(ABmat[,1], lower.tail=FALSE)
+ onemPhiB = pnorm(ABmat[,2], lower.tail=FALSE)
+
+ smallno = 1000 * .Machine$double.eps
+ p00[p00 < smallno] = smallno
+ p01[p01 < smallno] = smallno
+ p10[p10 < smallno] = smallno
+ p11[p11 < smallno] = smallno
+
+ dprob00 = dnorm2(eta[,1], eta[,2], rhovec)
+ dl.dprob1 = PhiB*(y[,4]/p11-y[,2]/p01) + onemPhiB*(y[,3]/p10-y[,1]/p00)
+ dl.dprob2 = PhiA*(y[,4]/p11-y[,3]/p10) + onemPhiA*(y[,2]/p01-y[,1]/p00)
+ dl.drho = (y[,4]/p11-y[,3]/p10-y[,2]/p01+y[,1]/p00) * dprob00
+ dprob1.deta = dtheta.deta(pmargin[,1], .lmu12, earg= .emu12)
+ dprob2.deta = dtheta.deta(pmargin[,2], .lmu12, earg= .emu12)
+ drho.deta = dtheta.deta(rhovec, .lrho, earg= .erho)
+ dthetas.detas = cbind(dprob1.deta, dprob2.deta, drho.deta)
+
+ w * cbind(dl.dprob1, dl.dprob2, dl.drho) * dthetas.detas
+ }), list( .lmu12=lmu12, .emu12=emu12, .lrho=lrho, .erho=erho ))),
weight=eval(substitute(expression({
- wz <- matrix(as.numeric(NA), n, dimm(M)) # 6=dimm(M)
- wz[,iam(1,1,M)] = phi1^2*(PhiB^2*(1/p11+1/p01)+(1-PhiB)^2*(1/p10+1/p00))
- wz[,iam(2,2,M)] = phi2^2*(PhiA^2*(1/p11+1/p10)+(1-PhiA)^2*(1/p01+1/p00))
- wz[,iam(1,2,M)] = phi1*phi2*(PhiA*PhiB/p11 + (1-PhiA)*(1-PhiB)/p00 -
- PhiA*(1-PhiB)/p10 - (1-PhiA)*PhiB/p01)
- d2l.drhoeta1 <- ff*phi1*(PhiB*(1/p11+1/p01) - (1-PhiB)*(1/p10+1/p00))
- wz[,iam(1,3,M)] <- d2l.drhoeta1 * drho.deta
- d2l.drhoeta2 <- ff*phi2*(PhiA*(1/p11+1/p10) - (1-PhiA)*(1/p01+1/p00))
- wz[,iam(2,3,M)] <- d2l.drhoeta2 * drho.deta
- d2l.drho2 <- ff^2 * (1/p11+1/p01+1/p10+1/p00)
- wz[,iam(3,3,M)] <- d2l.drho2 * drho.deta^2
- wz * w
- }), list( .lrho=lrho, .erho=erho ))))
+ if(is.null( .nsimEIM)) {
+ d2l.dprob1prob1 = PhiB^2 *(1/p11+1/p01) + onemPhiB^2 *(1/p10+1/p00)
+ d2l.dprob2prob2 = PhiA^2 *(1/p11+1/p10) + onemPhiA^2 *(1/p01+1/p00)
+ d2l.dprob1prob2 = PhiA * (PhiB/p11 - onemPhiB/p10) +
+ onemPhiA * (onemPhiB/p00 - PhiB/p01)
+ d2l.dprob1rho = (PhiB*(1/p11+1/p01) -
+ onemPhiB*(1/p10+1/p00)) * dprob00
+ d2l.dprob2rho = (PhiA*(1/p11+1/p10) -
+ onemPhiA*(1/p01+1/p00)) * dprob00
+ d2l.drho2 = (1/p11+1/p01+1/p10+1/p00) * dprob00^2
+ wz = matrix(0, n, dimm(M)) # 6=dimm(M)
+ wz[,iam(1,1,M)] = d2l.dprob1prob1 * dprob1.deta^2
+ wz[,iam(2,2,M)] = d2l.dprob2prob2 * dprob2.deta^2
+ wz[,iam(1,2,M)] = d2l.dprob1prob2 * dprob1.deta * dprob2.deta
+ wz[,iam(1,3,M)] = d2l.dprob1rho * dprob1.deta * drho.deta
+ wz[,iam(2,3,M)] = d2l.dprob2rho * dprob2.deta * drho.deta
+ wz[,iam(3,3,M)] = d2l.drho2 * drho.deta^2
+ } else {
+ run.varcov = 0
+ ind1 = iam(NA, NA, M=M, both=TRUE, diag=TRUE)
+ for(ii in 1:( .nsimEIM )) {
+ ysim = rbinom2.rho(n=n, mu1=pmargin[,1], mu2=pmargin[,2],
+ twoCols=FALSE, rho=rhovec)
+ dl.dprob1 = PhiB * (ysim[,4]/p11-ysim[,2]/p01) +
+ onemPhiB * (ysim[,3]/p10-ysim[,1]/p00)
+ dl.dprob2 = PhiA * (ysim[,4]/p11-ysim[,3]/p10) +
+ onemPhiA * (ysim[,2]/p01-ysim[,1]/p00)
+ dl.drho = (ysim[,4]/p11-ysim[,3]/p10 -
+ ysim[,2]/p01+ysim[,1]/p00) * dprob00
+
+ rm(ysim)
+ temp3 = cbind(dl.dprob1, dl.dprob2, dl.drho)
+ run.varcov = ((ii-1) * run.varcov +
+ temp3[,ind1$row.index] * temp3[,ind1$col.index]) / ii
+ }
+ wz = if(intercept.only)
+ matrix(apply(run.varcov, 2, mean),
+ n, ncol(run.varcov), byrow=TRUE) else run.varcov
+
+ wz = wz * dthetas.detas[,ind1$row] * dthetas.detas[,ind1$col]
+ }
+ w * wz
+ }), list( .nsimEIM=nsimEIM, .lmu12=lmu12, .emu12=emu12, .lrho=lrho,
+ .erho=erho ))))
}
@@ -538,8 +704,7 @@ dnorm2 <- function(x, y, r)
exp(-0.5*(x^2+y^2-2*x*y*r)/(1-r^2)) / (2*pi*sqrt(1-r^2))
-pnorm2 <- function(ah, ak, r)
-{
+pnorm2 <- function(ah, ak, r) {
ans <- ah
size <- length(ah)
@@ -622,7 +787,10 @@ size.binomial <- function(prob=0.5, link="loge", earg=list())
+
dbetabin.ab = function(x, size, shape1, shape2, log = FALSE) {
+ log.arg = log
+ rm(log)
if(!is.Numeric(x)) stop("bad input for argument \"x\"")
if(!is.Numeric(size, posit=TRUE, integer=TRUE))
stop("bad input for argument \"size\"")
@@ -632,13 +800,15 @@ dbetabin.ab = function(x, size, shape1, shape2, log = FALSE) {
x = rep(x, len=L); size = rep(size, len=L);
shape1 = rep(shape1, len=L); shape2 = rep(shape2, len=L);
answer = 0 * x
- if(length(ok <- round(x) == x & x >= 0 & x <= size))
- answer[ok] = if(log) lchoose(size[ok], x[ok]) +
- lbeta(shape1[ok]+x[ok], shape2[ok]+size[ok]-x[ok]) -
- lbeta(shape1[ok], shape2[ok]) else
- choose(size[ok], x[ok]) *
- beta(shape1[ok]+x[ok],
- shape2[ok]+size[ok]-x[ok]) / beta(shape1[ok], shape2[ok])
+ ok <- round(x) == x & x >= 0 & x <= size
+ answer[ok] = lchoose(size[ok], x[ok]) +
+ lbeta(shape1[ok]+x[ok], shape2[ok]+size[ok]-x[ok]) -
+ lbeta(shape1[ok], shape2[ok])
+ if(log.arg) {
+ answer[!ok] = log(0.0)
+ } else {
+ answer[ok] = exp(answer[ok])
+ }
answer
}
@@ -1081,8 +1251,6 @@ zipebcom = function(lmu12="cloglog", lphi12="logit", loratio="loge",
addRidge=0.001)
{
-
-
if(mode(lphi12) != "character" && mode(lphi12) != "name")
lphi12 = as.character(substitute(lphi12))
if(mode(loratio) != "character" && mode(loratio) != "name")
@@ -1171,23 +1339,17 @@ zipebcom = function(lmu12="cloglog", lphi12="logit", loratio="loge",
smallno = .Machine$double.eps^(2/4)
A1vec[A1vec > 1.0 -smallno] = 1.0 - smallno
-
phivec = eta2theta(eta[,2], .lphi12, earg= .ephi12)
pmargin = matrix((1 - phivec) * A1vec, n, 2)
oratio = eta2theta(eta[,3], .loratio, earg= .eoratio)
-
-
Vab = 1 / (1/mu[,1] + 1/mu[,2] + 1/mu[,3] + 1/mu[,4])
Vabc = 1/mu[,1] + 1/mu[,2]
denom3 = 2 * oratio * mu[,2] + mu[,1] + mu[,4]
temp1 = oratio * mu[,2] + mu[,4]
dp11star.dp1unstar = 2*(1-phivec)*Vab * Vabc
-
dp11star.dphi1 = -2 * A1vec * Vab * Vabc
-
dp11star.doratio = Vab / oratio
-
yandmu = (y[,1]/mu[,1] - y[,2]/mu[,2] - y[,3]/mu[,3] + y[,4]/mu[,4])
dp11.doratio = Vab / oratio
check.dl.doratio = yandmu * dp11.doratio
@@ -1196,58 +1358,32 @@ zipebcom = function(lmu12="cloglog", lphi12="logit", loratio="loge",
dl.dmu1 = dp11star.dp1unstar * yandmu + (1-phivec) * cyandmu
dl.dphi1 = dp11star.dphi1 * yandmu - A1vec * cyandmu
dl.doratio = check.dl.doratio
-
dthetas.detas = cbind(dtheta.deta(A1vec, .lmu12, earg= .emu12),
dtheta.deta(phivec, .lphi12, earg= .ephi12),
dtheta.deta(oratio, .loratio, earg= .eoratio))
w * cbind(dl.dmu1, dl.dphi1, dl.doratio) * dthetas.detas
- }), list( .tol=tol,
- .lmu12=lmu12, .lphi12=lphi12, .loratio=loratio,
+ }), list( .lmu12=lmu12, .lphi12=lphi12, .loratio=loratio,
.emu12=emu12, .ephi12=ephi12, .eoratio=eoratio ))),
weight=eval(substitute(expression({
- myvarfun1 = function(y, mu, a=1, b=0) (a-2*b)^2 / mu[,1] +
- (b-a)^2 * (1/mu[,2] + 1/mu[,3]) + a^2 / mu[,4]
-
- mycovfun1 = function(y, mu, a1=1, b1=0, a2=1, b2=0)
- (a1-2*b1)*(a2-2*b2) / mu[,1] +
- (b1-a1) * (b2-a2) * (1/mu[,2] + 1/mu[,3]) +
- a1 * a2 / mu[,4]
-
wz = matrix(0, n, 4)
alternwz11 = 2*(1-phivec)^2 *(2/mu[,1] + 1/mu[,2] - 2*Vab*Vabc^2) *
(dthetas.detas[,1])^2
wz[,iam(1,1,M)] = alternwz11
-
alternwz22 = 2* A1vec^2 *(2/mu[,1] + 1/mu[,2] - 2*Vab*Vabc^2) *
(dthetas.detas[,2])^2
wz[,iam(2,2,M)] = alternwz22
-
-
-
-
alternwz12 = -2*A1vec*(1-phivec)*(2/mu[,1] + 1/mu[,2] - 2*Vab*Vabc^2) *
dthetas.detas[,1] * dthetas.detas[,2]
wz[,iam(1,2,M)] = alternwz12
-
-
-
alternwz33 = (Vab / oratio^2) * dthetas.detas[,3]^2
wz[,iam(3,3,M)] = alternwz33
-
-
-
-
-
wz[,1:2] = wz[,1:2] * (1 + .addRidge)
-
w * wz
- }), list( .tol=tol, .addRidge = addRidge,
- .lmu12=lmu12, .lphi12=lphi12, .loratio=loratio,
- .emu12=emu12, .ephi12=ephi12, .eoratio=eoratio ))))
+ }), list( .addRidge = addRidge ))))
}
diff --git a/R/family.bivariate.q b/R/family.bivariate.q
index 1926ade..a7db3be 100644
--- a/R/family.bivariate.q
+++ b/R/family.bivariate.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.categorical.q b/R/family.categorical.q
index c8e0687..1945542 100644
--- a/R/family.categorical.q
+++ b/R/family.categorical.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -26,8 +26,7 @@ process.categorical.data.vgam = expression({
if(!exists("delete.zero.colns") ||
(exists("delete.zero.colns") && delete.zero.colns)) {
sumy2 = as.vector(t(y) %*% rep(1,nrow(y)))
- if(any(index <- sumy2==0))
- {
+ if(any(index <- sumy2==0)) {
y = y[,!index,drop = FALSE]
sumy2 = sumy2[!index]
if(all(index) || ncol(y)<=1) stop("y matrix has 0 or 1 columns")
@@ -36,8 +35,7 @@ process.categorical.data.vgam = expression({
}
}
- if(any(miss <- nvec==0))
- {
+ if(any(miss <- nvec==0)) {
warning(paste(sm <- sum(miss),
"observation(s) deleted (zero counts)"))
x = x[!miss,,drop = FALSE]
@@ -360,12 +358,34 @@ vglm.vcategorical.control = function(maxit=30, trace=FALSE, panic=TRUE, ...)
-multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL)
+multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL,
+ refLevel="last")
{
+ if(length(refLevel) != 1) stop("the length of 'refLevel' must be one")
+ if(is.character(refLevel)) {
+ if(refLevel != "last") stop('if a character, refLevel must be "last"')
+ refLevel = -1
+ } else if(is.factor(refLevel)) {
+ if(is.ordered(refLevel)) warning("'refLevel' is from an ordered factor")
+ refLevel = as.character(refLevel) == levels(refLevel)
+ refLevel = (1:length(refLevel))[refLevel]
+ if(!is.Numeric(refLevel, allow=1, integer=TRUE, posit=TRUE))
+ stop("could not coerce 'refLevel' into a single positive integer")
+ } else if(!is.Numeric(refLevel, allow=1, integer=TRUE, posit=TRUE))
+ stop("\"refLevel\" must be a single positive integer")
new("vglmff",
blurb=c("Multinomial logit model\n\n",
- "Links: log(mu[,j]/mu[,M+1])\n",
+ if(refLevel < 0)
+ "Links: log(mu[,j]/mu[,M+1]), j=1:M,\n" else {
+ if(refLevel==1)
+ paste("Links: log(mu[,j]/mu[,", refLevel,
+ "]), j=2:(M+1),\n", sep="") else
+ paste("Links: log(mu[,j]/mu[,", refLevel,
+ "]), j=c(1:", refLevel-1,
+ ",", refLevel+1, ":(M+1)),\n",
+ sep="")
+ },
"Variance: mu[,j]*(1-mu[,j]); -mu[,j]*mu[,k]"),
constraints=eval(substitute(expression({
@@ -377,52 +397,87 @@ multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL)
intercept.apply=FALSE)
constraints = cm.zero.vgam(constraints, x, .zero, M)
constraints = cm.nointercept.vgam(constraints, x, .nointercept, M)
- }), list( .parallel=parallel, .zero=zero, .nointercept=nointercept ))),
+ }), list( .parallel=parallel, .zero=zero, .nointercept=nointercept,
+ .refLevel=refLevel ))),
deviance=Deviance.categorical.data.vgam,
- initialize=expression({
+ initialize=eval(substitute(expression({
delete.zero.colns = TRUE
eval(process.categorical.data.vgam)
M = ncol(y)-1
- predictors.names = paste("log(mu[,",1:M,"]/mu[,",M+1,"])",sep="")
+ use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+ if(use.refLevel > (M+1))
+ stop("argument 'refLevel' has a value that is too high")
+ allbut.refLevel = (1:(M+1))[-use.refLevel]
+ predictors.names = paste("log(mu[,", allbut.refLevel,
+ "]/mu[,", use.refLevel, "])", sep="")
y.names = paste("mu", 1:(M+1), sep="")
- }),
- inverse=function(eta, extra=NULL) {
+ }), list( .refLevel = refLevel ))),
+ inverse=eval(substitute( function(eta, extra=NULL) {
if(any(is.na(eta)))
warning("there are NAs in eta in slot inverse")
- phat = cbind(exp(eta), 1)
+ M = ncol(cbind(eta))
+ if( (.refLevel < 0) || (.refLevel == M+1)) {
+ phat = cbind(exp(eta), 1)
+ } else if( .refLevel == 1) {
+ phat = cbind(1, exp(eta))
+ } else {
+ use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+ etamat = cbind(eta[,1:( .refLevel - 1)], 0,
+ eta[,( .refLevel ):M])
+ phat = exp(etamat)
+ }
ans = phat / as.vector(phat %*% rep(1, ncol(phat)))
if(any(is.na(ans)))
warning("there are NAs here in slot inverse")
ans
- },
- last=expression({
+ }), list( .refLevel = refLevel )),
+ last=eval(substitute(expression({
+ misc$refLevel = if( .refLevel < 0) M+1 else .refLevel
misc$link = "mlogit"
misc$earg = list(mlogit = list()) # vector("list", M)
dy = dimnames(y)
if(!is.null(dy[[2]]))
dimnames(fit$fitted.values) = dy
- }),
- link=function(mu, extra=NULL)
- log(mu[,-ncol(mu)]/mu[,ncol(mu)]),
+ }), list( .refLevel = refLevel ))),
+ link=eval(substitute( function(mu, extra=NULL) {
+ if( .refLevel < 0) {
+ log(mu[,-ncol(mu)] / mu[,ncol(mu)])
+ } else {
+ use.refLevel = if( .refLevel < 0) ncol(mu) else .refLevel
+ log(mu[,-( use.refLevel )] / mu[, use.refLevel ])
+ }
+ }), list( .refLevel = refLevel )),
loglikelihood= function(mu, y, w, residuals = FALSE, eta, extra=NULL)
if(residuals) stop("loglikelihood residuals not implemented yet") else
sum(w * y * log(mu)),
vfamily=c("multinomial", "vcategorical"),
- deriv=expression({
- w * (y[,-ncol(y)] - mu[,-ncol(y)])
- }),
- weight= expression({
- tiny = (mu < .Machine$double.eps^.5) |
- (mu > 1 - .Machine$double.eps^.5)
-
- if(M==1) wz = mu[,1] * (1-mu[,1]) else {
+ deriv=eval(substitute(expression({
+ if( .refLevel < 0) {
+ w * (y[,-ncol(y)] - mu[,-ncol(y)])
+ } else {
+ use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+ w * (y[,-use.refLevel] - mu[,-use.refLevel])
+ }
+ }), list( .refLevel=refLevel ))),
+ weight=eval(substitute(expression({
+ mytiny = (mu < sqrt(.Machine$double.eps)) |
+ (mu > 1 - sqrt(.Machine$double.eps))
+
+ use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+
+ if(M==1) wz = mu[,3-use.refLevel] * (1-mu[,3-use.refLevel]) else {
index = iam(NA, NA, M, both=TRUE, diag=TRUE)
+ myinc = (index$row.index >= use.refLevel)
+ index$row.index[myinc] = index$row.index[myinc] + 1
+ myinc = (index$col.index >= use.refLevel)
+ index$col.index[myinc] = index$col.index[myinc] + 1
+
wz = -mu[,index$row] * mu[,index$col]
- wz[,1:M] = wz[,1:M] + mu[,1:M]
+ wz[,1:M] = wz[,1:M] + mu[, -use.refLevel ]
}
- atiny = (tiny %*% rep(1, ncol(mu))) > 0 # apply(tiny, 1, any)
+ atiny = (mytiny %*% rep(1, ncol(mu))) > 0 # apply(mytiny, 1, any)
if(any(atiny)) {
if(M==1) wz[atiny] = wz[atiny] * (1 + .Machine$double.eps^0.5) +
.Machine$double.eps else
@@ -430,7 +485,7 @@ multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL)
.Machine$double.eps
}
w * wz
- }))
+ }), list( .refLevel = refLevel ))))
}
@@ -490,6 +545,10 @@ cumulative = function(link="logit", earg = list(),
answer
}, list( .earg=earg, .link=link, .mv = mv ) )),
initialize=eval(substitute(expression({
+
+ if(colnames(x)[1] != "(Intercept)")
+ stop("there is no intercept term!")
+
extra$mv = .mv
if( .mv ) {
checkCut(y) # Check the input; stops if there is an error.
@@ -828,6 +887,7 @@ brat = function(refgp="last",
if(!is.character(refgp) &&
!is.Numeric(refgp, allow=1, integer=TRUE, posit=TRUE))
stop("\"refgp\" must be a single positive integer")
+
new("vglmff",
blurb=c(paste("Bradley-Terry model (without ties)\n\n"),
"Links: ",
@@ -1525,8 +1585,6 @@ scumulative = function(link="logit", earg = list(),
vfamily=c("scumulative", "vcategorical"),
deriv=eval(substitute(expression({
ooz = iter %% 2
- print("ooz")
- print( ooz )
J = extra$J
mu.use = pmax(mu, .Machine$double.eps * 1.0e-0)
diff --git a/R/family.censored.q b/R/family.censored.q
index d3b15a3..ac1f6d3 100644
--- a/R/family.censored.q
+++ b/R/family.censored.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.circular.q b/R/family.circular.q
index 2e6af92..81fbd63 100644
--- a/R/family.circular.q
+++ b/R/family.circular.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.extremes.q b/R/family.extremes.q
index 7fa17f9..538468f 100644
--- a/R/family.extremes.q
+++ b/R/family.extremes.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -148,11 +148,11 @@ gev <- function(llocation="identity",
lp = length(cent)
fv = matrix(as.numeric(NA), nrow(eta), lp)
if(lp) {
- for(i in 1:lp) {
- yp = -log(cent[i]/100)
- fv[!iszero,i] = loc[!iszero] - sigma[!iszero] *
+ for(ii in 1:lp) {
+ yp = -log(cent[ii]/100)
+ fv[!iszero,ii] = loc[!iszero] - sigma[!iszero] *
(1 - yp^(-xi[!iszero])) / xi[!iszero]
- fv[iszero,i] = loc[iszero] - sigma[iszero] * log(yp)
+ fv[iszero,ii] = loc[iszero] - sigma[iszero] * log(yp)
}
dimnames(fv) = list(dimnames(eta)[[1]],
paste(as.character(cent), "%", sep=""))
@@ -464,11 +464,11 @@ egev <- function(llocation="identity",
lp <- length(cent)
fv <- matrix(as.numeric(NA), nrow(eta), lp)
if(lp) {
- for(i in 1:lp) {
- yp = -log(cent[i]/100)
- fv[!iszero,i] = loc[!iszero] - sigma[!iszero] *
+ for(ii in 1:lp) {
+ yp = -log(cent[ii]/100)
+ fv[!iszero,ii] = loc[!iszero] - sigma[!iszero] *
(1 - yp^(-xi[!iszero])) / xi[!iszero]
- fv[iszero,i] = loc[iszero] - sigma[iszero] * log(yp)
+ fv[iszero,ii] = loc[iszero] - sigma[iszero] * log(yp)
}
dimnames(fv) = list(dimnames(eta)[[1]],
paste(as.character(cent), "%", sep=""))
@@ -700,19 +700,18 @@ gumbel <- function(llocation="identity",
sigma = eta2theta(eta[,2], .lscale, earg= .escale ) # sigma
Percentiles = extra$percentiles
lp = length(Percentiles) # may be 0
- if(lp) {
+ if(lp > 0) {
mpv = extra$mpv
mu = matrix(as.numeric(NA), nrow(eta), lp + mpv) # lp could be 0
Rvec = extra$R
- if(1 <= lp)
- for(i in 1:lp) {
- ci = if(is.Numeric(Rvec)) Rvec * (1 - Percentiles[i] / 100) else
- -log( Percentiles[i] / 100)
- mu[,i] = loc - sigma * log(ci)
+ for(ii in 1:lp) {
+ ci = if(is.Numeric(Rvec)) Rvec * (1 - Percentiles[ii] / 100) else
+ -log(Percentiles[ii] / 100)
+ mu[,ii] = loc - sigma * log(ci)
}
if(mpv)
mu[,ncol(mu)] = loc - sigma * log(log(2))
- dmn2 = if(lp>=1) paste(as.character(Percentiles), "%", sep="") else NULL
+ dmn2 = paste(as.character(Percentiles), "%", sep="")
if(mpv)
dmn2 = c(dmn2, "MPV")
dimnames(mu) = list(dimnames(eta)[[1]], dmn2)
@@ -1011,7 +1010,7 @@ gpd = function(threshold=0,
A = 1 + xi*ystar/sigma
mytolerance = .Machine$double.eps
bad <- (A<=mytolerance) # Range violation
- if(any(sum(w[bad]))) {
+ if(any(bad) && any(w[bad] != 0)) {
cat("There are some range violations\n")
if(exists("flush.console")) flush.console()
}
@@ -1033,7 +1032,7 @@ gpd = function(threshold=0,
A = 1 + xi*ystar/sigma
mytolerance = .Machine$double.eps
bad <- (A <= mytolerance)
- if(any(sum(w[bad]))) {
+ if(any(bad) && any(w[bad] != 0)) {
cat(sum(w[bad],na.rm=TRUE), # "; ignoring them"
"observations violating boundary constraints\n")
if(exists("flush.console")) flush.console()
diff --git a/R/family.fishing.q b/R/family.fishing.q
new file mode 100644
index 0000000..4757edb
--- /dev/null
+++ b/R/family.fishing.q
@@ -0,0 +1,80 @@
+# These functions are Copyright (C) 1998-2008 T. W. Yee All rights reserved.
+
+# "family.fishing.q"
+# Last modified: 01/12/08, 02/12/08
+# Copyright Thomas W. Yee (2008)
+
+
+# ====================================================================
+# 20081201
+
+DeLury = function(catch, effort,
+ type=c("DeLury","Leslie"),
+ ricker=FALSE) {
+# 20081202; this function has been checked not ok
+ type = match.arg(type, c("DeLury","Leslie"))[1]
+ if(!is.logical(ricker)) stop("bad input for 'ricker'")
+ if((LLL <- Lcatch <- length(catch)) != (Leffort <- length(effort)))
+ stop("length(catch) != length(effort)")
+
+ CPUE = catch / effort
+ if(type == "DeLury") {
+ Et = cumsum(effort) - ifelse(ricker, 0.5, 1) * effort
+ logCPUE = log(CPUE)
+ lmfit = lm(logCPUE ~ Et, x=TRUE)
+ myq = catchabilityCoefficient = -coef(lmfit)[2]
+ N0 = exp(coef(lmfit)["(Intercept)"]) / myq
+ } else {
+ Kt = cumsum(catch) - ifelse(ricker, 0.5, 1) * catch
+ lmfit = lm(CPUE ~ Kt, x=TRUE)
+ myq = catchabilityCoefficient = -coef(lmfit)[2]
+ N0 = coef(lmfit)["(Intercept)"] / myq
+ }
+
+ rlist =
+ list(catch=catch,
+ effort=effort,
+ type=type,
+ N0 = N0,
+ CPUE = CPUE,
+ lmfit=lmfit)
+ if(type == "DeLury") {
+ rlist$E = Et
+ } else {
+ rlist$K = Kt
+ }
+ rlist
+}
+
+
+
+# ======================================================================
+# 20081201
+# Transferred over from my own files and then modified here.
+
+# length is in metres
+wffc.P1 = function(length, min.eligible=0.18)
+ ifelse(length >= min.eligible, 100 + 20 * ceiling(100*length), 0)
+wffc.P1star = function(length, min.eligible=0.18)
+ ifelse(length >= min.eligible, 100 + 2000 * length, 0)
+
+# This was in the original mss. but problem is P2 does not return an integer
+#wffc.P2 = function(y, min.eligible=0.18)
+# P1(y) + ifelse(y >= min.eligible, 0.7*ceiling(100*(y-min.eligible))^2, 0)
+#wffc.P2star = function(y, min.eligible=0.18)
+# P1star(y) + ifelse(y >= min.eligible, 7000 * (y-min.eligible)^2, 0)
+
+# 7/6/08; This returns an integer
+wffc.P2 = function(length, min.eligible=0.18)
+ wffc.P1(length) +
+ ifelse(length >= min.eligible,
+ ceiling(100*(length-min.eligible))^2, 0)
+wffc.P2star = function(length, min.eligible=0.18)
+ wffc.P1star(length) +
+ ifelse(length >= min.eligible, 10000 * (length-min.eligible)^2, 0)
+
+
+# ======================================================================
+
+
+
diff --git a/R/family.functions.q b/R/family.functions.q
index cc5dd61..2d9b8dc 100644
--- a/R/family.functions.q
+++ b/R/family.functions.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.genetic.q b/R/family.genetic.q
index e4ab14f..575e6e5 100644
--- a/R/family.genetic.q
+++ b/R/family.genetic.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.glmgam.q b/R/family.glmgam.q
index c7a771c..78c06ce 100644
--- a/R/family.glmgam.q
+++ b/R/family.glmgam.q
@@ -1,110 +1,10 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
-if(FALSE)
-quasiff = function(link="polw",
- earg=if(link=="powl") list(power=1) else list(),
- dispersion=0)
-{
- warning("link=powl doesn't work yet")
- estimated.dispersion <- dispersion==0
-
- if(mode(link )!= "character" && mode(link )!= "name")
- link <- as.character(substitute(link))
- if(!is.list(earg)) earg = list()
-
-
-
- result <-
- new("vglmff",
- blurb=c("Quasi family\n\n",
- "Link: ", namesof("mu", link, earg=earg), "\n",
- "Variance: ", ifelse(power.variance==1, variance,
- paste(variance, "^", power.variance, sep=""))),
- deviance= function(mu, y, w, residuals = FALSE, eta, extra=NULL) {
- pow <- extra$power.variance
- thing <- extra$variance
- if(thing=="mu" && (pow==1 || pow==2))
- stop("this deviance function not right")
-
- devy <- y^(2-pow) / (1-pow) - y^(2-pow) / (2-pow)
- devmu <- y * mu^(1-pow) / (1-pow) - mu^(2-pow) / (2-pow)
- devi <- 2 * (devy - devmu)
- if(residuals) {
- sign(y - mu) * sqrt(abs(devi) * w)
- } else sum(w * devi)
- },
- initialize=eval(substitute(expression({
- extra$link <- .link
- extra$variance <- .variance
- extra$power.variance <- .power.variance
-
- if(.variance=="mu(1-mu)") {
- delete.zero.colns <- TRUE
- eval(process.categorical.data.vgam)
-
- mustart <- mustart[,1]
- y <- y[,1]
- } else {
- mustart <- y + 0.167 * (y == 0)
- }
-
-
- }), list( .link=link, .variance=variance,
- .earg=earg, .power.variance=power.variance ))),
- inverse=eval(substitute(function(eta, extra=NULL) {
- eta2theta(eta, link= .link, earg=.earg)
- }, list( .link=link,
- .earg=earg ))),
- last=eval(substitute(expression({
- dpar <- .dispersion
- if(!dpar) {
- temp <- w * dmu.deta^2
- dpar <- sum( w * (y-mu)^2 * wz / temp ) / (length(mu) - ncol(x))
- }
- misc$dispersion <- dpar
- misc$default.dispersion <- 0
- misc$estimated.dispersion <- .estimated.dispersion
- misc$power.variance <- .power.variance
- misc$link = c("mu" = .link )
- }), list( .dispersion=dispersion,
- .earg=earg, .estimated.dispersion=estimated.dispersion,
- .link=link, .power.variance=power.variance ))),
- link=eval(substitute(function(mu, extra=NULL) {
- theta2eta(mu, link= .link, earg=.earg)
- }, list( .link=link,
- .earg=earg ))),
- vfamily="quasiff",
- deriv=eval(substitute(expression({
- pow <- extra$power.variance
- thing <- extra$variance
- dQ.dmu <- if(thing=="mu") (y-mu)/mu^pow else (y-mu)/(mu*(1-mu))^pow
- dmu.deta <- dtheta.deta(theta=mu, link= .link, earg=.earg)
- w * dQ.dmu * dmu.deta
- }), list( .link=link, .power.variance=power.variance,
- .earg=earg ))),
- weight=eval(substitute(expression({
- d2Q.dmu2 <- if(thing=="mu") 1 / mu^pow else
- 1 / (mu*(1-mu))^pow
- w * dmu.deta^2 * d2Q.dmu2
- }), list( .link=link, .power.variance=power.variance,
- .earg=earg ))))
-
- if(variance=="mu") {
- if(power.variance==1)
- result at deviance <- poissonff()@deviance
- if(power.variance==2)
- result at deviance <- gammaff()@deviance
- } else {
- result at deviance <- if(power.variance==1) binomialff()@deviance else NULL
- }
-
- result
-}
@@ -557,6 +457,7 @@ inv.gaussianff <- function(lmu="loge", llambda="loge",
poissonff <- function(link="loge", earg=list(),
dispersion=1, onedpar=FALSE,
+ imu=NULL, method.init=1,
parallel=FALSE, zero=NULL)
{
@@ -564,6 +465,11 @@ poissonff <- function(link="loge", earg=list(),
if(mode(link )!= "character" && mode(link )!= "name")
link <- as.character(substitute(link))
if(!is.list(earg)) earg = list()
+ if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
+ method.init > 3)
+ stop("'method.init' must be 1 or 2 or 3")
+ if(length(imu) && !is.Numeric(imu, posit=TRUE))
+ stop("bad input for argument 'imu'")
new("vglmff",
blurb=c("Poisson distribution\n\n",
@@ -581,10 +487,12 @@ poissonff <- function(link="loge", earg=list(),
2 * sum(w * devi)
},
initialize=eval(substitute(expression({
+ y = as.matrix(y)
+ M = ncoly = ncol(y)
+
if(is.R()) assign("CQO.FastAlgorithm",
( .link == "loge"), envir = VGAMenv) else
CQO.FastAlgorithm <<- ( .link == "loge")
- M = if(is.matrix(y)) ncol(y) else 1
dn2 = if(is.matrix(y)) dimnames(y)[[2]] else NULL
dn2 = if(length(dn2)) {
paste("E[", dn2, "]", sep="")
@@ -593,11 +501,22 @@ poissonff <- function(link="loge", earg=list(),
}
predictors.names = namesof(if(M>1) dn2 else "mu", .link,
earg= .earg, short=TRUE)
- mu = pmax(y, 1/8) # y + 0.167 * (y == 0)
- if(!length(etastart))
- etastart <- theta2eta(mu, link= .link, earg= .earg)
+
+ if(!length(etastart)) {
+ mu.init = pmax(y, 1/8)
+ for(iii in 1:ncol(y)) {
+ if( .method.init == 2) {
+ mu.init[,iii] = weighted.mean(y[,iii], w) + 1/8
+ } else if( .method.init == 3) {
+ mu.init[,iii] = median(y[,iii]) + 1/8
+ }
+ }
+ if(length(.imu))
+ mu.init = matrix( .imu, n, ncoly, byrow=TRUE)
+ etastart <- theta2eta(mu.init, link= .link, earg= .earg)
+ }
}), list( .link=link, .estimated.dispersion=estimated.dispersion,
- .earg=earg ))),
+ .method.init=method.init, .imu=imu, .earg=earg ))),
inverse=eval(substitute(function(eta, extra=NULL) {
mu = eta2theta(eta, link= .link, earg= .earg)
mu
@@ -631,12 +550,14 @@ poissonff <- function(link="loge", earg=list(),
misc$expected = TRUE
misc$link = rep( .link, length=M)
names(misc$link) = if(M>1) dn2 else "mu"
+ misc$method.init = .method.init
misc$earg = vector("list", M)
names(misc$earg) = names(misc$link)
for(ii in 1:M) misc$earg[[ii]] = .earg
- }), list( .dispersion=dispersion, .estimated.dispersion=estimated.dispersion,
- .onedpar=onedpar, .link=link, .earg=earg ))),
+ }), list( .dispersion=dispersion, .method.init=method.init,
+ .estimated.dispersion=estimated.dispersion,
+ .onedpar=onedpar, .link=link, .earg=earg ))),
link=eval(substitute(function(mu, extra=NULL) {
theta2eta(mu, link= .link, earg= .earg)
}, list( .link=link, .earg=earg ))),
diff --git a/R/family.loglin.q b/R/family.loglin.q
index b9167b3..f6c14ac 100644
--- a/R/family.loglin.q
+++ b/R/family.loglin.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -10,7 +10,7 @@ loglinb2 <- function(exchangeable=FALSE, zero=NULL)
new("vglmff",
blurb=c("Log-linear model for binary data\n\n",
"Links: ",
- "Identity: u_1, u_2, u_{12}",
+ "Identity: u1, u2, u12",
"\n"),
constraints=eval(substitute(expression({
constraints <- cm.vgam(matrix(c(1,1,0, 0,0,1), 3, 2), x,
diff --git a/R/family.mixture.q b/R/family.mixture.q
index 09e8ac2..ad76ff6 100644
--- a/R/family.mixture.q
+++ b/R/family.mixture.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -20,7 +20,7 @@ mix2normal1 = function(lphi="logit",
esd1=list(), esd2=list(),
iphi=0.5, imu1=NULL, imu2=NULL, isd1=NULL, isd2=NULL,
qmu=c(0.2, 0.8),
- ESD=TRUE,
+ equalsd=TRUE,
nsimEIM=100,
zero=1)
{
@@ -47,8 +47,8 @@ mix2normal1 = function(lphi="logit",
if(!is.list(emu2)) emu2 = list()
if(!is.list(esd1)) esd1 = list()
if(!is.list(esd2)) esd2 = list()
- if(!is.logical(ESD) || length(ESD) != 1)
- stop("bad input for argument \"ESD\"")
+ if(!is.logical(equalsd) || length(equalsd) != 1)
+ stop("bad input for argument \"equalsd\"")
if(!is.Numeric(nsimEIM, allow=1, integ=TRUE) || nsimEIM <= 10)
stop("'nsimEIM' should be an integer greater than 10")
@@ -63,10 +63,10 @@ mix2normal1 = function(lphi="logit",
"Mean: phi*mu1 + (1-phi)*mu2\n",
"Variance: phi*sd1^2 + (1-phi)*sd2^2 + phi*(1-phi)*(mu1-mu2)^2"),
constraints=eval(substitute(expression({
- constraints = cm.vgam(rbind(diag(4), c(0,0,1,0)), x, .ESD,
+ constraints = cm.vgam(rbind(diag(4), c(0,0,1,0)), x, .equalsd,
constraints, int=TRUE)
constraints = cm.zero.vgam(constraints, x, .zero, M)
- }), list(.zero=zero, .ESD=ESD))),
+ }), list(.zero=zero, .equalsd=equalsd))),
initialize=eval(substitute(expression({
if(ncol(y <- cbind(y)) != 1)
stop("the response must be a vector or one-column matrix")
@@ -88,10 +88,10 @@ mix2normal1 = function(lphi="logit",
sorty = sort(y)
init.sd1 = rep(if(length(.isd1)) .isd1 else sd(sorty[ind.1]), len=n)
init.sd2 = rep(if(length(.isd2)) .isd2 else sd(sorty[ind.2]), len=n)
- if( .ESD ) {
+ if( .equalsd ) {
init.sd1 = init.sd2 = (init.sd1 + init.sd2)/2
if(!all.equal( .esd1, .esd2 ))
- stop("'esd1' and 'esd2' must be equal if ESD=TRUE")
+ stop("'esd1' and 'esd2' must be equal if equalsd=TRUE")
}
etastart = cbind(theta2eta(init.phi, .lphi, earg= .ephi),
theta2eta(init.mu1, .lmu, earg= .emu1),
@@ -101,7 +101,7 @@ mix2normal1 = function(lphi="logit",
}
}), list(.lphi=lphi, .lmu=lmu, .iphi=iphi, .imu1=imu1, .imu2=imu2,
.ephi=ephi, .emu1=emu1, .emu2=emu2, .esd1=esd1, .esd2=esd2,
- .ESD=ESD,
+ .equalsd=equalsd,
.lsd=lsd, .isd1=isd1, .isd2=isd2, .qmu=qmu))),
inverse=eval(substitute(function(eta, extra=NULL){
phi = eta2theta(eta[,1], link= .lphi, earg= .ephi)
@@ -116,9 +116,9 @@ mix2normal1 = function(lphi="logit",
misc$earg = list("phi"= .ephi, "mu1"= .emu1,
"sd1"= .esd1, "mu2"= .emu2, "sd2"= .esd2)
misc$expected = TRUE
- misc$ESD = .ESD
+ misc$equalsd = .equalsd
misc$nsimEIM = .nsimEIM
- }), list(.lphi=lphi, .lmu=lmu, .lsd=lsd, .ESD=ESD,
+ }), list(.lphi=lphi, .lmu=lmu, .lsd=lsd, .equalsd=equalsd,
.ephi=ephi, .emu1=emu1, .emu2=emu2, .esd1=esd1, .esd2=esd2,
.nsimEIM=nsimEIM ))),
loglikelihood=eval(substitute(
diff --git a/R/family.nonlinear.q b/R/family.nonlinear.q
index bc42c64..f4fc928 100644
--- a/R/family.nonlinear.q
+++ b/R/family.nonlinear.q
@@ -1,19 +1,17 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
-
-vnonlinear.control <- function(regressor, save.weight=TRUE, ...)
+vnonlinear.control <- function(save.weight=TRUE, ...)
{
- list(regressor=regressor,
- save.weight=as.logical(save.weight)[1])
+ list(save.weight=as.logical(save.weight)[1])
}
@@ -28,6 +26,7 @@ micmen <- function(rpar=0.001, divisor=10,
{
+
estimated.dispersion <- dispersion==0
if(mode(link1) != "character" && mode(link1) != "name")
@@ -39,7 +38,7 @@ micmen <- function(rpar=0.001, divisor=10,
new("vglmff",
blurb=c("Michaelis-Menton regression model\n",
- "Y_i=theta1 * x_i / (theta2 + x_i) + e_i\n\n",
+ "Y_i = theta1 * u_i / (theta2 + u_i) + e_i\n\n",
"Links: ",
namesof("theta1", link1, earg=earg1), ", ",
namesof("theta2", link2, earg=earg2),
@@ -59,8 +58,13 @@ micmen <- function(rpar=0.001, divisor=10,
if(ncol(cbind(y)) != 1)
stop("response must be a vector or a one-column matrix")
- uvec = control$regressor # This is the regressor
- extra$uvec = uvec # Needed for @inverse
+ if(!length(Xm2))
+ stop("regressor not found")
+ if(ncol(as.matrix(Xm2)) != 1)
+ stop(paste("regressor not found or is not a vector. Use the",
+ "'form2' argument without an intercept"))
+ Xm2 = as.vector(Xm2) # Make sure
+ extra$Xm2 = Xm2 # Needed for @inverse
predictors.names <-
c(namesof("theta1", .link1, earg= .earg1, tag=FALSE),
@@ -69,9 +73,9 @@ micmen <- function(rpar=0.001, divisor=10,
if(length(mustart) || length(coefstart))
stop("can't handle mustart or coefstart")
if(!length(etastart)) {
- index <- (1:n)[uvec>quantile(uvec, prob=.85)]
+ index <- (1:n)[Xm2>quantile(Xm2, prob=.85)]
init1 <- median(y[index])
- init2 <- median(init1*uvec/y - uvec)
+ init2 <- median(init1*Xm2/y - Xm2)
if(length(.init1)) init1 = .init1
if(length(.init2)) init2 = .init2
@@ -80,7 +84,7 @@ micmen <- function(rpar=0.001, divisor=10,
rep(theta2eta(init1, .link1, earg= .earg1), len=n),
rep(theta2eta(init2, .link2, earg= .earg2), len=n))
} else {
- stop("can't handle etastart or mustart")
+ stop("cannot handle etastart or mustart")
}
}), list(.init1=init1, .init2=init2,
@@ -89,7 +93,7 @@ micmen <- function(rpar=0.001, divisor=10,
inverse=eval(substitute(function(eta, extra=NULL) {
theta1 <- eta2theta(eta[,1], .link1, earg= .earg1)
theta2 <- eta2theta(eta[,2], .link2, earg= .earg2)
- theta1 * extra$uvec / (theta2 + extra$uvec)
+ theta1 * extra$Xm2 / (theta2 + extra$Xm2)
}, list(.link1=link1, .link2=link2,
.earg1=earg1, .earg2=earg2 ))),
last=eval(substitute(expression({
@@ -99,6 +103,7 @@ micmen <- function(rpar=0.001, divisor=10,
fit$df.residual <- n - rank # Not n.big - rank
fit$df.total <- n # Not n.big
+ extra$Xm2 = NULL # Regressor is in control$regressor
dpar <- .dispersion
if(!dpar) {
dpar <- sum(w * (y-mu)^2) / (n - p.big)
@@ -116,7 +121,7 @@ micmen <- function(rpar=0.001, divisor=10,
rpar = max(rpar / .divisor, 1000 * .Machine$double.eps)
} else {
rpar = .rpar
- d3 = deriv3(~ theta1 * uvec / (theta2 + uvec),
+ d3 = deriv3(~ theta1 * Xm2 / (theta2 + Xm2),
c("theta1","theta2"), hessian=FALSE)
}
@@ -126,8 +131,8 @@ micmen <- function(rpar=0.001, divisor=10,
if(TRUE) {
dmus.dthetas = attr(eval(d3), "gradient")
} else {
- dmu.dtheta1 <- uvec / (theta2 + uvec)
- dmu.dtheta2 <- -theta1 * uvec / (uvec + theta2)^2
+ dmu.dtheta1 <- Xm2 / (theta2 + Xm2)
+ dmu.dtheta2 <- -theta1 * Xm2 / (Xm2 + theta2)^2
dmus.dthetas = cbind(dmu.dtheta1, dmu.dtheta2)
}
@@ -136,10 +141,10 @@ micmen <- function(rpar=0.001, divisor=10,
if(TRUE) {
index = iam(NA, NA, M=M, both=TRUE)
- temp = dmus.dthetas * dthetas.detas
+ temp200809 = dmus.dthetas * dthetas.detas
if(M>1)
- temp[,2:M] = temp[,2:M] + sqrt(rpar)
- w * (y-mu) * temp
+ temp200809[,2:M] = temp200809[,2:M] + sqrt(rpar)
+ w * (y-mu) * temp200809
} else {
w * (y-mu) *
cbind(dmus.dthetas[,1] * dthetas.detas[,1],
diff --git a/R/family.normal.q b/R/family.normal.q
index 2c50d36..d9b587f 100644
--- a/R/family.normal.q
+++ b/R/family.normal.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -119,19 +119,28 @@ gaussianff = function(dispersion=0, parallel=FALSE, zero=NULL)
-dposnorm = function(x, mean=0, sd=1) {
+
+dposnorm = function(x, mean=0, sd=1, log=FALSE) {
+ log.arg = log
+ rm(log)
+ if(!is.logical(log.arg) || length(log.arg)!=1)
+ stop("bad input for argument \"log\"")
L = max(length(x), length(mean), length(sd))
x = rep(x, len=L); mean = rep(mean, len=L); sd = rep(sd, len=L);
- ifelse(x < 0, 0, dnorm(x=x, mean=mean, sd=sd) /
- (1-pnorm(q=0, mean=mean, sd=sd)))
+
+ if(log.arg) {
+ ifelse(x < 0, log(0), dnorm(x, m=mean, sd=sd, log=TRUE) -
+ pnorm(mean/sd, log=TRUE))
+ } else {
+ ifelse(x < 0, 0, dnorm(x=x, me=mean, sd=sd) / pnorm(mean/sd))
+ }
}
pposnorm = function(q, mean=0, sd=1) {
L = max(length(q), length(mean), length(sd))
q = rep(q, len=L); mean = rep(mean, len=L); sd = rep(sd, len=L);
ifelse(q < 0, 0, (pnorm(q=q, mean=mean, sd=sd) -
- pnorm(q=0, mean=mean, sd=sd)) /
- (1-pnorm(q=0, mean=mean, sd=sd)))
+ pnorm(q=0, mean=mean, sd=sd)) / pnorm(q= mean/sd))
}
qposnorm = function(p, mean=0, sd=1) {
@@ -143,22 +152,27 @@ qposnorm = function(p, mean=0, sd=1) {
rposnorm = function(n, mean=0, sd=1) {
if(!is.Numeric(n, integ=TRUE, posit=TRUE))
stop("bad input for argument \"n\"")
- y = rnorm(n, mean=mean, sd=sd)
mean = rep(mean, length=n)
sd = rep(sd, length=n)
- repeat {
- index = y < 0
- if(any(index)) {
- y[index] = rnorm(n=sum(index), mean=mean[index], sd=sd[index])
- } else break
- }
- y
+ qnorm(p=runif(n, min=pnorm(0, m=mean, sd=sd)), m=mean, sd=sd)
}
-posnormal1 = function(lmean="identity", lsd="loge",
- emean=list(), esd=list(),
- imean=NULL, isd=NULL, zero=NULL)
+
+
+ posnormal1.control <- function(save.weight=TRUE, ...) {
+ list(save.weight=save.weight)
+}
+
+
+
+
+ posnormal1 = function(lmean="identity", lsd="loge",
+ emean=list(), esd=list(),
+ imean=NULL, isd=NULL,
+ nsimEIM=100, zero=NULL)
{
+ warning("this VGAM family function is not working properly yet")
+
if(mode(lmean) != "character" && mode(lmean) != "name")
lmean = as.character(substitute(lmean))
if(mode(lsd) != "character" && mode(lsd) != "name")
@@ -169,6 +183,9 @@ posnormal1 = function(lmean="identity", lsd="loge",
stop("bad input for argument \"isd\"")
if(!is.list(emean)) emean = list()
if(!is.list(esd)) esd = list()
+ if(length(nsimEIM))
+ if(!is.Numeric(nsimEIM, allow=1, integ=TRUE) || nsimEIM <= 10)
+ stop("'nsimEIM' should be an integer greater than 10")
new("vglmff",
blurb=c("Positive (univariate) normal distribution\n\n",
@@ -198,22 +215,22 @@ posnormal1 = function(lmean="identity", lsd="loge",
inverse=eval(substitute(function(eta, extra=NULL) {
mymu = eta2theta(eta[,1], .lmean, earg= .emean)
mysd = eta2theta(eta[,2], .lsd, earg= .esd)
- mymu + mysd * dnorm(-mymu/mysd) / (1-pnorm(-mymu/mysd))
+ mymu + mysd * dnorm(-mymu/mysd) / pnorm(mymu/mysd)
}, list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
last=eval(substitute(expression({
misc$link = c("mean"= .lmean, "sd"= .lsd)
misc$earg = list("mean"= .emean, "sd"= .esd )
misc$expected = TRUE
- }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
+ misc$nsimEIM = .nsimEIM
+ }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd,
+ .nsimEIM=nsimEIM ))),
loglikelihood=eval(substitute(
function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
mymu = eta2theta(eta[,1], .lmean, earg= .emean)
mysd = eta2theta(eta[,2], .lsd, earg= .esd)
if(residuals) stop("loglikelihood residuals not implemented yet") else {
- if(is.R())
- sum(w*(dnorm(y, m=mymu, sd=mysd, log=TRUE) -
- pnorm(-mymu/mysd, log=TRUE, lower.tail=FALSE))) else
- sum(w*(-log(mysd)-0.5*((y-mymu)/mysd)^2 -log1p(-pnorm(-mymu/mysd))))
+
+ sum(w * dposnorm(x=y, m=mymu, sd=mysd, log=TRUE))
}
}, list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
vfamily=c("posnormal1"),
@@ -222,27 +239,52 @@ posnormal1 = function(lmean="identity", lsd="loge",
mysd = eta2theta(eta[,2], .lsd, earg= .esd)
zedd = (y-mymu) / mysd
temp7 = dnorm(-mymu/mysd)
- temp8 = if(is.R()) pnorm(-mymu/mysd, low=FALSE) else 1-pnorm(-mymu/mysd)
- temp8 = temp8 * mysd
- dl.dmu = zedd / mysd - temp7 / temp8
- dl.dsd = (mymu*temp7/temp8 + zedd^2 - 1) / mysd
+ temp8 = pnorm(mymu/mysd) * mysd
+ dl.dmu = zedd / mysd^2 - temp7 / temp8
+ dl.dsd = (mymu*temp7/temp8 + zedd^3 / mysd - 1) / mysd
dmu.deta = dtheta.deta(mymu, .lmean, earg= .emean)
dsd.deta = dtheta.deta(mysd, .lsd, earg= .esd)
- w * cbind(dl.dmu * dmu.deta,
- dl.dsd * dsd.deta)
+ dthetas.detas = cbind(dmu.deta, dsd.deta)
+ w * dthetas.detas * cbind(dl.dmu, dl.dsd)
}), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
weight=eval(substitute(expression({
- wz = matrix(as.numeric(NA), n, dimm(M))
- ed2l.dmu2 = (1 - temp7*mymu/temp8) / mysd^2 - (temp7/temp8)^2
- ed2l.dmusd = (temp7 /(mysd * temp8)) * (1 + (mymu/mysd)^2 +
- mymu*temp7 / temp8)
- ed2l.dsd2 = 2 / mysd^2 - (temp7 * mymu /(mysd^2 * temp8)) *
- (1 + (mymu/mysd)^2 + mymu*temp7/temp8)
- wz[,iam(1,1,M)] = ed2l.dmu2 * dmu.deta^2
- wz[,iam(2,2,M)] = ed2l.dsd2 * dsd.deta^2
- wz[,iam(1,2,M)] = ed2l.dmusd * dsd.deta * dmu.deta
- w * wz
- }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))))
+ run.varcov = 0
+ ind1 = iam(NA, NA, M=M, both=TRUE, diag=TRUE)
+ if(length( .nsimEIM )) {
+ for(ii in 1:( .nsimEIM )) {
+ ysim <- rposnorm(n, m=mymu, sd=mysd)
+ zedd = (ysim-mymu) / mysd
+ temp7 = dnorm(-mymu/mysd)
+ temp8 = pnorm(mymu/mysd) * mysd
+ dl.dmu = zedd / mysd^2 - temp7 / temp8
+ dl.dsd = (mymu*temp7/temp8 + zedd^3 / mysd - 1) / mysd
+
+ rm(ysim)
+ temp3 = matrix(c(dl.dmu, dl.dsd), n, 2)
+ run.varcov = ((ii-1) * run.varcov +
+ temp3[,ind1$row.index]*temp3[,ind1$col.index]) / ii
+ }
+ wz = if(intercept.only)
+ matrix(apply(run.varcov, 2, mean),
+ n, ncol(run.varcov), byrow=TRUE) else run.varcov
+
+ wz = wz * dthetas.detas[,ind1$row] * dthetas.detas[,ind1$col]
+ wz = w * matrix(wz, n, dimm(M))
+ } else {
+ wz = matrix(as.numeric(NA), n, dimm(M))
+ ed2l.dmu2 = (1 - temp7*mymu/temp8) / mysd^2 - (temp7/temp8)^2
+ ed2l.dmusd = (temp7 /(mysd * temp8)) * (1 + (mymu/mysd)^2 +
+ mymu*temp7 / temp8)
+ ed2l.dsd2 = 2 / mysd^2 - (temp7 * mymu /(mysd^2 * temp8)) *
+ (1 + (mymu/mysd)^2 + mymu*temp7/temp8)
+ wz[,iam(1,1,M)] = ed2l.dmu2 * dmu.deta^2
+ wz[,iam(2,2,M)] = ed2l.dsd2 * dsd.deta^2
+ wz[,iam(1,2,M)] = ed2l.dmusd * dsd.deta * dmu.deta
+ wz = w * wz
+ }
+ wz
+ }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd,
+ .nsimEIM=nsimEIM ))))
}
diff --git a/R/family.positive.q b/R/family.positive.q
index 36923fc..a661399 100644
--- a/R/family.positive.q
+++ b/R/family.positive.q
@@ -1,21 +1,108 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
-posnegbinomial = function(lmunb = "loge", lk = "loge",
- emunb =list(), ek = list(),
- ik = NULL, zero = -2, cutoff = 0.995,
- method.init=1)
+
+
+dposnegbin = function(x, size, prob=NULL, munb=NULL, log=FALSE) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+ rm(log)
+
+ L = max(length(x), length(prob), length(size))
+ x = rep(x, len=L); prob = rep(prob, len=L); size = rep(size, len=L);
+
+ ans = dnbinom(x=x, size=size, prob=prob, log=log.arg)
+ index0 = x==0
+
+ if(log.arg) {
+ ans[ index0] = log(0.0)
+ ans[!index0] = ans[!index0] - log1p(-dnbinom(x=0 * x[!index0],
+ size=size[!index0], prob=prob[!index0]))
+ } else {
+ ans[ index0] = 0.0
+ ans[!index0] = ans[!index0] / pnbinom(q=0 * x[!index0],
+ size=size[!index0], prob=prob[!index0], lower.tail=FALSE)
+ }
+ ans
+}
+
+
+pposnegbin = function(q, size, prob=NULL, munb=NULL) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ L = max(length(q), length(prob), length(size))
+ q = rep(q, len=L); prob = rep(prob, len=L); size = rep(size, len=L);
+
+ ifelse(q<1, 0, (pnbinom(q, size=size, prob=prob) -
+ dnbinom(q*0, size=size, prob=prob)) / pnbinom(q*0,
+ size=size, prob=prob, lower.tail = FALSE))
+}
+
+
+qposnegbin = function(p, size, prob=NULL, munb=NULL) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ if(!is.Numeric(p, posit=TRUE) || any(p >= 1))
+ stop("bad input for argument \"p\"")
+ qnbinom(p * pnbinom(q=p*0, size=size, prob=prob, lower.tail = FALSE) +
+ dnbinom(x=p*0, size=size, prob=prob), size=size, prob=prob)
+}
+
+
+rposnegbin = function(n, size, prob=NULL, munb=NULL) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ if(!is.Numeric(n, positive=TRUE, integer=TRUE, allow=1))
+ stop("'n' must be a single positive integer")
+ ans = rnbinom(n, size=size, prob=prob)
+
+ index = (ans == 0)
+ size = rep(size, len=length(ans))
+ prob = rep(prob, len=length(ans))
+ while(any(index)) {
+ more = rnbinom(n=sum(index), size=size[index], prob=prob[index])
+ ans[index] = more
+ index = (ans == 0)
+ }
+ ans
+}
+
+
+
+
+
+
+
+ posnegbinomial = function(lmunb = "loge", lk = "loge",
+ emunb =list(), ek = list(),
+ ik = NULL, zero = -2, cutoff = 0.995,
+ shrinkage.init=0.95, method.init=1)
{
if(!is.Numeric(cutoff, allow=1) || cutoff<0.8 || cutoff>=1)
stop("range error in the argument \"cutoff\"")
if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
- method.init > 3) stop("argument \"method.init\" must be 1, 2 or 3")
+ method.init > 2) stop("argument \"method.init\" must be 1 or 2")
if(length(ik) && !is.Numeric(ik, posit=TRUE))
stop("bad input for argument \"ik\"")
+ if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
+ shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
if(mode(lmunb) != "character" && mode(lmunb) != "name")
lmunb = as.character(substitute(lmunb))
@@ -41,38 +128,38 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
y = as.matrix(y)
M = 2 * ncol(y)
extra$NOS = NOS = ncoly = ncol(y) # Number of species
- predictors.names = c(namesof(if(NOS==1) "munb" else
- paste("munb", 1:NOS, sep=""), .lmunb, earg= .emunb, tag= FALSE),
+ predictors.names = c(
+ namesof(if(NOS==1) "munb" else paste("munb", 1:NOS, sep=""),
+ .lmunb, earg= .emunb, tag= FALSE),
namesof(if(NOS==1) "k" else paste("k", 1:NOS, sep=""),
- .lk, earg= .ek, tag= FALSE))
+ .lk, earg= .ek, tag= FALSE))
predictors.names = predictors.names[interleave.VGAM(M, M=2)]
if(!length(etastart)) {
- if( .method.init == 3) {
- mu.init = y + 1/8
- } else {
- mu.init = y
- for(iii in 1:ncol(y))
- mu.init[,iii] = if( .method.init == 2)
- weighted.mean(y[,iii], w=w) else
- median(rep(y[,iii], w)) + 1/8
+ mu.init = y
+ for(iii in 1:ncol(y)) {
+ use.this = if( .method.init == 2) {
+ weighted.mean(y[,iii], w)
+ } else {
+ median(y[,iii])
+ }
+ mu.init[,iii] = (1- .sinit) * y[,iii] + .sinit * use.this
}
+
if( is.Numeric( .ik )) {
kmat0 = matrix( .ik, nr=n, nc=NOS, byrow=TRUE)
} else {
+ posnegbinomial.Loglikfun =
+ function(kmat, y, x, w, extraargs) {
+ munb = extraargs
+ sum(w * dposnegbin(x=y, size=kmat, munb=munb, log=TRUE))
+ }
+ k.grid = 2^((-6):6)
kmat0 = matrix(0, nr=n, nc=NOS)
- Loglikfun = function(y, munb, kmat, w) {
- p0 = (kmat / (kmat + munb))^kmat
- sum(w * (y * log(munb/(munb+kmat)) + kmat*log(kmat/(munb+kmat)) +
- lgamma(y+kmat) - lgamma(kmat) - lgamma(y+1) -
- (if(is.R()) log1p(-p0) else log1p(-p0)))) }
-
- k.grid = rvar = 2^((-3):6)
for(spp. in 1:NOS) {
- for(ii in 1:length(k.grid))
- rvar[ii] = Loglikfun(y=y[,spp.], mu=mu.init[,spp.],
- kmat=k.grid[ii], w=w)
- try.this = k.grid[rvar == max(rvar)]
- kmat0[,spp.] = try.this
+ kmat0[,spp.] = getMaxMin(k.grid,
+ objfun=posnegbinomial.Loglikfun,
+ y=y[,spp.], x=x, w=w,
+ extraargs= mu.init[,spp.])
}
}
p00 = (kmat0 / (kmat0 + mu.init))^kmat0
@@ -82,6 +169,7 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
}
}), list( .lmunb=lmunb, .lk=lk, .ik=ik,
.emunb=emunb, .ek=ek,
+ .sinit=shrinkage.init,
.method.init=method.init ))),
inverse=eval(substitute(function(eta, extra=NULL) {
NOS = ncol(eta) / 2
@@ -113,11 +201,10 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
NOS = ncol(eta) / 2
munb = eta2theta(eta[,2*(1:NOS)-1,drop=FALSE], .lmunb, earg= .emunb )
kmat = eta2theta(eta[,2*(1:NOS),drop=FALSE], .lk, earg= .ek )
- p0 = (kmat / (kmat + munb))^kmat
- if(residuals) stop("loglikelihood residuals not implemented yet") else
- sum(w * (y * log(munb/(munb+kmat)) + kmat*log(kmat/(munb+kmat)) +
- lgamma(y+kmat) - lgamma(kmat) - lgamma(y+1) -
- (if(is.R()) log1p(-p0) else log1p(-p0))))
+ if(residuals) stop("loglikelihood residuals not implemented yet") else {
+ sum(w * dposnegbin(x=y, size=kmat, munb=munb, log=TRUE))
+ }
+
}, list( .lmunb=lmunb, .lk=lk,
.emunb=emunb, .ek=ek ))),
vfamily=c("posnegbinomial"),
@@ -176,12 +263,20 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
-dpospois = function(x, lambda) {
+
+
+dpospois = function(x, lambda, log=FALSE) {
+ if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+ rm(log)
if(!is.Numeric(lambda, posit=TRUE))
stop("bad input for argument \"lambda\"")
L = max(length(x), length(lambda))
x = rep(x, len=L); lambda = rep(lambda, len=L);
- ans = ifelse(x==0, 0, -dpois(x, lambda) / expm1(-lambda))
+ ans = if(log.arg) {
+ ifelse(x==0, log(0.0), dpois(x, lambda, log=TRUE) - log1p(-exp(-lambda)))
+ } else {
+ ifelse(x==0, 0, -dpois(x, lambda) / expm1(-lambda))
+ }
ans
}
@@ -210,11 +305,11 @@ rpospois = function(n, lambda) {
stop("bad input for argument \"lambda\"")
ans = rpois(n, lambda)
lambda = rep(lambda, len=n)
- index = ans == 0
+ index = (ans == 0)
while(any(index)) {
more = rpois(sum(index), lambda[index])
ans[index] = more
- index = ans == 0
+ index = (ans == 0)
}
ans
}
@@ -222,8 +317,8 @@ rpospois = function(n, lambda) {
-pospoisson = function(link="loge", earg=list(), expected=TRUE,
- ilambda=NULL, method.init=1)
+ pospoisson = function(link="loge", earg=list(), expected=TRUE,
+ ilambda=NULL, method.init=1)
{
if(!missing(link))
link = as.character(substitute(link))
@@ -233,7 +328,7 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
if(length( ilambda) && !is.Numeric(ilambda, posit=TRUE))
stop("bad input for argument \"ilambda\"")
if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
- method.init > 2) stop("argument \"method.init\" must be 1 or 2")
+ method.init > 3) stop("argument \"method.init\" must be 1 or 2 or 3")
new("vglmff",
blurb=c("Positive-Poisson distribution\n\n",
@@ -242,18 +337,27 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
"\n"),
initialize=eval(substitute(expression({
y = as.matrix(y)
+ if(any(y < 1))
+ stop("all y values must be in 1,2,3,...")
+ if(any(y != round(y )))
+ stop("the response must be integer-valued")
+
predictors.names = namesof(if(ncol(y)==1) "lambda"
else paste("lambda", 1:ncol(y), sep=""), .link,
earg= .earg, tag=FALSE)
if( .method.init == 1) {
- lambda.init = apply(y, 2, weighted.mean, w=w)
+ lambda.init = apply(y, 2, median) + 1/8
+ lambda.init = matrix(lambda.init, n, ncol(y), byrow=TRUE)
+ } else if( .method.init == 2) {
+ lambda.init = apply(y, 2, weighted.mean, w=w) + 1/8
lambda.init = matrix(lambda.init, n, ncol(y), byrow=TRUE)
} else {
lambda.init = -y / expm1(-y)
}
+ if(length( .ilambda))
+ lambda.init = lambda.init*0 + .ilambda
if(!length(etastart))
- etastart = theta2eta(if(length( .ilambda)) (y*0 + .ilambda) else
- lambda.init, .link, earg= .earg)
+ etastart = theta2eta(lambda.init, .link, earg= .earg)
}), list( .link=link, .earg= earg,
.ilambda=ilambda, .method.init=method.init ))),
inverse=eval(substitute(function(eta, extra=NULL) {
@@ -272,8 +376,9 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
loglikelihood=eval(substitute(
function(mu,y,w,residuals=FALSE, eta,extra=NULL) {
lambda = eta2theta(eta, .link, earg= .earg )
- if(residuals) stop("loglikelihood residuals not implemented yet") else
- sum(w * (y*log(lambda) - log1p(-exp(-lambda)) - lambda))
+ if(residuals) stop("loglikelihood residuals not implemented yet") else {
+ sum(w * dpospois(x=y, lambda=lambda, log=TRUE))
+ }
}, list( .link=link, .earg= earg ))),
vfamily=c("pospoisson"),
deriv=eval(substitute(expression({
@@ -298,8 +403,8 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
-posbinomial = function(link="logit", earg=list())
-{
+
+ posbinomial = function(link="logit", earg=list()) {
if(!missing(link))
link = as.character(substitute(link))
@@ -311,14 +416,20 @@ posbinomial = function(link="logit", earg=list())
namesof("p", link, earg= earg, tag=FALSE), "\n"),
initialize=eval(substitute(expression({
eval(binomialff(link= .link)@initialize)
+ yint = round(y*w)
+ if(max(abs(yint - y*w)) > 0.0001)
+ warning("rounding y*w to an integer")
+ if(any(y <= 0))
+ stop("the response must only contain positive values")
predictors.names = namesof("p", .link, earg= .earg , tag=FALSE)
if(length(extra)) extra$w = w else extra = list(w=w)
if(!length(etastart))
etastart = cbind(theta2eta(mustart, .link, earg= .earg ))
}), list( .link = link, .earg=earg ))),
- inverse=eval(substitute(function(eta, extra=NULL){
- theta = eta2theta(eta, .link, earg= .earg )
- theta/(1-(1-theta)^(extra$w))},
+ inverse=eval(substitute(function(eta, extra=NULL) {
+ mymu = eta2theta(eta, .link, earg= .earg )
+ mymu / (1-(1-mymu)^(extra$w))
+ },
list(.link=link, .earg=earg ))),
last=eval(substitute(expression({
extra$w = NULL # Kill it off
@@ -327,27 +438,32 @@ posbinomial = function(link="logit", earg=list())
}), list( .link=link, .earg=earg ))),
loglikelihood=eval(substitute(
function(mu,y,w,residuals=FALSE,eta,extra=NULL) {
- yi = round(y*w)
- theta = eta2theta(eta, .link, earg= .earg )
- if(residuals) stop("loglikelihood residuals not implemented yet") else
- sum(yi*log(theta)+(w-yi)*log1p(-theta)-log1p(-(1-theta)^w))
+ yint = round(y*w)
+ mymu = eta2theta(eta, .link, earg= .earg )
+ if(max(abs(w - round(w))) > 0.0001) {
+ warning("rounding w to an integer")
+ w = round(w)
+ }
+ if(residuals) stop("loglikelihood residuals not implemented yet") else {
+ sum(w * dposbinom(x=yint, size=w, prob=mymu, log=TRUE))
+ }
}, list( .link=link, .earg=earg ))),
vfamily=c("posbinomial"),
deriv=eval(substitute(expression({
- yi = round(y*w)
- theta = eta2theta(eta, .link, earg= .earg )
- dldtheta = yi/theta-(w-yi)/(1-theta)-w*(1-theta)^(w-1) /
- (1-(1-theta)^w)
- dthetadeta = dtheta.deta(theta, .link, earg= .earg )
- dldtheta * dthetadeta
+ yint = round(y*w)
+ mymu = eta2theta(eta, .link, earg= .earg )
+ dl.dmymu = yint/mymu - (w-yint)/(1-mymu) -
+ w*(1-mymu)^(w-1) / (1-(1-mymu)^w)
+ dmymu.deta = dtheta.deta(mymu, .link, earg= .earg )
+ dl.dmymu * dmymu.deta
}), list( .link=link, .earg=earg ))),
weight=eval(substitute(expression({
- temp = 1 - (1-theta)^w
- temp2 = (1-theta)^2
- ed2ldtheta2 = -w/(theta*temp) - w/temp2 + w*theta/(temp2*temp) +
- w*(w-1)* (1-theta)^(w-2) /temp +
+ temp = 1 - (1-mymu)^w
+ temp2 = (1-mymu)^2
+ ed2l.dmymu2 = -w/(mymu*temp) - w/temp2 + w*mymu/(temp2*temp) +
+ w * (w-1) * (1-mymu)^(w-2) /temp +
w^2 * temp2^(w-1) / temp^2
- wz = -(dthetadeta^2) * ed2ldtheta2
+ wz = -(dmymu.deta^2) * ed2l.dmymu2
wz
}), list( .link=link, .earg=earg ))))
}
@@ -355,14 +471,25 @@ posbinomial = function(link="logit", earg=list())
dposbinom = function(x, size, prob, log = FALSE) {
- if(!is.Numeric(prob, positive=TRUE))
- stop("no zero or non-numeric values allowed for argument \"prob\"")
+ log.arg = log
+ rm(log)
L = max(length(x), length(size), length(prob))
x = rep(x, len=L); size = rep(size, len=L); prob = rep(prob, len=L);
- ifelse(x==0, 0, dbinom(x=x, size=size, prob=prob, log=log) /
- (1 - (1-prob)^size))
-}
+ answer = NaN * x
+ is0 <- (x == 0)
+ ok2 <- prob > 0 & prob <= 1 & size == round(size) & size > 0
+ answer = dbinom(x=x, size=size, prob=prob, log=TRUE) -
+ log1p(-dbinom(x=0*x, size=size, prob=prob))
+ answer[!ok2] = NaN
+ if(log.arg) {
+ answer[is0 & ok2] = log(0.0)
+ } else {
+ answer = exp(answer)
+ answer[is0 & ok2] = 0.0
+ }
+ answer
+}
pposbinom = function(q, size, prob, lower.tail = TRUE, log.p = FALSE) {
if(!is.Numeric(prob, positive=TRUE))
@@ -382,20 +509,19 @@ qposbinom = function(p, size, prob, lower.tail = TRUE, log.p = FALSE) {
lower.tail=lower.tail, log.p=log.p)
}
-
rposbinom = function(n, size, prob) {
if(!is.Numeric(n, posit=TRUE, allow=1, integ=TRUE))
stop("bad input for argument \"n\"")
if(!is.Numeric(prob, positive=TRUE))
stop("no zero or non-numeric values allowed for argument \"prob\"")
ans = rbinom(n=n, size=size, prob=prob)
- index = ans == 0
+ index = (ans == 0)
size = rep(size, len=length(ans))
prob = rep(prob, len=length(ans))
while(any(index)) {
more = rbinom(n=sum(index), size[index], prob=prob[index])
ans[index] = more
- index = ans == 0
+ index = (ans == 0)
}
ans
}
diff --git a/R/family.qreg.q b/R/family.qreg.q
index df8db5b..e299857 100644
--- a/R/family.qreg.q
+++ b/R/family.qreg.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -21,29 +21,37 @@ lms.yjn.control <- function(trace=TRUE, ...)
lms.bcn <- function(percentiles=c(25,50,75),
- zero=NULL,
- link.mu="identity",
- link.sigma="loge",
- emu=list(), esigma=list(),
+ zero=c(1,3),
+ llambda="identity",
+ lmu="identity",
+ lsigma="loge",
+ elambda=list(), emu=list(), esigma=list(),
dfmu.init=4,
dfsigma.init=2,
- init.lambda=1,
- init.sigma=NULL)
+ ilambda=1,
+ isigma=NULL)
{
- if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
- link.sigma = as.character(substitute(link.sigma))
- if(mode(link.mu) != "character" && mode(link.mu) != "name")
- link.mu = as.character(substitute(link.mu))
+ if(mode(llambda) != "character" && mode(llambda) != "name")
+ llambda = as.character(substitute(llambda))
+ if(mode(lmu) != "character" && mode(lmu) != "name")
+ lmu = as.character(substitute(lmu))
+ if(mode(lsigma) != "character" && mode(lsigma) != "name")
+ lsigma = as.character(substitute(lsigma))
+ if(!is.list(elambda)) elambda = list()
if(!is.list(emu)) emu = list()
if(!is.list(esigma)) esigma = list()
+ if(!is.Numeric(ilambda))
+ stop("bad input for argument 'ilambda'")
+ if(length(isigma) && !is.Numeric(isigma, posit=TRUE))
+ stop("bad input for argument 'isigma'")
new("vglmff",
blurb=c("LMS Quantile Regression ",
"(Box-Cox transformation to normality)\n",
"Links: ",
- "lambda", ", ",
- namesof("mu", link=link.mu, earg= emu), ", ",
- namesof("sigma", link=link.sigma, earg= esigma)),
+ namesof("lambda", link=llambda, earg= elambda), ", ",
+ namesof("mu", link=lmu, earg= emu), ", ",
+ namesof("sigma", link=lsigma, earg= esigma)),
constraints=eval(substitute(expression({
constraints = cm.zero.vgam(constraints, x, .zero, M)
}), list(.zero=zero))),
@@ -54,17 +62,17 @@ lms.bcn <- function(percentiles=c(25,50,75),
stop("negative responses not allowed")
predictors.names =
- c(namesof("lambda", "identity"),
- namesof("mu", .link.mu, earg= .emu, short= TRUE),
- namesof("sigma", .link.sigma, earg= .esigma, short= TRUE))
+ c(namesof("lambda", .llambda, earg= .elambda, short= TRUE),
+ namesof("mu", .lmu, earg= .emu, short= TRUE),
+ namesof("sigma", .lsigma, earg= .esigma, short= TRUE))
if(!length(etastart)) {
fit500=vsmooth.spline(x=x[,min(ncol(x),2)],y=y,w=w, df= .dfmu.init)
fv.init = c(predict(fit500, x=x[,min(ncol(x),2)])$y)
- lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.0
- sigma.init = if(is.null(.init.sigma)) {
+ lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.0
+ sigma.init = if(is.null(.isigma)) {
myratio = ((y/fv.init)^lambda.init - 1) / lambda.init
if(is.Numeric( .dfsigma.init)) {
fit600 = vsmooth.spline(x=x[,min(ncol(x),2)], y=myratio^2,
@@ -72,113 +80,112 @@ lms.bcn <- function(percentiles=c(25,50,75),
sqrt(c(abs(predict(fit600, x=x[,min(ncol(x),2)])$y)))
} else
sqrt(var(myratio))
- } else .init.sigma
+ } else .isigma
- etastart = cbind(lambda.init,
- theta2eta(fv.init, .link.mu, earg= .emu),
- theta2eta(sigma.init, .link.sigma, earg= .esigma))
+ etastart = cbind(theta2eta(lambda.init, .llambda, earg= .elambda),
+ theta2eta(fv.init, .lmu, earg= .emu),
+ theta2eta(sigma.init, .lsigma, earg= .esigma))
}
- }), list(.link.sigma=link.sigma,
- .link.mu=link.mu,
- .esigma=esigma, .emu=emu,
- .dfmu.init=dfmu.init,
- .dfsigma.init=dfsigma.init,
- .init.lambda=init.lambda,
- .init.sigma=init.sigma))),
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma,
+ .dfmu.init=dfmu.init,
+ .dfsigma.init=dfsigma.init,
+ .ilambda=ilambda, .isigma=isigma ))),
inverse=eval(substitute(function(eta, extra=NULL) {
- eta[,2] = eta2theta(eta[,2], .link.mu, earg= .emu)
- eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+ eta[,2] = eta2theta(eta[,2], .lmu, earg= .emu)
+ eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
qtplot.lms.bcn(percentiles= .percentiles, eta=eta)
- }, list(.percentiles=percentiles,
- .link.mu=link.mu,
- .esigma=esigma, .emu=emu,
- .link.sigma=link.sigma))),
+ }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma,
+ .percentiles=percentiles ))),
last=eval(substitute(expression({
misc$percentiles = .percentiles
- misc$links = c(lambda = "identity", mu = .link.mu, sigma = .link.sigma)
- misc$earg = list(lambda = list(), mu = .emu, sigma = .esigma)
+ misc$links = c(lambda = .llambda, mu = .lmu, sigma = .lsigma)
+ misc$earg = list(lambda = .elambda, mu = .emu, sigma = .esigma)
misc$true.mu = FALSE # $fitted is not a true mu
if(control$cdf) {
post$cdf = cdf.lms.bcn(y, eta0=matrix(c(lambda,mymu,sigma),
ncol=3, dimnames=list(dimnames(x)[[1]], NULL)))
}
- }), list(.percentiles=percentiles,
- .link.mu=link.mu,
- .esigma=esigma, .emu=emu,
- .link.sigma=link.sigma))),
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma,
+ .percentiles=percentiles ))),
loglikelihood=eval(substitute(
function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
- lambda = eta[,1]
- mu = eta2theta(eta[,2], .link.mu, earg= .emu)
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+ mu = eta2theta(eta[,2], .lmu, earg= .emu)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
z = ((y/mu)^lambda - 1) / (lambda * sigma)
if(residuals) stop("loglikelihood residuals not implemented yet") else
sum(w * (lambda * log(y/mu) - log(sigma) - 0.5*z^2))
- }, list(.link.sigma=link.sigma,
- .esigma=esigma, .emu=emu,
- .link.mu=link.mu))),
+ }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma ))),
vfamily=c("lms.bcn", "lmscreg"),
deriv=eval(substitute(expression({
- lambda = eta[,1]
- mymu = eta2theta(eta[,2], .link.mu, earg= .emu)
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+ mymu = eta2theta(eta[,2], .lmu, earg= .emu)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
z = ((y/mymu)^lambda - 1) / (lambda * sigma)
z2m1 = z * z - 1
- d1 = z*(z - log(y/mymu) / sigma) / lambda - z2m1 * log(y/mymu)
- d2 = z / (mymu * sigma) + z2m1 * lambda / mymu
- d2 = d2 * dtheta.deta(mymu, .link.mu, earg= .emu)
- d3 = z2m1 / sigma
- d3 = d3 * dtheta.deta(sigma, .link.sigma, earg= .esigma)
- w * cbind(d1, d2, d3)
- }), list(.link.sigma=link.sigma, .link.mu=link.mu,
- .esigma=esigma, .emu=emu ))),
+ dl.dlambda = z*(z - log(y/mymu) / sigma) / lambda - z2m1 * log(y/mymu)
+ dl.dmu = z / (mymu * sigma) + z2m1 * lambda / mymu
+ dl.dsigma = z2m1 / sigma
+ dlambda.deta = dtheta.deta(lambda, .llambda, earg= .elambda)
+ dmu.deta = dtheta.deta(mymu, .lmu, earg= .emu)
+ dsigma.deta = dtheta.deta(sigma, .lsigma, earg= .esigma)
+ w * cbind(dl.dlambda * dlambda.deta,
+ dl.dmu * dmu.deta,
+ dl.dsigma * dsigma.deta)
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma ))),
weight=eval(substitute(expression({
wz = matrix(as.numeric(NA), n, 6)
- wz[,iam(1,1,M)] = (7 * sigma^2 / 4)
- wz[,iam(2,2,M)] = (1 + 2*(lambda * sigma)^2) / (mymu*sigma)^2 *
- dtheta.deta(mymu, .link.mu, earg= .emu)^2
- wz[,iam(3,3,M)] = (2 / sigma^2) *
- dtheta.deta(sigma, .link.sigma, earg= .esigma)^2
- wz[,iam(1,2,M)] = (-1 / (2 * mymu)) *
- dtheta.deta(mymu, .link.mu, earg= .emu)
- wz[,iam(1,3,M)] = (lambda * sigma) *
- dtheta.deta(sigma, .link.sigma, earg= .esigma)
- wz[,iam(2,3,M)] = (2 * lambda / (mymu * sigma)) *
- dtheta.deta(sigma, .link.sigma, earg= .esigma) *
- dtheta.deta(mymu, .link.mu, earg= .emu)
+ wz[,iam(1,1,M)] = (7 * sigma^2 / 4) * dlambda.deta^2
+ wz[,iam(2,2,M)] = (1 + 2*(lambda*sigma)^2)/(mymu*sigma)^2 * dmu.deta^2
+ wz[,iam(3,3,M)] = (2 / sigma^2) * dsigma.deta^2
+ wz[,iam(1,2,M)] = (-1 / (2 * mymu)) * dlambda.deta * dmu.deta
+ wz[,iam(1,3,M)] = (lambda * sigma) * dlambda.deta * dsigma.deta
+ wz[,iam(2,3,M)] = (2*lambda/(mymu * sigma)) * dmu.deta * dsigma.deta
wz * w
- }), list(.link.sigma=link.sigma, .link.mu=link.mu,
- .esigma=esigma, .emu=emu ))))
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma ))))
}
lms.bcg = function(percentiles=c(25,50,75),
- zero=NULL,
- link.mu="identity",
- link.sigma="loge",
- emu=list(), esigma=list(),
- dfmu.init=4,
- dfsigma.init=2,
- init.lambda=1,
- init.sigma=NULL)
+ zero=c(1,3),
+ llambda="identity",
+ lmu="identity",
+ lsigma="loge",
+ elambda=list(), emu=list(), esigma=list(),
+ dfmu.init=4,
+ dfsigma.init=2,
+ ilambda=1,
+ isigma=NULL)
{
- if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
- link.sigma = as.character(substitute(link.sigma))
- if(mode(link.mu) != "character" && mode(link.mu) != "name")
- link.mu = as.character(substitute(link.mu))
+ if(mode(llambda) != "character" && mode(llambda) != "name")
+ llambda = as.character(substitute(llambda))
+ if(mode(lmu) != "character" && mode(lmu) != "name")
+ lmu = as.character(substitute(lmu))
+ if(mode(lsigma) != "character" && mode(lsigma) != "name")
+ lsigma = as.character(substitute(lsigma))
+ if(!is.list(elambda)) elambda = list()
if(!is.list(emu)) emu = list()
if(!is.list(esigma)) esigma = list()
+ if(!is.Numeric(ilambda))
+ stop("bad input for argument 'ilambda'")
+ if(length(isigma) && !is.Numeric(isigma, posit=TRUE))
+ stop("bad input for argument 'isigma'")
new("vglmff",
blurb=c("LMS Quantile Regression ",
"(Box-Cox transformation to a Gamma distribution)\n",
"Links: ",
- "lambda",
- ", ",
- namesof("mu", link=link.mu, earg= emu),
- ", ",
- namesof("sigma", link=link.sigma, earg= esigma)),
+ namesof("lambda", link=llambda, earg= elambda), ", ",
+ namesof("mu", link=lmu, earg= emu), ", ",
+ namesof("sigma", link=lsigma, earg= esigma)),
constraints=eval(substitute(expression({
constraints = cm.zero.vgam(constraints, x, .zero, M)
}), list(.zero=zero))),
@@ -188,18 +195,19 @@ lms.bcg = function(percentiles=c(25,50,75),
if(any(y<0, na.rm = TRUE))
stop("negative responses not allowed")
- predictors.names = c(namesof("lambda", "identity"),
- namesof("mu", .link.mu, earg= .emu, short=TRUE),
- namesof("sigma", .link.sigma, earg= .esigma, short=TRUE))
+ predictors.names = c(
+ namesof("lambda", .llambda, earg= .elambda, short=TRUE),
+ namesof("mu", .lmu, earg= .emu, short=TRUE),
+ namesof("sigma", .lsigma, earg= .esigma, short=TRUE))
if(!length(etastart)) {
fit500=vsmooth.spline(x=x[,min(ncol(x),2)],y=y,w=w, df= .dfmu.init)
fv.init = c(predict(fit500, x=x[,min(ncol(x),2)])$y)
- lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.0
+ lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.0
- sigma.init = if(is.null(.init.sigma)) {
+ sigma.init = if(is.null(.isigma)) {
myratio=((y/fv.init)^lambda.init-1)/lambda.init #~(0,var=sigma^2)
if(is.numeric( .dfsigma.init) && is.finite( .dfsigma.init)) {
fit600 = vsmooth.spline(x=x[,min(ncol(x),2)],
@@ -208,100 +216,97 @@ lms.bcg = function(percentiles=c(25,50,75),
sqrt(c(abs(predict(fit600, x=x[,min(ncol(x),2)])$y)))
} else
sqrt(var(myratio))
- } else .init.sigma
+ } else .isigma
- etastart = cbind(lambda.init,
- theta2eta(fv.init, .link.mu, earg= .emu),
- theta2eta(sigma.init, .link.sigma, earg= .esigma))
+ etastart = cbind(theta2eta(lambda.init, .llambda, earg= .elambda),
+ theta2eta(fv.init, .lmu, earg= .emu),
+ theta2eta(sigma.init, .lsigma, earg= .esigma))
}
- }), list(.link.sigma=link.sigma,
- .link.mu=link.mu,
- .esigma=esigma, .emu=emu,
- .dfmu.init=dfmu.init,
- .dfsigma.init=dfsigma.init,
- .init.lambda=init.lambda,
- .init.sigma=init.sigma))),
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma,
+ .dfmu.init=dfmu.init,
+ .dfsigma.init=dfsigma.init,
+ .ilambda=ilambda, .isigma=isigma ))),
inverse=eval(substitute(function(eta, extra=NULL) {
- eta[,2] = eta2theta(eta[,2], .link.mu, earg= .emu)
- eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+ eta[,2] = eta2theta(eta[,2], .lmu, earg= .emu)
+ eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
qtplot.lms.bcg(percentiles= .percentiles, eta=eta)
- }, list(.percentiles=percentiles,
- .link.mu=link.mu,
- .esigma=esigma, .emu=emu,
- .link.sigma=link.sigma))),
+ }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma,
+ .percentiles=percentiles ))),
last=eval(substitute(expression({
misc$percentiles = .percentiles
- misc$link = c(lambda = "identity", mu = .link.mu, sigma = .link.sigma)
- misc$earg = list(lambda = list(), mu = .emu, sigma = .esigma)
+ misc$link = c(lambda = .llambda, mu = .lmu, sigma = .lsigma)
+ misc$earg = list(lambda = .elambda, mu = .emu, sigma = .esigma)
misc$true.mu = FALSE # $fitted is not a true mu
if(control$cdf) {
post$cdf = cdf.lms.bcg(y, eta0=matrix(c(lambda,mymu,sigma),
ncol=3, dimnames=list(dimnames(x)[[1]], NULL)))
}
- }), list(.percentiles=percentiles,
- .link.mu=link.mu,
- .esigma=esigma, .emu=emu,
- .link.sigma=link.sigma))),
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma,
+ .percentiles=percentiles ))),
loglikelihood=eval(substitute(
function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
- lambda = eta[,1]
- mu = eta2theta(eta[,2], .link.mu, earg= .emu)
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+ mu = eta2theta(eta[,2], .lmu, earg= .emu)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
g = (y/mu)^lambda
theta = 1 / (sigma * lambda)^2
if(residuals) stop("loglikelihood residuals not implemented yet") else
sum(w * (log(abs(lambda)) + theta*(log(theta)+log(g)-g) -
lgamma(theta) - log(y)))
- }, list(.link.sigma=link.sigma,
- .esigma=esigma, .emu=emu,
- .link.mu=link.mu))),
+ }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma ))),
vfamily=c("lms.bcg", "lmscreg"),
deriv=eval(substitute(expression({
- lambda = eta[,1]
- mymu = eta2theta(eta[,2], .link.mu, earg= .emu)
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+ mymu = eta2theta(eta[,2], .lmu, earg= .emu)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
g = (y/mymu)^lambda
theta = 1 / (sigma * lambda)^2
dd = digamma(theta)
- dl.dlambda = (1 + 2*theta*(dd+g-1-log(theta) -
- 0.5 * (g+1)*log(g))) / lambda
+ dl.dlambda = (1 + 2*theta*(dd+g-1-log(theta)-0.5*(g+1)*log(g)))/lambda
dl.dmu = lambda * theta * (g-1) / mymu
dl.dsigma = 2*theta*(dd+g-log(theta * g)-1) / sigma
- dsigma.deta = dtheta.deta(sigma, link=.link.sigma, earg= .esigma)
+ dlambda.deta = dtheta.deta(lambda, link=.llambda, earg= .elambda)
+ dmu.deta = dtheta.deta(mymu, link=.lmu, earg= .emu)
+ dsigma.deta = dtheta.deta(sigma, link=.lsigma, earg= .esigma)
- cbind(dl.dlambda,
- dl.dmu * dtheta.deta(mymu, link= .link.mu, earg= .emu),
- dl.dsigma * dsigma.deta) * w
- }), list(.link.sigma=link.sigma, .link.mu=link.mu,
- .esigma=esigma, .emu=emu ))),
+ cbind(dl.dlambda * dlambda.deta,
+ dl.dmu * dmu.deta,
+ dl.dsigma * dsigma.deta) * w
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma ))),
weight=eval(substitute(expression({
- tt = trigamma(theta)
-
+ tritheta = trigamma(theta)
wz = matrix(0, n, 6)
if(TRUE) {
part2 = dd + 2/theta - 2*log(theta)
- wz[,iam(1,1,M)] = (1 + theta*(tt*(1+4*theta) - 4*(1+1/theta) -
- log(theta)*(2/theta - log(theta)) + dd*part2)) / lambda^2
+ wz[,iam(1,1,M)] = ((1 + theta*(tritheta*(1+4*theta) -
+ 4*(1+1/theta) - log(theta)*(2/theta -
+ log(theta)) + dd*part2)) / lambda^2) *
+ dlambda.deta^2
} else {
temp = mean( g*(log(g))^2 )
- wz[,iam(1,1,M)] = (4*theta*(theta*tt-1) -1+ theta*temp)/lambda^2
+ wz[,iam(1,1,M)] = ((4*theta*(theta*tritheta-1) -1 +
+ theta*temp)/lambda^2) *
+ dlambda.deta^2
}
- wz[,iam(2,2,M)] = 1 / (mymu*sigma)^2 *
- dtheta.deta(mymu, .link.mu, earg= .emu)^2
- wz[,iam(3,3,M)] = (4*theta*(theta*tt-1) / sigma^2) *
- dtheta.deta(sigma, .link.sigma, earg= .esigma)^2
- wz[,iam(1,2,M)] = -theta * (dd + 1/theta - log(theta)) / mymu
- wz[,iam(1,2,M)] = wz[,iam(1,2,M)] *
- dtheta.deta(mymu, .link.mu, earg= .emu)
- wz[,iam(1,3,M)] = 2 * theta^1.5 * (2 * theta * tt - 2 -
- 1/theta) * dtheta.deta(sigma, .link.sigma, earg= .esigma)
+ wz[,iam(2,2,M)] = dmu.deta^2 / (mymu*sigma)^2
+ wz[,iam(3,3,M)] = (4*theta*(theta*tritheta-1)/sigma^2) * dsigma.deta^2
+ wz[,iam(1,2,M)] = (-theta * (dd + 1/theta - log(theta)) / mymu) *
+ dlambda.deta * dmu.deta
+ wz[,iam(1,3,M)] = 2 * theta^1.5 * (2 * theta * tritheta - 2 -
+ 1/theta) * dlambda.deta * dsigma.deta
wz * w
- }), list(.link.sigma=link.sigma, .link.mu=link.mu,
- .esigma=esigma, .emu=emu ))))
+ }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+ .elambda=elambda, .emu=emu, .esigma=esigma ))))
}
@@ -532,38 +537,42 @@ lms.yjn2.control <- function(save.weight=TRUE, ...)
}
lms.yjn2 = function(percentiles=c(25,50,75),
- zero=NULL,
- link.lambda="identity",
- link.mu="identity",
- link.sigma="loge",
+ zero=c(1,3),
+ llambda="identity",
+ lmu="identity",
+ lsigma="loge",
elambda=list(), emu=list(), esigma=list(),
dfmu.init=4,
dfsigma.init=2,
- init.lambda=1.0,
- init.sigma=NULL,
+ ilambda=1.0,
+ isigma=NULL,
yoffset=NULL,
nsimEIM=250)
{
- if(mode(link.lambda) != "character" && mode(link.lambda) != "name")
- link.lambda = as.character(substitute(link.lambda))
- if(mode(link.mu) != "character" && mode(link.mu) != "name")
- link.mu = as.character(substitute(link.mu))
- if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
- link.sigma = as.character(substitute(link.sigma))
+ if(mode(llambda) != "character" && mode(llambda) != "name")
+ llambda = as.character(substitute(llambda))
+ if(mode(lmu) != "character" && mode(lmu) != "name")
+ lmu = as.character(substitute(lmu))
+ if(mode(lsigma) != "character" && mode(lsigma) != "name")
+ lsigma = as.character(substitute(lsigma))
if(!is.list(elambda)) elambda = list()
if(!is.list(emu)) emu = list()
if(!is.list(esigma)) esigma = list()
+ if(!is.Numeric(ilambda))
+ stop("bad input for argument 'ilambda'")
+ if(length(isigma) && !is.Numeric(isigma, posit=TRUE))
+ stop("bad input for argument 'isigma'")
new("vglmff",
blurb=c("LMS Quantile Regression (Yeo-Johnson transformation",
" to normality)\n",
"Links: ",
- namesof("lambda", link=link.lambda, earg= elambda),
+ namesof("lambda", link=llambda, earg= elambda),
", ",
- namesof("mu", link=link.mu, earg= emu),
+ namesof("mu", link=lmu, earg= emu),
", ",
- namesof("sigma", link=link.sigma, earg= esigma)),
+ namesof("sigma", link=lsigma, earg= esigma)),
constraints=eval(substitute(expression({
constraints = cm.zero.vgam(constraints, x, .zero, M)
}), list(.zero=zero))),
@@ -571,9 +580,9 @@ lms.yjn2 = function(percentiles=c(25,50,75),
if(ncol(cbind(y)) != 1)
stop("response must be a vector or a one-column matrix")
predictors.names =
- c(namesof("lambda", .link.lambda, earg= .elambda, short= TRUE),
- namesof("mu", .link.mu, earg= .emu, short= TRUE),
- namesof("sigma", .link.sigma, earg= .esigma, short= TRUE))
+ c(namesof("lambda", .llambda, earg= .elambda, short= TRUE),
+ namesof("mu", .lmu, earg= .emu, short= TRUE),
+ namesof("sigma", .lsigma, earg= .esigma, short= TRUE))
y.save = y
yoff = if(is.Numeric( .yoffset)) .yoffset else -median(y)
@@ -581,7 +590,7 @@ lms.yjn2 = function(percentiles=c(25,50,75),
y = y + yoff
if(!length(etastart)) {
- lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.
+ lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.
y.tx = yeo.johnson(y, lambda.init)
fv.init =
@@ -593,7 +602,7 @@ lms.yjn2 = function(percentiles=c(25,50,75),
rep(weighted.mean(y, w), len=n)
}
- sigma.init = if(!is.Numeric(.init.sigma)) {
+ sigma.init = if(!is.Numeric(.isigma)) {
if(is.Numeric( .dfsigma.init) && smoothok) {
fit710 = vsmooth.spline(x=x[,min(ncol(x),2)],
y=(y.tx - fv.init)^2,
@@ -604,34 +613,34 @@ lms.yjn2 = function(percentiles=c(25,50,75),
sqrt( sum( w * (y.tx - fv.init)^2 ) / sum(w) )
}
} else
- .init.sigma
+ .isigma
etastart = matrix(0, n, 3)
- etastart[,1] = theta2eta(lambda.init, .link.lambda, earg=.elambda)
- etastart[,2] = theta2eta(fv.init, .link.mu, earg=.emu)
- etastart[,3] = theta2eta(sigma.init, .link.sigma, earg=.esigma)
+ etastart[,1] = theta2eta(lambda.init, .llambda, earg=.elambda)
+ etastart[,2] = theta2eta(fv.init, .lmu, earg=.emu)
+ etastart[,3] = theta2eta(sigma.init, .lsigma, earg=.esigma)
}
- }), list(.link.lambda=link.lambda, .link.mu=link.mu, .link.sigma=link.sigma,
+ }), list(.llambda=llambda, .lmu=lmu, .lsigma=lsigma,
.elambda=elambda, .emu=emu, .esigma=esigma,
.dfmu.init=dfmu.init,
.dfsigma.init=dfsigma.init,
- .init.lambda=init.lambda,
+ .ilambda=ilambda,
.yoffset=yoffset,
- .init.sigma=init.sigma))),
+ .isigma=isigma))),
inverse=eval(substitute(function(eta, extra=NULL) {
- eta[,1] = eta2theta(eta[,1], .link.lambda, earg= .elambda)
- eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+ eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
qtplot.lms.yjn(percentiles= .percentiles, eta=eta, yoffset= extra$yoff)
}, list(.percentiles=percentiles,
.esigma=esigma, .elambda=elambda,
- .link.lambda=link.lambda,
- .link.sigma=link.sigma))),
+ .llambda=llambda,
+ .lsigma=lsigma))),
last=eval(substitute(expression({
misc$expected = TRUE
misc$nsimEIM = .nsimEIM
misc$percentiles = .percentiles
- misc$link = c(lambda= .link.lambda, mu= .link.mu, sigma= .link.sigma)
+ misc$link = c(lambda= .llambda, mu= .lmu, sigma= .lsigma)
misc$earg = list(lambda = .elambda, mu = .emu, sigma = .esigma)
misc$true.mu = FALSE # $fitted is not a true mu
misc[["yoffset"]] = extra$yoffset
@@ -646,27 +655,27 @@ lms.yjn2 = function(percentiles=c(25,50,75),
}), list(.percentiles=percentiles,
.elambda=elambda, .emu=emu, .esigma=esigma,
.nsimEIM=nsimEIM,
- .link.lambda=link.lambda, .link.mu=link.mu, .link.sigma=link.sigma ))),
+ .llambda=llambda, .lmu=lmu, .lsigma=lsigma ))),
loglikelihood=eval(substitute(
function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
- lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
- mu = eta2theta(eta[,2], .link.mu, earg= .emu)
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+ mu = eta2theta(eta[,2], .lmu, earg= .emu)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
psi = yeo.johnson(y, lambda)
if(residuals) stop("loglikelihood residuals not implemented yet") else
sum(w * (-log(sigma) - 0.5 * ((psi-mu)/sigma)^2 +
(lambda-1) * sign(y) * log1p(abs(y))))
}, list( .elambda=elambda, .emu=emu, .esigma=esigma,
- .link.lambda=link.lambda, .link.mu=link.mu,
- .link.sigma=link.sigma ))),
+ .llambda=llambda, .lmu=lmu,
+ .lsigma=lsigma ))),
vfamily=c("lms.yjn2", "lmscreg"),
deriv=eval(substitute(expression({
- lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
- mymu = eta2theta(eta[,2], .link.mu, earg= .emu)
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
- dlambda.deta = dtheta.deta(lambda, link=.link.lambda, earg= .elambda)
- dmu.deta = dtheta.deta(mymu, link=.link.mu, earg= .emu)
- dsigma.deta = dtheta.deta(sigma, link=.link.sigma, earg= .esigma)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+ mymu = eta2theta(eta[,2], .lmu, earg= .emu)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
+ dlambda.deta = dtheta.deta(lambda, link=.llambda, earg= .elambda)
+ dmu.deta = dtheta.deta(mymu, link=.lmu, earg= .emu)
+ dsigma.deta = dtheta.deta(sigma, link=.lsigma, earg= .esigma)
psi = yeo.johnson(y, lambda)
d1 = yeo.johnson(y, lambda, deriv=1)
@@ -677,8 +686,8 @@ lms.yjn2 = function(percentiles=c(25,50,75),
dthetas.detas = cbind(dlambda.deta, dmu.deta, dsigma.deta)
w * cbind(dl.dlambda, dl.dmu, dl.dsigma) * dthetas.detas
}), list( .elambda=elambda, .emu=emu, .esigma=esigma,
- .link.lambda=link.lambda, .link.mu=link.mu,
- .link.sigma=link.sigma ))),
+ .llambda=llambda, .lmu=lmu,
+ .lsigma=lsigma ))),
weight=eval(substitute(expression({
@@ -706,22 +715,22 @@ lms.yjn2 = function(percentiles=c(25,50,75),
wz = run.varcov * dthetas.detas[,ind1$row] * dthetas.detas[,ind1$col]
dimnames(wz) = list(rownames(wz), NULL) # Remove the colnames
wz * w
- }), list(.link.sigma=link.sigma,
+ }), list(.lsigma=lsigma,
.esigma=esigma, .elambda=elambda,
.nsimEIM=nsimEIM,
- .link.lambda=link.lambda))))
+ .llambda=llambda))))
}
lms.yjn <- function(percentiles=c(25,50,75),
- zero=NULL,
- link.lambda="identity",
- link.sigma="loge",
+ zero=c(1,3),
+ llambda="identity",
+ lsigma="loge",
elambda=list(), esigma=list(),
dfmu.init=4,
dfsigma.init=2,
- init.lambda=1.0,
- init.sigma=NULL,
+ ilambda=1.0,
+ isigma=NULL,
rule=c(10,5),
yoffset=NULL,
diagW=FALSE, iters.diagW=6)
@@ -729,10 +738,10 @@ lms.yjn <- function(percentiles=c(25,50,75),
- if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
- link.sigma = as.character(substitute(link.sigma))
- if(mode(link.lambda) != "character" && mode(link.lambda) != "name")
- link.lambda = as.character(substitute(link.lambda))
+ if(mode(lsigma) != "character" && mode(lsigma) != "name")
+ lsigma = as.character(substitute(lsigma))
+ if(mode(llambda) != "character" && mode(llambda) != "name")
+ llambda = as.character(substitute(llambda))
if(!is.list(elambda)) elambda = list()
if(!is.list(esigma)) esigma = list()
@@ -744,9 +753,9 @@ lms.yjn <- function(percentiles=c(25,50,75),
blurb=c("LMS Quantile Regression ",
"(Yeo-Johnson transformation to normality)\n",
"Links: ",
- namesof("lambda", link=link.lambda, earg= elambda),
+ namesof("lambda", link=llambda, earg= elambda),
", mu, ",
- namesof("sigma", link=link.sigma, earg= esigma)),
+ namesof("sigma", link=lsigma, earg= esigma)),
constraints=eval(substitute(expression({
constraints = cm.zero.vgam(constraints, x, .zero, M)
}), list(.zero=zero))),
@@ -754,9 +763,9 @@ lms.yjn <- function(percentiles=c(25,50,75),
if(ncol(cbind(y)) != 1)
stop("response must be a vector or a one-column matrix")
predictors.names =
- c(namesof("lambda", .link.lambda, earg= .elambda, short= TRUE),
+ c(namesof("lambda", .llambda, earg= .elambda, short= TRUE),
"mu",
- namesof("sigma", .link.sigma, earg= .esigma, short= TRUE))
+ namesof("sigma", .lsigma, earg= .esigma, short= TRUE))
y.save = y
yoff = if(is.Numeric( .yoffset)) .yoffset else -median(y)
@@ -765,7 +774,7 @@ lms.yjn <- function(percentiles=c(25,50,75),
if(!length(etastart)) {
- lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.0
+ lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.0
y.tx = yeo.johnson(y, lambda.init)
if(smoothok <- (length(unique(sort(x[,min(ncol(x),2)]))) > 7)) {
@@ -776,7 +785,7 @@ lms.yjn <- function(percentiles=c(25,50,75),
fv.init = rep(weighted.mean(y, w), len=n)
}
- sigma.init = if(!is.Numeric(.init.sigma)) {
+ sigma.init = if(!is.Numeric(.isigma)) {
if(is.Numeric( .dfsigma.init) && smoothok) {
fit710 = vsmooth.spline(x=x[,min(ncol(x),2)],
y=(y.tx - fv.init)^2,
@@ -787,32 +796,32 @@ lms.yjn <- function(percentiles=c(25,50,75),
sqrt( sum( w * (y.tx - fv.init)^2 ) / sum(w) )
}
} else
- .init.sigma
+ .isigma
- etastart = cbind(theta2eta(lambda.init,.link.lambda, earg=.elambda),
+ etastart = cbind(theta2eta(lambda.init,.llambda, earg=.elambda),
fv.init,
- theta2eta(sigma.init, .link.sigma, earg=.esigma))
+ theta2eta(sigma.init, .lsigma, earg=.esigma))
}
- }), list(.link.sigma=link.sigma,
- .link.lambda=link.lambda,
+ }), list(.lsigma=lsigma,
+ .llambda=llambda,
.esigma=esigma, .elambda=elambda,
.dfmu.init=dfmu.init,
.dfsigma.init=dfsigma.init,
- .init.lambda=init.lambda,
+ .ilambda=ilambda,
.yoffset=yoffset,
- .init.sigma=init.sigma))),
+ .isigma=isigma))),
inverse=eval(substitute(function(eta, extra=NULL) {
- eta[,1] = eta2theta(eta[,1], .link.lambda, earg= .elambda)
- eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+ eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
qtplot.lms.yjn(percentiles= .percentiles, eta=eta, yoffset= extra$yoff)
}, list(.percentiles=percentiles,
.esigma=esigma, .elambda=elambda,
- .link.lambda=link.lambda,
- .link.sigma=link.sigma))),
+ .llambda=llambda,
+ .lsigma=lsigma))),
last=eval(substitute(expression({
misc$percentiles = .percentiles
- misc$link = c(lambda= .link.lambda, mu= "identity", sigma= .link.sigma)
+ misc$link = c(lambda= .llambda, mu= "identity", sigma= .lsigma)
misc$earg = list(lambda = .elambda, mu = list(), sigma = .esigma)
misc$true.mu = FALSE # $fitted is not a true mu
misc[["yoffset"]] = extra$yoff
@@ -826,24 +835,24 @@ lms.yjn <- function(percentiles=c(25,50,75),
}
}), list(.percentiles=percentiles,
.esigma=esigma, .elambda=elambda,
- .link.lambda=link.lambda,
- .link.sigma=link.sigma))),
+ .llambda=llambda,
+ .lsigma=lsigma))),
loglikelihood=eval(substitute(
function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
- lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
mu = eta[,2]
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
psi = yeo.johnson(y, lambda)
if(residuals) stop("loglikelihood residuals not implemented yet") else
sum(w * (-log(sigma) - 0.5 * ((psi-mu)/sigma)^2 +
(lambda-1) * sign(y) * log1p(abs(y))))
}, list( .esigma=esigma, .elambda=elambda,
- .link.sigma=link.sigma, .link.lambda=link.lambda))),
+ .lsigma=lsigma, .llambda=llambda))),
vfamily=c("lms.yjn", "lmscreg"),
deriv=eval(substitute(expression({
- lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
+ lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
mymu = eta[,2]
- sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+ sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
psi = yeo.johnson(y, lambda)
d1 = yeo.johnson(y, lambda, deriv=1)
@@ -852,14 +861,14 @@ lms.yjn <- function(percentiles=c(25,50,75),
dl.dlambda = -AA * d1 /sigma + sign(y) * log1p(abs(y))
dl.dmu = AA / sigma
dl.dsigma = (AA^2 -1) / sigma
- dlambda.deta = dtheta.deta(lambda, link=.link.lambda, earg= .elambda)
- dsigma.deta = dtheta.deta(sigma, link=.link.sigma, earg= .esigma)
+ dlambda.deta = dtheta.deta(lambda, link=.llambda, earg= .elambda)
+ dsigma.deta = dtheta.deta(sigma, link=.lsigma, earg= .esigma)
cbind(dl.dlambda * dlambda.deta,
dl.dmu,
dl.dsigma * dsigma.deta) * w
}), list( .esigma=esigma, .elambda=elambda,
- .link.sigma=link.sigma, .link.lambda=link.lambda ))),
+ .lsigma=lsigma, .llambda=llambda ))),
weight=eval(substitute(expression({
wz = matrix(0, n, 6)
@@ -990,12 +999,12 @@ lms.yjn <- function(percentiles=c(25,50,75),
wz = wz * w
wz
- }), list(.link.sigma=link.sigma,
+ }), list(.lsigma=lsigma,
.esigma=esigma, .elambda=elambda,
.rule=rule,
.diagW=diagW,
.iters.diagW=iters.diagW,
- .link.lambda=link.lambda))))
+ .llambda=llambda))))
}
diff --git a/R/family.rcqo.q b/R/family.rcqo.q
index c3635fc..33992da 100644
--- a/R/family.rcqo.q
+++ b/R/family.rcqo.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.rrr.q b/R/family.rrr.q
index ce3e7f4..fa98d11 100644
--- a/R/family.rrr.q
+++ b/R/family.rrr.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -1387,8 +1387,8 @@ printrrvglm <- function(x, ...)
if(length(deviance(x)))
cat("Residual Deviance:", format(deviance(x)), "\n")
- if(length(logLik(x)))
- cat("Log-likelihood:", format(logLik(x)), "\n")
+ if(length(vll <- logLik.vlm(x)))
+ cat("Log-likelihood:", format(vll), "\n")
if(length(x at criterion)) {
ncrit <- names(x at criterion)
@@ -1543,8 +1543,8 @@ get.rrvglm.se1 <- function(fit, omit13= FALSE, kill.all= FALSE,
Rank <- fit at control$Rank # fit at misc$Nested.Rank
Amat <- fit at constraints[[colx2.index[1]]]
- Bmat <- if(p1) coef(fit, mat= TRUE)[colx1.index,,drop=FALSE] else NULL
- C.try <- coef(fit, mat= TRUE)[colx2.index,,drop=FALSE]
+ Bmat <- if(p1) coefvlm(fit, mat= TRUE)[colx1.index,,drop=FALSE] else NULL
+ C.try <- coefvlm(fit, mat= TRUE)[colx2.index,,drop=FALSE]
Cmat <- C.try %*% Amat %*% solve(t(Amat) %*% Amat)
x1mat <- if(p1) fit at x[,colx1.index,drop=FALSE] else NULL
@@ -1672,7 +1672,7 @@ get.rrvglm.se1 <- function(fit, omit13= FALSE, kill.all= FALSE,
cov1122 <- solve(sfit1122 at cov.unscaled)
dimnames(cov1122) = list(d8, d8)
- lcs = length(coef(sfit1122))
+ lcs = length(coefvlm(sfit1122))
log.vec11 = (lcs-(M-Rank-length(Structural.zero))*Rank+1):lcs
cov11 = cov1122[log.vec11, log.vec11, drop=FALSE]
cov12 = cov1122[ log.vec11, -log.vec11, drop=FALSE]
@@ -2311,7 +2311,7 @@ lvplot.rrvglm = function(object,
Acex=par()$cex,
Acol=par()$col,
Apch=NULL,
- Clabels=dimnames(Cmat)[[1]],
+ Clabels=rownames(Cmat),
Cadj=par()$adj,
Ccex=par()$cex,
Ccol=par()$col,
@@ -2325,7 +2325,7 @@ lvplot.rrvglm = function(object,
spch=NULL,
scex=par()$cex,
scol=par()$col,
- slabels=dimnames(x2mat)[[1]],
+ slabels=rownames(x2mat),
...)
{
@@ -2447,8 +2447,13 @@ Coef.rrvglm <- function(object, ...) {
colx2.index = object at control$colx2.index
p1 = length(colx1.index)
Amat <- object at constraints[[colx2.index[1]]]
- B1mat <- if(p1) coef(object, mat= TRUE)[colx1.index,,drop=FALSE] else NULL
- C.try <- coef(object, mat= TRUE)[colx2.index,,drop=FALSE]
+
+ B1mat = if(p1) coefvlm(object, mat=TRUE)[colx1.index,,drop=FALSE] else NULL
+
+
+ C.try <- coefvlm(object, mat= TRUE)[colx2.index,,drop=FALSE]
+
+
Cmat <- C.try %*% Amat %*% solve(t(Amat) %*% Amat)
@@ -2696,7 +2701,7 @@ trplot.qrrvglm = function(object,
whichSpecies=NULL,
add=FALSE, plot.it=TRUE,
label.sites=FALSE,
- sitenames = dimnames(object at y)[[1]],
+ sitenames = rownames(object at y),
axes.equal = TRUE,
cex=par()$cex,
col=1:(nos*(nos-1)/2),
@@ -2908,6 +2913,7 @@ persp.qrrvglm = function(x, varlvI = FALSE, reference = NULL,
main="",
ticktype = "detailed",
col = if(Rank==1) par()$col else "white",
+ llty=par()$lty, llwd=par()$lwd,
add1 = FALSE,
...) {
oylim = ylim
@@ -2966,12 +2972,15 @@ persp.qrrvglm = function(x, varlvI = FALSE, reference = NULL,
if(!length(oylim))
ylim = c(0, max(fitvals[,whichSpecies.numer])*stretch) # A revision
col = rep(col, len=length(whichSpecies.numer))
+ llty = rep(llty, leng=length(whichSpecies.numer))
+ llwd = rep(llwd, leng=length(whichSpecies.numer))
if(!add1)
matplot(lv1, fitvals, xlab=xlab, ylab=ylab, type="n",
main=main, xlim=xlim, ylim=ylim, ...)
for(j in 1:length(whichSpecies.numer)) {
ptr2 = whichSpecies.numer[j] # points to species column
- lines(lv1, fitvals[,ptr2], col=col[j], ...)
+ lines(lv1, fitvals[,ptr2], col=col[j],
+ lty=llty[j], lwd=llwd[j], ...)
if(labelSpecies) {
ptr1=(1:nrow(fitvals))[max(fitvals[,ptr2])==fitvals[,ptr2]]
ptr1 = ptr1[1]
diff --git a/R/family.survival.q b/R/family.survival.q
index b26459a..ce4acf9 100644
--- a/R/family.survival.q
+++ b/R/family.survival.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.ts.q b/R/family.ts.q
index 12b114e..95e275c 100644
--- a/R/family.ts.q
+++ b/R/family.ts.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.univariate.q b/R/family.univariate.q
index 9c58dfe..1cb39f4 100644
--- a/R/family.univariate.q
+++ b/R/family.univariate.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -625,8 +625,8 @@ dirmul.old = function(link="loge", earg=list(), init.alpha = 0.01,
if(TRUE && intercept.only) {
sumw = sum(w)
- for(i in 1:ncol(wz))
- wz[,i] = sum(wz[,i]) / sumw
+ for(ii in 1:ncol(wz))
+ wz[,ii] = sum(wz[,ii]) / sumw
pooled.weight = TRUE
wz = w * wz # Put back the weights
} else
@@ -1146,7 +1146,9 @@ cauchy = function(llocation="identity", lscale="loge",
misc$expected = TRUE
misc$link = c("location"= .llocation, "scale"=.lscale)
misc$earg = list(location= .elocation, scale= .escale)
+ misc$method.init = .method.init
}), list( .escale=escale, .elocation=elocation,
+ .method.init=method.init,
.llocation=llocation, .lscale=lscale ))),
loglikelihood=eval(substitute(
function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
@@ -3113,16 +3115,22 @@ lognormal3 = function(lmeanlog="identity", lsdlog="loge",
interleave.VGAM = function(L, M) c(matrix(1:L, nrow=M, byrow=TRUE))
-negbinomial = function(lmu = "loge", lk = "loge",
- emu =list(), ek=list(),
- ik = NULL, cutoff = 0.995, Maxiter=5000,
- deviance.arg=FALSE, method.init=1, shrinkage.init=0.95,
- zero = -2)
+negbinomial.control <- function(save.weight=TRUE, ...)
+{
+ list(save.weight=save.weight)
+}
+
+ negbinomial = function(lmu = "loge", lk = "loge",
+ emu =list(), ek=list(),
+ ik = NULL, nsimEIM=100, cutoff = 0.995, Maxiter=5000,
+ deviance.arg=FALSE, method.init=1, shrinkage.init=0.95,
+ zero = -2)
{
+
if(length(ik) && !is.Numeric(ik, posit=TRUE))
stop("bad input for argument \"ik\"")
if(!is.Numeric(cutoff, allow=1) || cutoff<0.8 || cutoff>=1)
@@ -3133,6 +3141,12 @@ negbinomial = function(lmu = "loge", lk = "loge",
method.init > 2) stop("argument \"method.init\" must be 1 or 2")
if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
+ if(!is.null(nsimEIM)) {
+ if(!is.Numeric(nsimEIM, allow=1, integ=TRUE))
+ stop("bad input for argument 'nsimEIM'")
+ if(nsimEIM <= 10)
+ warning("'nsimEIM' should be an integer greater than 10, say")
+ }
if(mode(lmu) != "character" && mode(lmu) != "name")
lmu = as.character(substitute(lmu))
@@ -3164,6 +3178,10 @@ negbinomial = function(lmu = "loge", lk = "loge",
is.Numeric( .zero, allow=1) && .zero != -2)
stop("argument zero=-2 is required")
+ if(any(y<0))
+ stop("negative values not allowed for the negbinomial family")
+ if(any(round(y) != y))
+ stop("integer-values only allowed for the negbinomial family")
y = as.matrix(y)
M = 2 * ncol(y)
NOS = ncoly = ncol(y) # Number of species
@@ -3172,6 +3190,11 @@ negbinomial = function(lmu = "loge", lk = "loge",
namesof(if(NOS==1) "k" else paste("k",1:NOS,sep=""), .lk, earg=.ek,
tag=FALSE))
predictors.names = predictors.names[interleave.VGAM(M, M=2)]
+
+ if(is.null( .nsimEIM)) {
+ save.weight <- control$save.weight <- FALSE
+ }
+
if(!length(etastart)) {
mu.init = y
for(iii in 1:ncol(y)) {
@@ -3181,18 +3204,20 @@ negbinomial = function(lmu = "loge", lk = "loge",
median(y[,iii]) + 1/16
}
mu.init[,iii] = (1- .sinit)*(y[,iii]+1/16) + .sinit * use.this
+ max.use.this = 7 * use.this + 10
+ vecTF = (mu.init[,iii] > max.use.this)
+ if(any(vecTF))
+ mu.init[vecTF,iii] = max.use.this
}
if( is.Numeric( .k.init )) {
kay.init = matrix( .k.init, nr=n, nc=NOS, byrow=TRUE)
} else {
negbinomial.Loglikfun = function(kmat, y, x, w, extraargs) {
- mu = extraargs
- sum(w * (y * log(mu/(mu+kmat)) +
- kmat*log(kmat/(mu+kmat)) + lgamma(y+kmat) -
- lgamma(kmat) - lgamma(y+1)))
+ mu = extraargs
+ sum(w * dnbinom(x=y, mu=mu, size=kmat, log=TRUE))
}
- k.grid = 2^((-3):6)
+ k.grid = 2^((-6):6)
kay.init = matrix(0, nr=n, nc=NOS)
for(spp. in 1:NOS) {
kay.init[,spp.] = getMaxMin(k.grid,
@@ -3207,7 +3232,7 @@ negbinomial = function(lmu = "loge", lk = "loge",
}
}), list( .lmu=lmu, .lk=lk, .k.init=ik, .zero=zero,
.emu=emu, .ek=ek,
- .sinit=shrinkage.init,
+ .sinit=shrinkage.init, .nsimEIM=nsimEIM,
.method.init=method.init ))),
inverse=eval(substitute(function(eta, extra=NULL) {
NOS = ncol(eta) / 2
@@ -3234,8 +3259,10 @@ negbinomial = function(lmu = "loge", lk = "loge",
}
misc$cutoff = .cutoff
misc$method.init = .method.init
+ misc$nsimEIM = .nsimEIM
+ misc$expected = TRUE
}), list( .lmu=lmu, .lk=lk, .cutoff=cutoff,
- .emu=emu, .ek=ek,
+ .emu=emu, .ek=ek, .nsimEIM=nsimEIM,
.method.init=method.init ))),
link=eval(substitute(function(mu, extra=NULL) {
temp = theta2eta(mu, .lmu, earg= .emu)
@@ -3252,11 +3279,9 @@ negbinomial = function(lmu = "loge", lk = "loge",
temp300 = ifelse(temp300 < -bigval, -bigval, temp300)
}
kmat = eta2theta(temp300, .lk, earg= .ek)
- ans =
- sum(w * (y * log(mu/(mu+kmat)) + kmat*log(kmat/(mu+kmat)) +
- lgamma(y+kmat) - lgamma(kmat) - lgamma(y+1 )))
+
if(residuals) stop("loglikelihood residuals not implemented yet") else
- ans
+ sum(w * dnbinom(x=y, mu=mu, size=kmat, log=TRUE))
}, list( .lk=lk, .emu=emu, .ek=ek ))),
vfamily=c("negbinomial"),
deriv=eval(substitute(expression({
@@ -3272,26 +3297,44 @@ negbinomial = function(lmu = "loge", lk = "loge",
log(kmat/(kmat+mu))
dmu.deta = dtheta.deta(mu, .lmu, earg= .emu)
dk.deta = dtheta.deta(kmat, .lk, earg= .ek)
- myderiv = w * cbind(dl.dmu * dmu.deta, dl.dk * dk.deta)
+ dthetas.detas = cbind(dmu.deta, dk.deta)
+ myderiv = w * cbind(dl.dmu, dl.dk) * dthetas.detas
myderiv[,interleave.VGAM(M, M=2)]
}), list( .lmu=lmu, .lk=lk, .emu=emu, .ek=ek ))),
weight=eval(substitute(expression({
wz = matrix(as.numeric(NA), n, M) # wz is 'diagonal'
+ if(is.null( .nsimEIM)) {
+ fred2 = dotFortran(name="enbin9", ans=double(n*NOS),
+ as.double(kmat), as.double(mu), as.double( .cutoff ),
+ as.integer(n), ok=as.integer(1), as.integer(NOS),
+ sumpdf=double(1), as.double(.Machine$double.eps),
+ as.integer( .Maxiter ))
+ if(fred2$ok != 1)
+ stop("error in Fortran subroutine exnbin9")
+ dim(fred2$ans) = c(n, NOS)
+ ed2l.dk2 = -fred2$ans - 1/kmat + 1/(kmat+mu)
+ wz[,2*(1:NOS)] = dk.deta^2 * ed2l.dk2
+ } else {
+ run.varcov = matrix(0, n, NOS)
+ ind1 = iam(NA, NA, M=M, both=TRUE, diag=TRUE)
+ for(ii in 1:( .nsimEIM )) {
+ ysim = rnbinom(n=n*NOS, mu=c(mu), size=c(kmat))
+ if(NOS > 1) dim(ysim) = c(n, NOS)
+ dl.dk = digamma(ysim+kmat) - digamma(kmat) -
+ (ysim+kmat)/(mu+kmat) + 1 + log(kmat/(kmat+mu))
+ run.varcov = run.varcov + dl.dk^2
+ }
+ run.varcov = cbind(run.varcov / .nsimEIM)
+ wz[,2*(1:NOS)] = if(intercept.only)
+ matrix(apply(run.varcov, 2, mean),
+ n, ncol(run.varcov), byrow=TRUE) else run.varcov
+
+ wz[,2*(1:NOS)] = wz[,2*(1:NOS)] * dk.deta^2
+ }
ed2l.dmu2 = 1/mu - 1/(mu+kmat)
- fred2 = dotFortran(name="enbin9",
- ans=double(n*NOS), as.double(kmat),
- as.double(mu), as.double( .cutoff ),
- as.integer(n), ok=as.integer(1), as.integer(NOS),
- sumpdf=double(1), macheps=as.double(.Machine$double.eps),
- as.integer( .Maxiter ))
- if(fred2$ok != 1)
- stop("error in Fortran subroutine exnbin9")
- dim(fred2$ans) = c(n, NOS)
- ed2l.dk2 = -fred2$ans - 1/kmat + 1/(kmat+mu)
wz[,2*(1:NOS)-1] = dmu.deta^2 * ed2l.dmu2
- wz[,2*(1:NOS)] = dk.deta^2 * ed2l.dk2
w * wz
- }), list( .cutoff=cutoff, .Maxiter=Maxiter ))))
+ }), list( .cutoff=cutoff, .Maxiter=Maxiter, .nsimEIM=nsimEIM ))))
if(deviance.arg) ans at deviance=eval(substitute(
function(mu,y,w,residuals= FALSE,eta,extra=NULL) {
@@ -3923,8 +3966,8 @@ simplex = function(lmu="logit", lsigma="loge",
if(intercept.only) {
sumw = sum(w)
- for(i in 1:ncol(wz))
- wz[,i] = sum(wz[,i]) / sumw
+ for(ii in 1:ncol(wz))
+ wz[,ii] = sum(wz[,ii]) / sumw
pooled.weight = TRUE
wz = w * wz # Put back the weights
} else
@@ -4034,8 +4077,8 @@ rig = function(lmu="identity", llambda="loge",
if(intercept.only) {
sumw = sum(w)
- for(i in 1:ncol(wz))
- wz[,i] = sum(wz[,i]) / sumw
+ for(ii in 1:ncol(wz))
+ wz[,ii] = sum(wz[,ii]) / sumw
pooled.weight = TRUE
wz = w * wz # Put back the weights
} else
@@ -4285,8 +4328,8 @@ leipnik = function(lmu="logit", llambda="loge",
if(intercept.only) {
sumw = sum(w)
- for(i in 1:ncol(wz))
- wz[,i] = sum(wz[,i]) / sumw
+ for(ii in 1:ncol(wz))
+ wz[,ii] = sum(wz[,ii]) / sumw
pooled.weight = TRUE
wz = w * wz # Put back the weights
} else
@@ -4540,8 +4583,8 @@ genpoisson = function(llambda="elogit", ltheta="loge",
if(intercept.only) {
sumw = sum(w)
- for(i in 1:ncol(wz))
- wz[,i] = sum(wz[,i]) / sumw
+ for(ii in 1:ncol(wz))
+ wz[,ii] = sum(wz[,ii]) / sumw
pooled.weight = TRUE
wz = w * wz # Put back the weights
} else
@@ -5016,22 +5059,76 @@ ggamma = function(lscale="loge", ld="loge", lk="loge",
}
-dlog = function(x, prob) {
- if(!is.Numeric(x)) stop("bad input for argument \"x\"")
+dlog = function(x, prob, log=FALSE) {
+ if(!is.logical(log) || length(log) != 1)
+ stop("bad input for argument 'log'")
+ log.arg = log; rm(log)
+
if(!is.Numeric(prob, posit=TRUE) || max(prob) >= 1)
stop("bad input for argument \"prob\"")
N = max(length(x), length(prob))
x = rep(x, len=N); prob = rep(prob, len=N);
ox = !is.finite(x)
- zero = round(x) != x | x < 1
+ zero = ox | round(x) != x | x < 1
ans = rep(0.0, len=length(x))
- if(any(!zero))
- ans[!zero] = -(prob[!zero]^(x[!zero])) / (x[!zero] * log1p(-prob[!zero]))
+ if(log.arg) {
+ ans[ zero] = log(0.0)
+ ans[!zero] = x[!zero] * log(prob[!zero]) - log(x[!zero]) -
+ log(-log1p(-prob[!zero]))
+ } else {
+ ans[!zero] = -(prob[!zero]^(x[!zero])) / (x[!zero] *
+ log1p(-prob[!zero]))
+ }
if(any(ox))
ans[ox] = NA
ans
}
+
+
+plog = function(q, prob, log.p=FALSE) {
+ if(!is.Numeric(q)) stop("bad input for argument \"q\"")
+ if(!is.Numeric(prob, posit=TRUE) || max(prob) >= 1)
+ stop("bad input for argument \"prob\"")
+ N = max(length(q), length(prob))
+ q = rep(q, len=N); prob = rep(prob, len=N);
+
+ bigno = 10
+ owen1965 = (q * (1 - prob) > bigno)
+ if(specialCase <- any(owen1965)) {
+ qqq = q[owen1965]
+ ppp = prob[owen1965]
+ pqp = qqq * (1 - ppp)
+ bigans = (ppp^(1+qqq) / (1-ppp)) * (1/qqq -
+ 1 / ( pqp * (qqq-1)) +
+ 2 / ((1-ppp) * pqp * (qqq-1) * (qqq-2)) -
+ 6 / ((1-ppp)^2 * pqp * (qqq-1) * (qqq-2) * (qqq-3)) +
+ 24 / ((1-ppp)^3 * pqp * (qqq-1) * (qqq-2) * (qqq-3) * (qqq-4)))
+ bigans = 1 + bigans / log1p(-ppp)
+ }
+
+ floorq = pmax(1, floor(q)) # Ensures at least one element per q value
+ floorq[owen1965] = 1
+ seqq = sequence(floorq)
+ seqp = rep(prob, floorq)
+ onevector = (seqp^seqq / seqq) / (-log1p(-seqp))
+ rlist = dotFortran(name="cum8sum",
+ x=as.double(onevector), answer=double(N),
+ as.integer(N), as.double(seqq),
+ as.integer(length(onevector)), notok=integer(1))
+ if(rlist$notok != 0) stop("error in 'cum8sum'")
+ ans = if(log.p) log(rlist$answer) else rlist$answer
+ if(specialCase)
+ ans[owen1965] = if(log.p) log(bigans) else bigans
+ ans[q < 1] = if(log.p) log(0.0) else 0.0
+ ans
+}
+
+
+
+
+
+if(FALSE)
plog = function(q, prob, log.p=FALSE) {
if(!is.Numeric(q)) stop("bad input for argument \"q\"")
if(!is.Numeric(prob, posit=TRUE) || max(prob) >= 1)
@@ -5044,18 +5141,24 @@ plog = function(q, prob, log.p=FALSE) {
temp = if(max(qstar) >= 1) dlog(x=1:max(qstar),
prob=prob[1]) else 0*qstar
unq = unique(qstar)
- for(i in unq) {
- index = qstar == i
- ans[index] = if(i >= 1) sum(temp[1:i]) else 0
+ for(ii in unq) {
+ index = qstar == ii
+ ans[index] = if(ii >= 1) sum(temp[1:ii]) else 0
}
} else
- for(i in 1:N) {
- qstar = floor(q[i])
- ans[i] = if(qstar >= 1) sum(dlog(x=1:qstar, prob=prob[i])) else 0
+ for(ii in 1:N) {
+ qstar = floor(q[ii])
+ ans[ii] = if(qstar >= 1) sum(dlog(x=1:qstar, prob=prob[ii])) else 0
}
if(log.p) log(ans) else ans
}
+
+
+
+
+
+
rlog = function(n, prob, Smallno=1.0e-6) {
if(!is.Numeric(n, posit=TRUE, integ=TRUE))
stop("bad input for argument \"n\"")
@@ -5090,6 +5193,12 @@ rlog = function(n, prob, Smallno=1.0e-6) {
}
+
+
+
+
+
+
logff = function(link="logit", earg=list(), init.c=NULL)
{
if(length(init.c) &&
@@ -5152,6 +5261,9 @@ logff = function(link="logit", earg=list(), init.c=NULL)
}
+
+
+
levy = function(delta=NULL, link.gamma="loge",
earg=list(), idelta=NULL, igamma=NULL)
{
@@ -7163,13 +7275,13 @@ qnaka = function(p, shape, scale=1, ...) {
ans = rep(0.0, len=L)
myfun = function(x, shape, scale=1, p)
pnaka(q=x, shape=shape, scale=scale) - p
- for(i in 1:L) {
- EY = sqrt(scale[i]/shape[i]) * gamma(shape[i]+0.5) / gamma(shape[i])
+ for(ii in 1:L) {
+ EY = sqrt(scale[ii]/shape[ii]) * gamma(shape[ii]+0.5) / gamma(shape[ii])
Upper = 5 * EY
- while(pnaka(q=Upper, shape=shape[i], scale=scale[i]) < p[i])
- Upper = Upper + scale[i]
- ans[i] = uniroot(f=myfun, lower=0, upper=Upper,
- shape=shape[i], scale=scale[i], p=p[i], ...)$root
+ while(pnaka(q=Upper, shape=shape[ii], scale=scale[ii]) < p[ii])
+ Upper = Upper + scale[ii]
+ ans[ii] = uniroot(f=myfun, lower=0, upper=Upper,
+ shape=shape[ii], scale=scale[ii], p=p[ii], ...)$root
}
ans
}
@@ -8346,8 +8458,8 @@ expexp1 = function(lscale="loge",
if(FALSE && intercept.only) {
sumw = sum(w)
- for(i in 1:ncol(wz))
- wz[,i] = sum(wz[,i]) / sumw
+ for(ii in 1:ncol(wz))
+ wz[,ii] = sum(wz[,ii]) / sumw
pooled.weight = TRUE
wz = w * wz # Put back the weights
} else
@@ -8769,6 +8881,12 @@ alaplace2 = function(tau = NULL,
+
+alaplace1.control <- function(maxit=300, ...)
+{
+ list(maxit=maxit)
+}
+
alaplace1 = function(tau = NULL,
llocation="identity",
elocation=list(),
diff --git a/R/family.vglm.q b/R/family.vglm.q
index 541e790..340ca92 100644
--- a/R/family.vglm.q
+++ b/R/family.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/family.zeroinf.q b/R/family.zeroinf.q
index a5cc327..8bc9e49 100644
--- a/R/family.zeroinf.q
+++ b/R/family.zeroinf.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -7,13 +7,183 @@
-dzipois = function(x, lambda, phi=0) {
+
+dzanegbin = function(x, p0, size, prob=NULL, munb=NULL, log=FALSE) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+ rm(log)
+
+ L = max(length(x), length(p0), length(prob), length(size))
+ x = rep(x, len=L); p0 = rep(p0, len=L);
+ prob = rep(prob, len=L); size = rep(size, len=L);
+ ans = rep(0.0, len=L)
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("'p0' must be in [0,1]")
+ if(!is.Numeric(prob, posit=TRUE))
+ stop("'prob' must be in [0,Inf)")
+ if(!is.Numeric(size, posit=TRUE))
+ stop("'size' must be in [0,Inf)")
+ index0 = x==0
+
+ if(log.arg) {
+ ans[ index0] = log(p0[index0])
+ ans[!index0] = log1p(-p0[!index0]) +
+ dposnegbin(x[!index0], prob=prob[!index0],
+ size=size[!index0], log=TRUE)
+ } else {
+ ans[ index0] = p0[index0]
+ ans[!index0] = (1-p0[!index0]) * dposnegbin(x[!index0],
+ prob=prob[!index0], size=size[!index0])
+ }
+ ans
+}
+
+
+
+pzanegbin = function(q, p0, size, prob=NULL, munb=NULL) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ L = max(length(q), length(p0), length(prob), length(size))
+ q = rep(q, len=L); p0 = rep(p0, len=L);
+ prob = rep(prob, len=L); size = rep(size, len=L);
+ ans = rep(0.0, len=L)
+
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("'p0' must be in [0,1]")
+ ans[q > 0] = p0[q > 0] + (1-p0[q > 0]) *
+ pposnegbin(q[q > 0], size=size[q > 0], prob=prob[q > 0])
+ ans[q < 0] = 0
+ ans[q == 0] = p0[q == 0]
+ ans
+}
+
+qzanegbin = function(p, p0, size, prob=NULL, munb=NULL) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ L = max(length(p), length(p0), length(prob), length(size))
+ p = rep(p, len=L); p0 = rep(p0, len=L);
+ prob = rep(prob, len=L); size = rep(size, len=L);
+ ans = rep(0.0, len=L)
+
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("'p0' must be between 0 and 1 inclusive")
+ ans = p
+ ans[p <= p0] = 0
+ ans[p > p0] = qposnegbin((p[p>p0]-p0[p>p0])/(1-p0[p>p0]), prob=prob[p>p0],
+ size=size[p>p0])
+ ans
+}
+
+rzanegbin = function(n, p0, size, prob=NULL, munb=NULL) {
+ if (length(munb)) {
+ if (length(prob))
+ stop("'prob' and 'munb' both specified")
+ prob <- size/(size + munb)
+ }
+ ans = rposnegbin(n, prob=prob, size=size)
+ p0 = rep(p0, len=length(ans))
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("'p0' must be between 0 and 1 inclusive")
+ ifelse(runif(n) < p0, 0, ans)
+}
+
+
+
+
+
+dzapois = function(x, lambda, p0=0, log=FALSE) {
+ if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+ rm(log)
+
+ L = max(length(x), length(lambda), length(p0))
+ x = rep(x, len=L); lambda = rep(lambda, len=L); p0 = rep(p0, len=L);
+ ans = rep(0.0, len=L)
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("'p0' must be in [0,1]")
+ index0 = x==0
+
+ if(log.arg) {
+ ans[ index0] = log(p0[index0])
+ ans[!index0] = log1p(-p0[!index0]) +
+ dpospois(x[!index0], lambda[!index0], log=TRUE)
+ } else {
+ ans[ index0] = p0[index0]
+ ans[!index0] = (1-p0[!index0]) * dpospois(x[!index0], lambda[!index0])
+ }
+ ans
+}
+
+
+
+pzapois = function(q, lambda, p0=0) {
+ L = max(length(q), length(lambda), length(p0))
+ q = rep(q, len=L); lambda = rep(lambda, len=L); p0 = rep(p0, len=L);
+ ans = rep(0.0, len=L)
+
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("'p0' must be in [0,1]")
+ ans[q > 0] = p0[q > 0] + (1-p0[q > 0]) * ppospois(q[q > 0], lambda[q > 0])
+ ans[q < 0] = 0
+ ans[q == 0] = p0[q == 0]
+ ans
+}
+
+
+qzapois = function(p, lambda, p0=0) {
+ nn = max(length(p), length(lambda), length(p0))
+ p = rep(p, len=nn); lambda = rep(lambda, len=nn); p0 = rep(p0, len=nn)
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("'p0' must be between 0 and 1 inclusive")
+ ans = p
+ ans[p<=p0] = 0
+ ans[p>p0] = qpospois((p[p>p0]-p0[p>p0])/(1-p0[p>p0]), lam=lambda[p>p0])
+ ans
+}
+
+rzapois = function(n, lambda, p0=0) {
+ ans = rpospois(n, lambda)
+ p0 = rep(p0, len=length(ans))
+ if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+ stop("p0 must be between 0 and 1 inclusive")
+ ifelse(runif(n) < p0, 0, ans)
+}
+
+
+
+
+
+dzipois = function(x, lambda, phi=0, log=FALSE) {
+ if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+ rm(log)
+
L = max(length(x), length(lambda), length(phi))
x = rep(x, len=L); lambda = rep(lambda, len=L); phi = rep(phi, len=L);
- ans = dpois(x, lambda)
+ ans = rep(0.0, len=L)
if(!is.Numeric(phi) || any(phi < 0) || any(phi > 1))
stop("'phi' must be between 0 and 1 inclusive")
- ifelse(x==0, phi + (1-phi) * ans, (1-phi) * ans)
+
+ index0 = x==0
+ if(log.arg) {
+ ans[ index0] = log(phi[index0] + (1-phi[index0]) *
+ dpois(x[index0], lambda[index0]))
+ ans[!index0] = log1p(-phi[!index0]) +
+ dpois(x[!index0], lambda[!index0], log=TRUE)
+ } else {
+ ans[ index0] = phi[index0] + (1-phi[index0]) *
+ dpois(x[index0], lambda[index0])
+ ans[!index0] = (1-phi[!index0]) * dpois(x[!index0], lambda[!index0])
+ }
+ ans
}
pzipois = function(q, lambda, phi=0) {
@@ -21,7 +191,7 @@ pzipois = function(q, lambda, phi=0) {
phi = rep(phi, length=length(ans))
if(!is.Numeric(phi) || any(phi < 0) || any(phi > 1))
stop("'phi' must be between 0 and 1 inclusive")
- phi + (1-phi) * ans
+ ifelse(x<0, 0, phi + (1-phi) * ans)
}
qzipois = function(p, lambda, phi=0) {
@@ -97,7 +267,7 @@ yip88 = function(link.lambda="loge", n.arg=NULL)
lambda = eta2theta(eta, .link.lambda)
temp5 = exp(-lambda)
phi = (1 - temp5 - extra$sumw/extra$narg) / (1 - temp5)
- if(any(phi) <= 0)
+ if(any(phi <= 0))
stop("non-positive value(s) of phi")
(1-phi) * lambda
}, list( .link.lambda=link.lambda ))),
@@ -135,9 +305,9 @@ yip88 = function(link.lambda="loge", n.arg=NULL)
-zapoisson = function(lp0="logit", llambda="loge",
- ep0=list(), elambda=list(),
- zero=NULL)
+ zapoisson = function(lp0="logit", llambda="loge",
+ ep0=list(), elambda=list(),
+ zero=NULL)
{
if(mode(lp0) != "character" && mode(lp0) != "name")
lp0 = as.character(substitute(lp0))
@@ -161,8 +331,12 @@ zapoisson = function(lp0="logit", llambda="loge",
}), list( .zero=zero ))),
initialize=eval(substitute(expression({
y = as.matrix(y)
+ if(any(y != round(y )))
+ stop("the response must be integer-valued")
+ if(any(y < 0))
+ stop("the response must not have negative values")
+
extra$y0 = y0 = ifelse(y==0, 1, 0)
- extra$ymat = ymat = cbind(y0=y0, y=y)
extra$NOS = NOS = ncoly = ncol(y) # Number of species
extra$skip.these = skip.these = matrix(as.logical(y0), n, NOS)
@@ -201,17 +375,8 @@ zapoisson = function(lp0="logit", llambda="loge",
function(mu,y,w,residuals=FALSE, eta,extra=NULL) {
NOS = extra$NOS
p0 = cbind(eta2theta(eta[,1:NOS], .lp0, earg= .ep0))
- skip = extra$skip.these
lambda = cbind(eta2theta(eta[,NOS+(1:NOS)], .llambda, earg= .elambda ))
- ans = 0
- for(spp. in 1:NOS) {
- ans = ans + sum(w[skip[,spp.]] * log(p0[skip[,spp.],spp.])) +
- sum(w[!skip[,spp.]] * (log1p(-p0[!skip[,spp.],spp.]) -
- log1p(-exp(-lambda[!skip[,spp.],spp.])) -
- lambda[!skip[,spp.],spp.] +
- y[!skip[,spp.],spp.]*log(lambda[!skip[,spp.],spp.])))
- }
- ans
+ sum(w * dzapois(x=y, p0=p0, lambda=lambda, log=TRUE))
}, list( .lp0=lp0, .llambda=llambda, .ep0= ep0, .elambda= elambda ))),
vfamily=c("zapoisson"),
deriv=eval(substitute(expression({
@@ -233,7 +398,7 @@ zapoisson = function(lp0="logit", llambda="loge",
ans
}), list( .lp0=lp0, .llambda=llambda, .ep0= ep0, .elambda= elambda ))),
weight=eval(substitute(expression({
- wz = matrix( .Machine$double.eps^0.8, n, 2*NOS)
+ wz = matrix( 10 * .Machine$double.eps^(3/4), n, 2*NOS)
for(spp. in 1:NOS) {
temp4 = exp(lambda[!skip[,spp.], spp.])
ed2l.dlambda2 = -temp4 * (1/lambda[!skip[,spp.],spp.] -
@@ -244,7 +409,7 @@ zapoisson = function(lp0="logit", llambda="loge",
}
tmp100 = mup0*(1-mup0)
- tmp200 = if(.lp0 == "logit") {
+ tmp200 = if( .lp0 == "logit") {
cbind(w * tmp100)
} else {
cbind(w * dtheta.deta(mup0, link= .lp0, earg= .ep0)^2 / tmp100)
@@ -252,7 +417,7 @@ zapoisson = function(lp0="logit", llambda="loge",
for(ii in 1:NOS) {
index200 = abs(tmp200[,ii]) < .Machine$double.eps
if(any(index200)) {
- tmp200[index200,ii] = .Machine$double.eps # Diagonal 0's are bad
+ tmp200[index200,ii] = 10.0 * .Machine$double.eps^(3/4)
}
}
wz[,1:NOS] = tmp200
@@ -262,17 +427,26 @@ zapoisson = function(lp0="logit", llambda="loge",
-zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
- ep0=list(), emunb =list(), ek = list(),
- ik = 1, zero = -3, cutoff = 0.995, method.init=3)
+ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
+ ep0=list(), emunb =list(), ek = list(),
+ ipnb0 = NULL, ik = NULL, zero = -3,
+ cutoff = 0.995, method.init=1,
+ shrinkage.init=0.95)
{
+
+
if(!is.Numeric(cutoff, positiv=TRUE, allow=1) || cutoff<0.8 || cutoff>=1)
stop("range error in the argument cutoff")
- if(!is.Numeric(ik, positiv=TRUE))
- stop("ik must contain positive values only")
+ if(length(ipnb0) && (!is.Numeric(ipnb0, positiv=TRUE) ||
+ max(ipnb0) >= 1))
+ stop("If given, ipnb0 must contain values in (0,1) only")
+ if(length(ik) && !is.Numeric(ik, positiv=TRUE))
+ stop("If given, ik must contain positive values only")
if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
- method.init > 3) stop("argument \"method.init\" must be 1, 2 or 3")
+ method.init > 2) stop("argument \"method.init\" must be 1 or 2")
+ if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
+ shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
if(mode(lmunb) != "character" && mode(lmunb) != "name")
lmunb = as.character(substitute(lmunb))
@@ -302,6 +476,10 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
y = as.matrix(y)
extra$NOS = NOS = ncoly = ncol(y) # Number of species
M = 3 * ncoly #
+ if(any(y != round(y)))
+ stop("the response must be integer-valued")
+ if(any(y < 0))
+ stop("the response must not have negative values")
mynames1 = if(NOS==1) "p0" else paste("p0", 1:NOS, sep="")
mynames2 = if(NOS==1) "munb" else paste("munb", 1:NOS, sep="")
@@ -312,29 +490,65 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
namesof(mynames3, .lk, earg= .ek, tag= FALSE))
predictors.names = predictors.names[interleave.VGAM(3*NOS, M=3)]
extra$y0 = y0 = ifelse(y==0, 1, 0)
- extra$ymat = ymat = cbind(y0=y0, y=y)
extra$skip.these = skip.these = matrix(as.logical(y0), n, NOS)
if(!length(etastart)) {
- if( .method.init == 3) {
- mu.init = y + 1/16
+ mu.init = y
+ for(iii in 1:ncol(y)) {
+ index.posy = (y[,iii] > 0)
+ use.this = if( .method.init == 2) {
+ weighted.mean(y[index.posy,iii], w[index.posy])
+ } else {
+ median(rep(y[index.posy,iii], w[index.posy])) + 1/2
+ }
+ mu.init[ index.posy,iii] = (1- .sinit) * y[index.posy,iii] +
+ .sinit * use.this
+ mu.init[!index.posy,iii] = use.this
+ max.use.this = 7 * use.this + 10
+ vecTF = (mu.init[,iii] > max.use.this)
+ if(any(vecTF))
+ mu.init[vecTF,iii] = max.use.this
+ }
+
+
+ pnb0 = matrix(if(length( .ipnb0)) .ipnb0 else -1,
+ nr=n, nc=NOS, byrow=TRUE)
+ for(spp. in 1:NOS) {
+ if(any(pnb0[,spp.] < 0)) {
+ index.y0 = y[,spp.] < 0.5
+ pnb0[,spp.] = max(min(sum(index.y0)/n, 0.97), 0.03)
+ }
+ }
+
+
+ if( is.Numeric( .ik )) {
+ kmat0 = matrix( .ik, nr=n, nc=ncoly, byrow=TRUE)
} else {
- mu.init = y
- for(iii in 1:ncol(y))
- mu.init[,iii] = if( .method.init == 2)
- weighted.mean(y[,iii], w=w) else
- median(rep(y[,iii], w)) + 1/8
+ posnegbinomial.Loglikfun = function(kmat, y, x, w, extraargs) {
+ munb = extraargs
+ sum(w * dposnegbin(x=y, munb=munb, size=kmat, log=TRUE))
+ }
+ k.grid = 2^((-6):6)
+ kmat0 = matrix(0, nr=n, nc=NOS)
+ for(spp. in 1:NOS) {
+ index.posy = y[,spp.] > 0
+ posy = y[index.posy, spp.]
+ kmat0[,spp.] = getMaxMin(k.grid,
+ objfun=posnegbinomial.Loglikfun,
+ y=posy, x=x[index.posy,], w=w[index.posy],
+ extraargs= mu.init[index.posy, spp.])
+ }
}
- kmat0 = matrix( .ik, nrow(y), ncoly, byrow=TRUE) # Initial kmat
- pnb0 = (kmat0 / (kmat0 + mu.init))^kmat0
- etastart = cbind(theta2eta((0.5 + w * y0) / (1 + w), .lp0, earg= .ep0 ),
- theta2eta(mu.init*(1-pnb0), .lmunb, earg= .emunb ),
- theta2eta(kmat0, .lk, earg= .ek ))
+
+ etastart = cbind(theta2eta(pnb0, .lp0, earg= .ep0 ),
+ theta2eta(mu.init, .lmunb, earg= .emunb),
+ theta2eta(kmat0, .lk, earg= .ek ))
etastart = etastart[,interleave.VGAM(ncol(etastart),M=3)]
}
- }), list( .lp0=lp0, .lmunb=lmunb, .lk=lk, .ik=ik,
+ }), list( .lp0=lp0, .lmunb=lmunb, .lk=lk,
+ .ipnb0=ipnb0, .ik=ik,
.ep0=ep0, .emunb=emunb, .ek=ek,
- .method.init=method.init ))),
+ .method.init=method.init, .sinit=shrinkage.init ))),
inverse=eval(substitute(function(eta, extra=NULL) {
NOS = extra$NOS
p0 = eta2theta(eta[,3*(1:NOS)-2], .lp0, earg= .ep0 )
@@ -345,7 +559,8 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
}, list( .lp0=lp0, .lk=lk, .lmunb=lmunb,
.ep0=ep0, .emunb=emunb, .ek=ek ))),
last=eval(substitute(expression({
- misc$link = c(rep( .lp0, length=NOS), rep( .lmunb, length=NOS),
+ misc$link = c(rep( .lp0, length=NOS),
+ rep( .lmunb, length=NOS),
rep( .lk, length=NOS))
temp.names = c(mynames1, mynames2, mynames3)
temp.names = temp.names[interleave.VGAM(3*NOS, M=3)]
@@ -368,22 +583,7 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
p0 = eta2theta(eta[,3*(1:NOS)-2,drop=FALSE], .lp0, earg= .ep0 )
munb = eta2theta(eta[,3*(1:NOS)-1,drop=FALSE], .lmunb, earg= .emunb )
kmat = eta2theta(eta[,3*(1:NOS),drop=FALSE], .lk, earg= .ek )
- skip = extra$skip.these
- pnb0 = (kmat / (kmat + munb))^kmat
- ans = 0.0
- for(spp. in 1:NOS) {
- i8 = skip[,spp.]
- ans = ans + sum(w[i8] * log(p0[i8,spp.])) +
- sum(w[!i8] * (log1p(-p0[!i8,spp.]) + y[!i8,spp.] *
- log(munb[!i8,spp.]/(munb[!i8,spp.]+
- kmat[!i8,spp.])) + kmat[!i8,spp.]*log(kmat[!i8,spp.] /
- (munb[!i8,spp.]+kmat[!i8,spp.])) +
- lgamma(y[!i8,spp.]+kmat[!i8,spp.]) -
- lgamma(kmat[!i8,spp.]) - lgamma(y[!i8,spp.]+1) -
- (if(is.R())
- log1p(-pnb0[!i8,spp.]) else log1p( - pnb0[!i8,spp.]))))
- }
- ans
+ sum(w * dzanegbin(x=y, p0=p0, munb=munb, size=kmat, log=TRUE))
}, list( .lp0=lp0, .lmunb=lmunb, .lk=lk,
.ep0=ep0, .emunb=emunb, .ek=ek ))),
vfamily=c("zanegbinomial"),
@@ -420,10 +620,11 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
myderiv = w * cbind(dl.dmunb * dmunb.deta, dl.dk * dk.deta)
mup0 = p0
- temp3 = if(.lp0 == "logit") {
+ temp3 = if( .lp0 == "logit") {
w * (y0 - mup0)
} else
- w * dtheta.deta(mup0, link=.lp0, earg= .ep0 ) * (y0/mup0 - 1) / (1-mup0)
+ w * dtheta.deta(mup0, link= .lp0, earg= .ep0 ) *
+ (y0/mup0 - 1) / (1-mup0)
ans = cbind(temp3, myderiv)
ans = ans[,interleave.VGAM(ncol(ans), M=3)]
@@ -433,8 +634,13 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
weight=eval(substitute(expression({
wz = matrix(0, n, 6*NOS-1) # wz is not 'diagonal'
pnb0 = (kmat / (kmat + munb))^kmat
- ed2l.dmunb2 = (1/munb - (munb + kmat*(1-pnb0))/(munb+kmat)^2) /
- (1-pnb0) - d2l0.dthetas2[,,1]
+ ed2l.dmunb2 = (1/munb - (munb + kmat*(1-pnb0))/(munb +
+ kmat)^2) / (1-pnb0) - d2l0.dthetas2[,,1]
+ wz[,3*(1:NOS)-1] = w * dmunb.deta^2 * ed2l.dmunb2
+ wz[,3*NOS+3*(1:NOS)-1] = -w * d2l0.dthetas2[,,3] * dmunb.deta * dk.deta
+
+
+
fred = dotFortran(name="enbin8",
ans=double(n*NOS), as.double(kmat),
as.double(kmat/(munb+kmat)), as.double(.cutoff),
@@ -445,10 +651,10 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
dim(fred$ans) = c(n, NOS)
ed2l.dk2 = -fred$ans/(1-pnb0) - 1/kmat + 1/(kmat+munb) -
munb * pnb0 / ((1-pnb0)*(munb+kmat)^2) - d2l0.dthetas2[,,2]
- wz[,3*(1:NOS)-1] = w * dmunb.deta^2 * ed2l.dmunb2
wz[,3*(1:NOS)] = w * dk.deta^2 * ed2l.dk2
- wz[,3*NOS+3*(1:NOS)-1] = -w * d2l0.dthetas2[,,3] * dmunb.deta * dk.deta
+
+
tmp100 = mup0*(1-mup0)
tmp200 = if(.lp0 == "logit") {
@@ -466,14 +672,18 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
for(spp. in 1:NOS) {
wz[skip[,spp.],3*spp. - 1] =
- wz[skip[,spp.],3*spp.] = .Machine$double.eps^0.5
+ wz[skip[,spp.],3*spp.] = sqrt(.Machine$double.eps)
wz[skip[,spp.],3*NOS+3*(spp.)-1] = 0
}
+
wz
}), list( .lp0=lp0, .ep0=ep0, .cutoff=cutoff ))))
}
+
+
+if(FALSE)
rposnegbin = function(n, munb, k) {
if(!is.Numeric(k, posit=TRUE))
stop("argument \"k\" must be positive")
@@ -491,14 +701,29 @@ rposnegbin = function(n, munb, k) {
index = ans == 0
}
ans
-}
+}
-zipoisson = function(lphi="logit", llambda="loge",
- ephi=list(), elambda =list(),
- iphi=NULL, method.init=1,
- shrinkage.init=0.8, zero=NULL)
+if(FALSE)
+dposnegbin = function(x, munb, k, log=FALSE) {
+ if(!is.Numeric(k, posit=TRUE))
+ stop("argument \"k\" must be positive")
+ if(!is.Numeric(munb, posit=TRUE))
+ stop("argument \"munb\" must be positive")
+ ans = dnbinom(x=x, mu=munb, size=k, log=log)
+ ans0 = dnbinom(x=0, mu=munb, size=k, log=FALSE)
+ ans = if(log) ans - log1p(-ans0) else ans/(1-ans0)
+ ans[x == 0] = if(log) -Inf else 0
+ ans
+}
+
+
+
+ zipoisson = function(lphi="logit", llambda="loge",
+ ephi=list(), elambda =list(),
+ iphi=NULL, method.init=1,
+ shrinkage.init=0.8, zero=NULL)
{
if(mode(lphi) != "character" && mode(lphi) != "name")
lphi = as.character(substitute(lphi))
@@ -524,6 +749,8 @@ zipoisson = function(lphi="logit", llambda="loge",
}), list( .zero=zero ))),
initialize=eval(substitute(expression({
if(ncol(as.matrix(y)) != 1) stop("multivariate responses not allowed")
+ if(any(round(y) != y))
+ stop("integer-valued responses only allowed for the zipoisson family")
predictors.names = c(
namesof("phi", .lphi, earg= .ephi, tag=FALSE),
namesof("lambda", .llambda, earg= .ephi, tag=FALSE))
@@ -537,8 +764,8 @@ zipoisson = function(lphi="logit", llambda="loge",
mymean = weighted.mean(y[y>0], w[y>0]) + 1/16
lambda.init = (1- .sinit) * (y+1/8) + .sinit * mymean
} else {
- mymedian = median(y[y>0]) + 1/16
- lambda.init = (1- .sinit) * (y+1/8) + .sinit * mymedian
+ use.this = median(y[y>0]) + 1/16
+ lambda.init = (1- .sinit) * (y+1/8) + .sinit * use.this
}
etastart = cbind(theta2eta(rep(phi.init, len=n), .lphi, earg= .ephi ),
theta2eta(lambda.init, .llambda, earg= .ephi ))
@@ -571,12 +798,7 @@ zipoisson = function(lphi="logit", llambda="loge",
phi = pmax(phi, smallno)
phi = pmin(phi, 1.0-smallno)
lambda = eta2theta(eta[,2], .llambda, earg= .elambda )
- index = (y==0)
- tmp8 = phi + (1.0-phi)*exp(-lambda)
- ell0 = log(tmp8[index])
- ell1 = log1p(-phi[!index]) +
- dpois(y[!index], lambda= lambda[!index], log=TRUE)
- sum(w[index] * ell0) + sum(w[!index] * ell1)
+ sum(w * dzipois(x=y, phi=phi, lambda=lambda, log=TRUE))
}, list( .lphi=lphi, .llambda=llambda,
.ephi=ephi, .elambda=elambda ))),
vfamily=c("zipoisson"),
@@ -587,16 +809,16 @@ zipoisson = function(lphi="logit", llambda="loge",
phi = pmin(phi, 1.0-smallno)
lambda = eta2theta(eta[,2], .llambda, earg= .elambda )
tmp8 = phi + (1-phi)*exp(-lambda)
- index = (y==0)
+ index0 = (y==0)
dl.dphi = (1-exp(-lambda)) / tmp8
- dl.dphi[!index] = -1 / (1-phi[!index])
+ dl.dphi[!index0] = -1 / (1-phi[!index0])
dl.dlambda = -(1-phi) * exp(-lambda) / tmp8
- dl.dlambda[!index] = (y[!index] - lambda[!index]) / lambda[!index]
+ dl.dlambda[!index0] = (y[!index0] - lambda[!index0]) / lambda[!index0]
dphi.deta = dtheta.deta(phi, .lphi, earg= .ephi)
dlambda.deta = dtheta.deta(lambda, .llambda, earg= .elambda )
ans = w * cbind(dl.dphi * dphi.deta, dl.dlambda * dlambda.deta)
- if(.llambda == "loge" && (any(lambda[!index] < .Machine$double.eps))) {
- ans[!index,2] = w[!index] * (y[!index] - lambda[!index])
+ if(.llambda == "loge" && (any(lambda[!index0] < .Machine$double.eps))) {
+ ans[!index0,2] = w[!index0] * (y[!index0] - lambda[!index0])
}
ans
}), list( .lphi=lphi, .llambda=llambda,
@@ -609,8 +831,8 @@ zipoisson = function(lphi="logit", llambda="loge",
wz[,iam(1,1,M)] = d2l.dphi2 * dphi.deta^2
wz[,iam(2,2,M)] = d2l.dlambda2 * dlambda.deta^2
wz[,iam(1,2,M)] = d2l.dphilambda * dphi.deta * dlambda.deta
- if(.llambda == "loge" && (any(lambda[!index] < .Machine$double.eps))) {
- ind5 = !index & (lambda < .Machine$double.eps)
+ if(.llambda == "loge" && (any(lambda[!index0] < .Machine$double.eps))) {
+ ind5 = !index0 & (lambda < .Machine$double.eps)
if(any(ind5))
wz[ind5,iam(2,2,M)] = (1-phi[ind5]) * .Machine$double.eps
}
@@ -621,9 +843,9 @@ zipoisson = function(lphi="logit", llambda="loge",
-zibinomial = function(lphi="logit", link.mu="logit",
- ephi=list(), emu=list(),
- iphi=NULL, zero=1, mv=FALSE)
+ zibinomial = function(lphi="logit", link.mu="logit",
+ ephi=list(), emu=list(),
+ iphi=NULL, zero=1, mv=FALSE)
{
if(as.logical(mv)) stop("argument \"mv\" must be FALSE")
if(mode(lphi) != "character" && mode(lphi) != "name")
@@ -807,7 +1029,7 @@ rzibinom = function(n, size, prob, phi=0) {
-dzinb = function(x, phi, size, prob=NULL, munb=NULL, log=FALSE) {
+dzinegbin = function(x, phi, size, prob=NULL, munb=NULL, log=FALSE) {
if (length(munb)) {
if (length(prob))
stop("'prob' and 'munb' both specified")
@@ -825,7 +1047,7 @@ dzinb = function(x, phi, size, prob=NULL, munb=NULL, log=FALSE) {
ifelse(x==0, phi + (1-phi) * ans, (1-phi) * ans)
}
-pzinb = function(q, phi, size, prob=NULL, munb=NULL) {
+pzinegbin = function(q, phi, size, prob=NULL, munb=NULL) {
if (length(munb)) {
if (length(prob))
stop("'prob' and 'munb' both specified")
@@ -837,7 +1059,7 @@ pzinb = function(q, phi, size, prob=NULL, munb=NULL) {
phi + (1-phi) * ans
}
-qzinb = function(p, phi, size, prob=NULL, munb=NULL) {
+qzinegbin = function(p, phi, size, prob=NULL, munb=NULL) {
if (length(munb)) {
if (length(prob))
stop("'prob' and 'munb' both specified")
@@ -857,7 +1079,7 @@ qzinb = function(p, phi, size, prob=NULL, munb=NULL) {
ans
}
-rzinb = function(n, phi, size, prob=NULL, munb=NULL) {
+rzinegbin = function(n, phi, size, prob=NULL, munb=NULL) {
if (length(munb)) {
if (length(prob))
stop("'prob' and 'munb' both specified")
@@ -882,20 +1104,24 @@ zinegbinomial.control <- function(save.weight=TRUE, ...)
-zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
- ephi=list(), emunb =list(), ek = list(),
- iphi = NULL, ik = NULL, zero = -3, method.init=1,
- shrinkage.init=0.95,
- nsimEIM=200)
+ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
+ ephi=list(), emunb =list(), ek = list(),
+ iphi = NULL, ik = NULL, zero = -3, method.init=1,
+ shrinkage.init=0.95,
+ nsimEIM=200)
{
+
+
if(length(iphi) && (!is.Numeric(iphi, positiv=TRUE) || any(iphi >= 1)))
stop("'iphi' must contain values in (0,1)")
if(length(ik) && !is.Numeric(ik, positiv=TRUE))
stop("'ik' must contain positive values only")
if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
method.init > 3) stop("argument \"method.init\" must be 1, 2 or 3")
- if(!is.Numeric(nsimEIM, allow=1, integ=TRUE) || nsimEIM <= 50)
- stop("'nsimEIM' should be an integer greater than 50")
+ if(!is.Numeric(nsimEIM, allow=1, integ=TRUE))
+ stop("'nsimEIM' must be a positive integer")
+ if(nsimEIM <= 10)
+ warning("'nsimEIM' should be greater than 10, say")
if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
@@ -964,7 +1190,7 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
if( is.Numeric( .ik )) {
matrix( .ik, nr=n, nc=ncoly, byrow=TRUE)
} else {
- zinb.Loglikfun = function(kval, y, x, w, extraargs) {
+ zinegbin.Loglikfun = function(kval, y, x, w, extraargs) {
index = (y == 0)
phivec = extraargs$phi
muvec = extraargs$mu
@@ -975,11 +1201,11 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
mu= muvec[!index], size=kval, log=TRUE)
sum(w[index] * ell0) + sum(w[!index] * ell1)
}
- k.grid = 2^((-3):6)
+ k.grid = 2^((-6):6)
kay.init = matrix(0, nr=n, nc=NOS)
for(spp. in 1:NOS) {
kay.init[,spp.] = getMaxMin(k.grid,
- objfun=zinb.Loglikfun,
+ objfun=zinegbin.Loglikfun,
y=y[,spp.], x=x, w=w,
extraargs= list(phi=phi.init[,spp.],
mu=mu.init[,spp.]))
@@ -1037,23 +1263,7 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
phi = eta2theta(eta[,3*(1:NOS)-2,drop=FALSE], .lphi, earg= .ephi )
munb = eta2theta(eta[,3*(1:NOS)-1,drop=FALSE], .lmunb, earg= .emunb )
kmat = eta2theta(eta[,3*(1:NOS), drop=FALSE], .lk, earg= .ek )
-
-
- ans = 0.0
- for(spp. in 1:NOS) {
- ytemp = y[,spp.]
- phitemp = phi[,spp.]
- ktemp = kmat[,spp.]
- mutemp = munb[,spp.]
- index = (ytemp == 0)
- tmp8 = phitemp[index] + (1.0-phitemp[index]) *
- dnbinom(ytemp[index], mu= mutemp[index], size=ktemp[index])
- ell0 = log(tmp8)
- ell1 = log1p(-phitemp[!index]) + dnbinom(ytemp[!index],
- mu= mutemp[!index], size=ktemp[!index], log=TRUE)
- ans = ans + sum(w[index] * ell0) + sum(w[!index] * ell1)
- }
- ans
+ sum(w*dzinegbin(x=y, phi=phi, munb=munb, size=kmat, log=TRUE))
}, list( .lphi=lphi, .lmunb=lmunb, .lk=lk,
.ephi=ephi, .emunb=emunb, .ek=ek ))),
vfamily=c("zinegbinomial"),
@@ -1107,7 +1317,8 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
run.varcov = 0
sdl.dthetas = matrix(0, n, 3)
for(ii in 1:( .nsimEIM )) {
- ysim = rzinb(n=n,phi=phi[,spp.],size=kmat[,spp.],mu=munb[,spp.])
+ ysim = rzinegbin(n=n, phi=phi[,spp.],
+ size=kmat[,spp.], mu=munb[,spp.])
index = (ysim == 0)
yvec. = ysim[index]
@@ -1127,7 +1338,6 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
(yvec. +kmat.)/(munb.+kmat.) + 1 +
log(kmat./(kmat.+munb.))
sdl.dthetas[!index,] = cbind(dl.dphi, dl.dmunb, dl.dk)
- rm(ysim)
temp3 = sdl.dthetas
run.varcov = ((ii-1) * run.varcov +
temp3[,ind1$row.index]*temp3[,ind1$col.index]) / ii
diff --git a/R/fitted.vlm.q b/R/fitted.vlm.q
index e52aa55..e6b7289 100644
--- a/R/fitted.vlm.q
+++ b/R/fitted.vlm.q
@@ -1,13 +1,13 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
-fitted.vlm <- function(object, matrix=TRUE, ...)
+fitted.vlm <- function(object, matrix.arg=TRUE, ...)
{
answer =
- if(matrix)
+ if(matrix.arg)
object at fitted.values else
{
if(!is.matrix(object at fitted.values) || !length(object at fitted.values))
diff --git a/R/generic.q b/R/generic.q
index 9150006..884c489 100644
--- a/R/generic.q
+++ b/R/generic.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
add1.vgam <- function(...)
diff --git a/R/links.q b/R/links.q
index ad545bf..692d1c1 100644
--- a/R/links.q
+++ b/R/links.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/logLik.vlm.q b/R/logLik.vlm.q
index 238260b..0e682fe 100644
--- a/R/logLik.vlm.q
+++ b/R/logLik.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -12,6 +12,11 @@ if(!isGeneric("logLik"))
setMethod("logLik", "vlm", function(object, ...)
logLik.vlm(object, ...))
+setMethod("logLik", "vglm", function(object, ...)
+ logLik.vlm(object, ...))
+
+setMethod("logLik", "vgam", function(object, ...)
+ logLik.vlm(object, ...))
diff --git a/R/model.matrix.vglm.q b/R/model.matrix.vglm.q
index d9a35c0..a17be0a 100644
--- a/R/model.matrix.vglm.q
+++ b/R/model.matrix.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -191,13 +191,16 @@ lm2vlm.model.matrix <- function(x, Blist=NULL, assign.attributes=TRUE,
}
-model.matrixvlm = function(object, type=c("vlm","lm"), ...) {
+model.matrixvlm = function(object, type=c("vlm","lm","lm2"), ...) {
+
if(mode(type) != "character" && mode(type) != "name")
type <- as.character(substitute(type))
- type <- match.arg(type, c("vlm","lm"))[1]
+ type <- match.arg(type, c("vlm","lm","lm2"))[1]
x <- slot(object, "x")
+ Xm2 <- slot(object, "Xm2")
+
if(!length(x)) {
data = model.frame(object, xlev=object at xlevels, ...)
@@ -207,29 +210,63 @@ model.matrixvlm = function(object, type=c("vlm","lm"), ...) {
contrasts.arg = kill.con)
if(is.R()) {
-if(TRUE) {
- attrassigndefault <- function(mmat, tt) {
- if (!inherits(tt, "terms"))
- stop("need terms object")
- aa <- attr(mmat, "assign")
- if (is.null(aa))
- stop("argument is not really a model matrix")
- ll <- attr(tt, "term.labels")
- if (attr(tt, "intercept") > 0)
- ll <- c("(Intercept)", ll)
- aaa <- factor(aa, labels = ll)
- split(order(aa), aaa)
- }
-}
+ if(TRUE) {
+ attrassigndefault <- function(mmat, tt) {
+ if (!inherits(tt, "terms"))
+ stop("need terms object")
+ aa <- attr(mmat, "assign")
+ if (is.null(aa))
+ stop("argument is not really a model matrix")
+ ll <- attr(tt, "term.labels")
+ if (attr(tt, "intercept") > 0)
+ ll <- c("(Intercept)", ll)
+ aaa <- factor(aa, labels = ll)
+ split(order(aa), aaa)
+ }
+ }
tt = terms(object)
attr(x, "assign") <- attrassigndefault(x, tt)
}
}
+ if(type == "lm2" && !length(Xm2)) {
+ object.copy2 = object
+ object.copy2 at call = object.copy2 at callXm2
+ data = model.frame(object.copy2, xlev=object.copy2 at xlevels, ...)
+
+ kill.con = if(length(object.copy2 at contrasts))
+ object.copy2 at contrasts else NULL
+
+ Xm2 <- vmodel.matrix.default(object.copy2, data=data,
+ contrasts.arg = kill.con)
+ if(is.R()) {
+
+ if(TRUE) {
+ attrassigndefault <- function(mmat, tt) {
+ if (!inherits(tt, "terms"))
+ stop("need terms object")
+ aa <- attr(mmat, "assign")
+ if (is.null(aa))
+ stop("argument is not really a model matrix")
+ ll <- attr(tt, "term.labels")
+ if (attr(tt, "intercept") > 0)
+ ll <- c("(Intercept)", ll)
+ aaa <- factor(aa, labels = ll)
+ split(order(aa), aaa)
+ }
+ }
+ ttXm2 = terms(object.copy2 at misc$form2)
+ attr(Xm2, "assign") <- attrassigndefault(Xm2, ttXm2)
+ }
+ }
+
if(type == "lm") {
return(x)
+ } else
+ if(type == "lm2") {
+ return(Xm2)
} else {
M <- object at misc$M
Blist <- object at constraints # Is NULL if there were no constraints?
diff --git a/R/mux.q b/R/mux.q
index 3bb2fdc..2361901 100644
--- a/R/mux.q
+++ b/R/mux.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -360,7 +360,8 @@ vchol.greenstadt <- function(cc, M, silent=FALSE)
temp3 <- mux55(temp$vectors, temp$values, M=M) # , matrix.arg=TRUE)
ans <- vchol(t(temp3), M=M, n=n, silent=silent) # , matrix.arg=TRUE)
- ans
+
+ if(nrow(ans) == MM) ans else ans[1:MM,,drop=FALSE]
}
diff --git a/R/plot.vglm.q b/R/plot.vglm.q
index bd83a9b..0561677 100644
--- a/R/plot.vglm.q
+++ b/R/plot.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -478,6 +478,7 @@ plotvgam.control = function(
add.arg= FALSE,
one.at.a.time= FALSE,
.include.dots= TRUE,
+ noxmean= FALSE,
...) {
@@ -489,6 +490,7 @@ plotvgam.control = function(
pcol=pcol, lcol=lcol, rcol=rcol, scol=scol,
llwd=llwd, slwd=slwd,
add.arg=add.arg,
+ noxmean=noxmean,
one.at.a.time=one.at.a.time)
if(.include.dots) {
@@ -538,6 +540,7 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
slwd=par()$lwd,
add.arg= FALSE,
one.at.a.time= FALSE,
+ noxmean = FALSE,
separator = ":",
...)
@@ -573,8 +576,8 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
ylab <- add.hookey(ylab, deriv.arg)
- if(xmeanAdded <- (se && !is.null(se.y) &&
- all(substring(ylab, 1:nchar(ylab), 1:nchar(ylab)) != "("))) {
+ if(xmeanAdded <- (se && !is.null(se.y) && !noxmean &&
+ all(substring(ylab, 1:nchar(ylab), 1:nchar(ylab)) != "("))) {
x = c(x, mean(x))
y = rbind(y, 0 * y[1,])
se.y = rbind(se.y, 0 * se.y[1,])
@@ -594,9 +597,9 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
}
if(se && !is.null(se.y)) {
- se.upper <- uy[,which.cf] + 2 * se.y[o,which.cf,drop= FALSE]
- se.lower <- uy[,which.cf] - 2 * se.y[o,which.cf,drop= FALSE]
- ylim <- range(c(ylim, se.upper, se.lower))
+ se.upper <- uy + 2 * se.y[o,,drop= FALSE]
+ se.lower <- uy - 2 * se.y[o,,drop= FALSE]
+ ylim <- range(c(ylim, se.upper[,which.cf], se.lower[,which.cf]))
}
if(!is.null(residuals)) {
@@ -660,46 +663,51 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
scol = rep(scol, len=ncol(uy))
slwd = rep(slwd, len=ncol(uy))
- for(i in 1:ncol(uy))
- if(!length(which.cf) ||
- (length(which.cf) && any(which.cf==i))) {
+ for(ii in 1:ncol(uy)) {
+ if(!length(which.cf) ||
+ (length(which.cf) && any(which.cf == ii))) {
- if(is.Numeric(ylim0, allow=2)) {
- ylim = ylim0
- } else {
- ylim <- range(ylim0, uy[,i], na.rm= TRUE)
- if(se && !is.null(se.y))
- ylim <- range(ylim0, se.lower[,i], se.upper[,i], na.rm= TRUE)
- if(!is.null(residuals))
- ylim <- range(c(ylim, residuals[,i]), na.rm= TRUE)
- ylim <- ylim.scale(ylim, scale)
- }
- if(ncol(uy)>1 && length(separator))
- YLAB <- paste(ylab, separator, i, sep="")
- if(!add.arg) {
- if(one.at.a.time) {
- readline("Hit return for the next plot ")
- }
- if(is.R()) {
- plot(ux, uy[,i], type="n",
- xlim=xlim, ylim=ylim,
- xlab=xlab, ylab=YLAB, ...)
+ if(is.Numeric(ylim0, allow=2)) {
+ ylim = ylim0
} else {
- plot(ux, uy[,i], type="n",
- xlim=xlim, ylim=ylim,
- xlab=xlab, ylab=YLAB, ...)
+ ylim <- range(ylim0, uy[,ii], na.rm= TRUE)
+ if(se && !is.null(se.y))
+ ylim <- range(ylim0, se.lower[,ii], se.upper[,ii],
+ na.rm=TRUE)
+ if(!is.null(residuals))
+ ylim <- range(c(ylim, residuals[,ii]), na.rm= TRUE)
+ ylim <- ylim.scale(ylim, scale)
+ }
+ if(ncol(uy)>1 && length(separator))
+ YLAB <- paste(ylab, separator, ii, sep="")
+ if(!add.arg) {
+ if(one.at.a.time) {
+ readline("Hit return for the next plot ")
+ }
+ if(is.R()) {
+ plot(ux, uy[,ii], type="n",
+ xlim=xlim, ylim=ylim,
+ xlab=xlab, ylab=YLAB, ...)
+ } else {
+ plot(ux, uy[,ii], type="n",
+ xlim=xlim, ylim=ylim,
+ xlab=xlab, ylab=YLAB, ...)
+ }
+ }
+ lines(ux, uy[,ii],
+ lwd=llwd[ii], col=lcol[ii], lty=llty[ii])
+ if(!is.null(residuals))
+ points(x, residuals[,ii], pch=pch[ii],
+ col=pcol[ii], cex=pcex[ii])
+ if(rugplot)
+ if(is.R()) rug(jx, col=rcol[ii]) else rug(jx)
+
+ if(se && !is.null(se.y)) {
+ lines(ux, se.upper[,ii], lty=slty[ii], lwd=slwd[ii],
+ col=scol[ii])
+ lines(ux, se.lower[,ii], lty=slty[ii], lwd=slwd[ii],
+ col=scol[ii])
}
- }
- lines(ux, uy[,i],
- lwd=llwd[i], col=lcol[i], lty=llty[i])
- if(!is.null(residuals))
- points(x, residuals[,i], pch=pch[i], col=pcol[i], cex=pcex[i])
- if(rugplot)
- if(is.R()) rug(jx, col=rcol[i]) else rug(jx)
-
- if(se && !is.null(se.y)) {
- lines(ux, se.upper[,i], lty=slty[i], lwd=slwd[i], col=scol[i])
- lines(ux, se.lower[,i], lty=slty[i], lwd=slwd[i], col=scol[i])
}
}
}
diff --git a/R/predict.vgam.q b/R/predict.vgam.q
index 3471d60..517d0a0 100644
--- a/R/predict.vgam.q
+++ b/R/predict.vgam.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -255,7 +255,7 @@ predict.vgam <- function(object, newdata=NULL,
v = attr(if(se.fit) predictor$fitted.values else
predictor, "vterm.assign")
is.lin <- is.linear.term(names(v))
- coefmat <- coef(object, matrix=TRUE)
+ coefmat <- coefvlm(object, matrix=TRUE)
ord <- 0
for(i in names(v)) {
ord <- ord + 1
diff --git a/R/predict.vglm.q b/R/predict.vglm.q
index 7c444cb..1acfa3d 100644
--- a/R/predict.vglm.q
+++ b/R/predict.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -55,6 +55,15 @@ predict.vglm <- function(object,
"se.fit=FALSE, deriv=0"))
+
+
+
+ if(length(object at misc$form2)) {
+ Xm2 = predict.vlm(object, newdata=newdata, type="lm2", ...)
+ object at extra$Xm2 = Xm2
+ }
+
+
pred =
if(se.fit)
switch(type,
diff --git a/R/predict.vlm.q b/R/predict.vlm.q
index 5658343..34f2763 100644
--- a/R/predict.vlm.q
+++ b/R/predict.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -9,59 +9,10 @@ if(!exists("is.R")) is.R <- function()
exists("version") && !is.null(version$language) && version$language=="R"
-if(FALSE) vmodel.matrix.lm <- function(object, ...) {
- x <- slot(object, "x")
- if(!length(x)) {
- data <- model.framevlm(object, xlev = object at xlevels, ...)
-
- x <- if(is.R()) {
- kill.con <- if(length(object at contrasts)) object at contrasts else
- NULL
- vmodel.matrix.default(object, data = data,
- contrasts = kill.con)
- } else
- model.matrix.default(terms(object), data = data,
- contrasts = object at contrasts)
- }
- x
-}
-
-
-if(!is.R()) {
-if(FALSE) vmodel.frame.lm <- function(formula, data = NULL,
- na.action = NULL, ...) {
- m <- formula at model
- if(!is.null(m))
- return(m)
- oc <- formula at call
- oc$method <- "model.frame"
- oc[[1.]] <- as.name("lm")
- if(length(data)) {
- oc$data <- substitute(data)
- eval(oc, sys.parent())
- }
- else eval(oc, list())
- }
-}
-
-
-if(is.R()) {
-if(FALSE) vmodel.frame.lm = function (formula, data, na.action, ...) {
- if (is.null(formula at model)) {
- fcall <- formula at call
- fcall$method <- "model.frame"
- fcall[[1]] <- as.name("lm")
- env <- environment(fcall$formula)
- if (is.null(env))
- env <- parent.frame()
- eval(fcall, env)
- } else formula at model
- }
-}
-
-
-predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
+predict.vlm <- function(object,
+ newdata=NULL,
+ type=c("response","terms","lm2"),
se.fit = FALSE, scale = NULL,
terms.arg=NULL,
raw=FALSE,
@@ -70,7 +21,7 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
if(mode(type) != "character" && mode(type) != "name")
type <- as.character(substitute(type))
- type <- match.arg(type, c("response","terms"))[1]
+ type <- match.arg(type, c("response","terms","lm2"))[1]
na.act = object at na.action
object at na.action = list()
@@ -90,37 +41,14 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
tt <- terms(object) # 11/8/03; object at terms$terms
+ if(type == "lm2")
+ ttXm2 = terms(object at misc$form2)
+
if(!length(newdata)) {
offset <- object at offset
-
- if(FALSE) {
-
- X <- model.matrixvlm(object, type="lm")
-
-
-
- if(is.R() && !length(object at x)) {
- attrassigndefault <- function(mmat, tt) {
- if (!inherits(tt, "terms"))
- stop("need terms object")
- aa <- attr(mmat, "assign")
- if (is.null(aa))
- stop("argument is not really a model matrix")
- ll <- attr(tt, "term.labels")
- if (attr(tt, "intercept") > 0)
- ll <- c("(Intercept)", ll)
- aaa <- factor(aa, labels = ll)
- split(order(aa), aaa)
- }
- attrassignlm <- function(object, ...)
- attrassigndefault(model.matrix(object, type="lm"),
- terms(object))
-
- attr(X, "assign") <- attrassignlm(X, tt)
- }
- } else {
- X <- model.matrix(object, type="lm")
- }
+ X <- model.matrix(object, type="lm")
+ if(type == "lm2")
+ Xm2 <- model.matrix(object, type="lm2")
} else {
if(is.smart(object) && length(object at smart.prediction)) {
@@ -133,6 +61,11 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
X = model.matrix(delete.response(tt), newdata,
contrasts=if(length(object at contrasts)) object at contrasts else NULL,
xlev = object at xlevels)
+ if(type == "lm2")
+ Xm2 = model.matrix(delete.response(ttXm2), newdata,
+ contrasts=if(length(object at contrasts)) object at contrasts else
+ NULL,
+ xlev = object at xlevels)
if(is.R() && object at misc$intercept.only && nrow(X)!=nrow(newdata)) {
@@ -151,11 +84,16 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
wrapup.smart()
}
- if(is.R())
+ if(is.R()) {
attr(X, "assign") <- attrassigndefault(X, tt)
+ if(type == "lm2" && length(Xm2))
+ attr(Xm2, "assign") <- attrassigndefault(Xm2, ttXm2)
+ }
}
+ if(type == "lm2")
+ return(Xm2)
hasintercept <- attr(tt, "intercept")
@@ -196,7 +134,7 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
X <- lm2vlm.model.matrix(X, Blist=Blist, M=M, xij=object at control$xij)
attr(X, "constant") <- xbar
- coefs <- coef(object)
+ coefs <- coefvlm(object)
vasgn <- attr(X, "vassign")
@@ -235,14 +173,14 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
vasgn,
collapse=type!="terms", M=M,
dimname=list(dx1, dname2),
- coefmat=coef(object, matrix=TRUE))
+ coefmat=coefvlm(object, matrix=TRUE))
pred$df <- object at df.residual
pred$sigma <- sigma
} else
pred <- Build.terms.vlm(X, coefs, cov=NULL, assign = vasgn,
collapse=type!="terms", M=M,
dimname=list(dx1, dname2),
- coefmat=coef(object, matrix=TRUE))
+ coefmat=coefvlm(object, matrix=TRUE))
constant <- attr(pred, "constant")
@@ -394,17 +332,9 @@ canonical.Blist <- function(Blist) {
-
- setMethod("predict", "vlm",
- function(object, ...)
- predict.vlm(object, ...))
-
-
-
-
-
-
-
+setMethod("predict", "vlm",
+ function(object, ...)
+ predict.vlm(object, ...))
diff --git a/R/print.summary.others.q b/R/print.summary.others.q
index 36b4ab7..c511146 100644
--- a/R/print.summary.others.q
+++ b/R/print.summary.others.q
@@ -1,12 +1,11 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
if(FALSE)
-printsummary.lms <- function(x, digits = NULL, quote = TRUE, prefix = "")
-{
+printsummary.lms <- function(x, digits = NULL, quote = TRUE, prefix = "") {
printsummary.vglm(x, digits = NULL, quote = TRUE, prefix = "")
@@ -17,8 +16,8 @@ printsummary.lms <- function(x, digits = NULL, quote = TRUE, prefix = "")
-printsummary.rc.exponential <- function(x, digits = NULL, quote = TRUE, prefix = "")
-{
+printsummary.rc.exponential <- function(x, digits = NULL, quote = TRUE,
+ prefix = "") {
printsummary.vglm(x, digits = NULL, quote = TRUE, prefix = "")
diff --git a/R/print.vglm.q b/R/print.vglm.q
index bad11f4..ec1f5c1 100644
--- a/R/print.vglm.q
+++ b/R/print.vglm.q
@@ -1,9 +1,8 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
-print.vglm <- function(x, ...)
-{
+print.vglm <- function(x, ...) {
if(!is.null(cl <- x at call)) {
cat("Call:\n")
dput(cl)
@@ -30,7 +29,8 @@ print.vglm <- function(x, ...)
if(length(deviance(x)))
cat("Residual Deviance:", format(deviance(x)), "\n")
- llx = logLik(x)
+ llx = logLik.vlm(object = x)
+
if(length(llx))
cat("Log-likelihood:", format(llx), "\n")
@@ -45,8 +45,7 @@ print.vglm <- function(x, ...)
}
-print.vgam <- function(x, digits=2, ...)
-{
+print.vgam <- function(x, digits=2, ...) {
if(!is.null(cl <- x at call)) {
cat("Call:\n")
@@ -68,14 +67,15 @@ print.vgam <- function(x, digits=2, ...)
if(length(deviance(x)))
cat("Residual Deviance:", format(deviance(x)), "\n")
- llx = logLik(x)
+
+ llx = logLik.vlm(object = x)
+
if(length(llx))
cat("Log-likelihood:", format(llx), "\n")
criterion <- attr(terms(x), "criterion") # 11/8/03; x at terms$terms,
if(!is.null(criterion) && criterion!="coefficients")
- cat(paste(criterion, ":", sep=""), format(x[[criterion]]),
- "\n")
+ cat(paste(criterion, ":", sep=""), format(x[[criterion]]), "\n")
invisible(x)
}
diff --git a/R/print.vlm.q b/R/print.vlm.q
index f236d51..2d0ffe1 100644
--- a/R/print.vlm.q
+++ b/R/print.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -13,8 +13,7 @@ setMethod("print", "vlm",
function(x, ...)
print.vlm(x, ...))
-print.vlm <- function(x, ...)
-{
+print.vlm <- function(x, ...) {
if(!is.null(cl <- x at call)) {
cat("Call:\n")
dput(cl)
diff --git a/R/qrrvglm.control.q b/R/qrrvglm.control.q
index 027dd10..94bbb15 100644
--- a/R/qrrvglm.control.q
+++ b/R/qrrvglm.control.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
qrrvglm.control = function(Rank=1,
diff --git a/R/qtplot.q b/R/qtplot.q
index 157d0bf..d3944ed 100644
--- a/R/qtplot.q
+++ b/R/qtplot.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -729,7 +729,7 @@ rlplot.gev <-
zpp[,ii] = object at family@inverse(eta=peta, extra=extra2)[1,]
zpp[,ii] = (zpp[,ii] - zp) / epsilon # On the transformed scale
}
- VCOV = vcov(object, untransform=TRUE)
+ VCOV = vcovvlm(object, untransform=TRUE)
v = numeric(nrow(zpp))
for(ii in 1:nrow(zpp))
v[ii] = t(as.matrix(zpp[ii,])) %*% VCOV %*% as.matrix(zpp[ii,])
diff --git a/R/residuals.vlm.q b/R/residuals.vlm.q
index 84336c3..4ce28b8 100644
--- a/R/residuals.vlm.q
+++ b/R/residuals.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/rrvglm.R b/R/rrvglm.R
index d56da97..37c05de 100644
--- a/R/rrvglm.R
+++ b/R/rrvglm.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/rrvglm.control.q b/R/rrvglm.control.q
index 09a75b9..a5c6b69 100644
--- a/R/rrvglm.control.q
+++ b/R/rrvglm.control.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/rrvglm.fit.q b/R/rrvglm.fit.q
index f064fb2..85acaca 100644
--- a/R/rrvglm.fit.q
+++ b/R/rrvglm.fit.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -80,6 +80,8 @@ rrvglm.fit <- function(x, y, w=rep(1, length(x[, 1])),
(criterion!="coefficients" &&
(if(minimize.criterion) new.crit > old.crit else
new.crit < old.crit)))
+ if(!is.logical(take.half.step))
+ take.half.step = TRUE
if(take.half.step) {
stepsize <- 2 * min(orig.stepsize, 2*stepsize)
new.coeffs.save <- new.coeffs
diff --git a/R/s.q b/R/s.q
index 89e424b..6f903bc 100644
--- a/R/s.q
+++ b/R/s.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/s.vam.q b/R/s.vam.q
index 5a7649f..168ba16 100644
--- a/R/s.vam.q
+++ b/R/s.vam.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/smart.R b/R/smart.R
index d7f9f40..bffee5e 100644
--- a/R/smart.R
+++ b/R/smart.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/step.vglm.q b/R/step.vglm.q
index 6285f0e..484c2da 100644
--- a/R/step.vglm.q
+++ b/R/step.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
step.vglm <- function(fit, ...)
diff --git a/R/summary.others.q b/R/summary.others.q
index 2c16b1c..336f7ae 100644
--- a/R/summary.others.q
+++ b/R/summary.others.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/summary.vgam.q b/R/summary.vgam.q
index 3d9cce9..163c8fa 100644
--- a/R/summary.vgam.q
+++ b/R/summary.vgam.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -154,8 +154,9 @@ printsummary.vgam <- function(x, quote=TRUE, prefix="", digits=options()$digits-
if(length(deviance(x)))
cat("\nResidual Deviance: ", format(round(deviance(x), digits)),
"on", format(round(rdf, 3)), "degrees of freedom\n")
- if(length(logLik(x)))
- cat("\nLog-likelihood:", format(round(logLik(x), digits)),
+
+ if(length(logLik.vlm(x)))
+ cat("\nLog-likelihood:", format(round(logLik.vlm(x), digits)),
"on", format(round(rdf, 3)), "degrees of freedom\n")
if(length(x at criterion)) {
diff --git a/R/summary.vglm.q b/R/summary.vglm.q
index d2798ac..44344db 100644
--- a/R/summary.vglm.q
+++ b/R/summary.vglm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -129,8 +129,8 @@ printsummary.vglm <- function(x, digits = NULL, quote = TRUE, prefix = "",
cat(" on", round(rdf, digits), "degrees of freedom\n") else
cat("\n")
}
- if(length(logLik(x))) {
- cat("\nLog-likelihood:", yformat(logLik(x), digits))
+ if(length(vll <- logLik.vlm(x))) {
+ cat("\nLog-likelihood:", yformat(vll, digits))
if(is.finite(rdf))
cat(" on", round(rdf, digits), "degrees of freedom\n") else
cat("\n")
diff --git a/R/summary.vlm.q b/R/summary.vlm.q
index 8489da5..033491c 100644
--- a/R/summary.vlm.q
+++ b/R/summary.vlm.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/uqo.R b/R/uqo.R
index bff1eeb..7b2f0e7 100644
--- a/R/uqo.R
+++ b/R/uqo.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/vgam.R b/R/vgam.R
index 434efe8..faf9a5e 100644
--- a/R/vgam.R
+++ b/R/vgam.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/vgam.control.q b/R/vgam.control.q
index a0bb5c8..6212769 100644
--- a/R/vgam.control.q
+++ b/R/vgam.control.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/vgam.fit.q b/R/vgam.fit.q
index 562dbbe..32a5550 100644
--- a/R/vgam.fit.q
+++ b/R/vgam.fit.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/vgam.match.q b/R/vgam.match.q
index 4af48c8..b8bbae4 100644
--- a/R/vgam.match.q
+++ b/R/vgam.match.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/vglm.R b/R/vglm.R
index b0040fb..0ccba55 100644
--- a/R/vglm.R
+++ b/R/vglm.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -15,6 +15,7 @@ vglm <- function(formula,
contrasts=NULL,
constraints=NULL,
extra=list(),
+ form2=NULL,
qr.arg=FALSE, smart=TRUE, ...)
{
dataname <- as.character(substitute(data)) # "list" if no data=
@@ -46,6 +47,41 @@ vglm <- function(formula,
matrix(, NROW(Y), 0)
attr(x, "assign") <- attrassigndefault(x, mt) # So as to make it like Splus
+
+
+
+
+
+if(!is.null(form2)) {
+ if(!is.null(subset))
+ stop("argument 'subset' cannot be used when argument 'form2' is used")
+ retlist = shadowvglm(formula=
+ form2,
+ family=family, data=data,
+ na.action=na.action,
+ control=vglm.control(...),
+ method=method,
+ model=model, x.arg=x.arg, y.arg=y.arg,
+ contrasts=contrasts,
+ constraints=constraints,
+ extra=extra,
+ qr.arg=qr.arg)
+ Ym2 <- retlist$Ym2
+ Xm2 <- retlist$Xm2
+
+ if(length(Ym2)) {
+ if(nrow(as.matrix(Ym2)) != nrow(as.matrix(y)))
+ stop("number of rows of y and Ym2 are unequal")
+ }
+ if(length(Xm2)) {
+ if(nrow(as.matrix(Xm2)) != nrow(as.matrix(x)))
+ stop("number of rows of y and Ym2 are unequal")
+ }
+} else {
+ Xm2 = Ym2 = NULL
+}
+
+
offset <- model.offset(mf)
if(is.null(offset))
offset <- 0 # yyy ???
@@ -72,6 +108,7 @@ vglm <- function(formula,
vglm.fitter <- get(method)
fit <- vglm.fitter(x=x, y=y, w=w, offset=offset,
+ Xm2=Xm2, Ym2=Ym2,
etastart=etastart, mustart=mustart, coefstart=coefstart,
family=family,
control=control,
@@ -128,7 +165,15 @@ vglm <- function(formula,
slot(answer, "weights") = as.matrix(fit$weights)
if(x.arg)
- slot(answer, "x") = fit$x # The 'small' design matrix
+ slot(answer, "x") = fit$x # The 'small' (lm) design matrix
+ if(x.arg && length(Xm2))
+ slot(answer, "Xm2") = Xm2 # The second (lm) design matrix
+ if(y.arg && length(Ym2))
+ slot(answer, "Ym2") = as.matrix(Ym2) # The second response
+ if(!is.null(form2))
+ slot(answer, "callXm2") = retlist$call
+ answer at misc$formula = formula
+ answer at misc$form2 = form2
if(length(xlev))
slot(answer, "xlevels") = xlev
@@ -159,3 +204,61 @@ attr(vglm, "smart") <- TRUE
+
+
+
+shadowvglm <-
+ function(formula,
+ family, data=list(),
+ weights=NULL, subset=NULL, na.action=na.fail,
+ etastart=NULL, mustart=NULL, coefstart=NULL,
+ control=vglm.control(...),
+ offset=NULL,
+ method="vglm.fit",
+ model=FALSE, x.arg=TRUE, y.arg=TRUE,
+ contrasts=NULL,
+ constraints=NULL,
+ extra=list(),
+ qr.arg=FALSE, ...)
+{
+ dataname <- as.character(substitute(data)) # "list" if no data=
+ function.name <- "shadowvglm"
+
+ ocall <- match.call()
+
+ if(missing(data))
+ data <- environment(formula)
+
+ mf <- match.call(expand.dots = FALSE)
+ m <- match(c("formula", "data", "subset", "weights", "na.action",
+ "etastart", "mustart", "offset"), names(mf), 0)
+ mf <- mf[c(1, m)]
+ mf$drop.unused.levels <- TRUE
+ mf[[1]] <- as.name("model.frame")
+ mf <- eval(mf, parent.frame())
+ switch(method, model.frame = return(mf), vglm.fit = 1,
+ stop("invalid 'method': ", method))
+ mt <- attr(mf, "terms")
+
+ x <- y <- NULL
+
+ xlev = .getXlevels(mt, mf)
+ y <- model.response(mf, "any") # model.extract(mf, "response")
+ x <- if (!is.empty.model(mt)) model.matrix(mt, mf, contrasts) else
+ matrix(, NROW(Y), 0)
+ attr(x, "assign") <- attrassigndefault(x, mt) # So as to make it like Splus
+
+ list(Xm2=x, Ym2=y, call=ocall)
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/R/vglm.control.q b/R/vglm.control.q
index b7ed382..5d0f100 100644
--- a/R/vglm.control.q
+++ b/R/vglm.control.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/vglm.fit.q b/R/vglm.fit.q
index daaf923..666992c 100644
--- a/R/vglm.fit.q
+++ b/R/vglm.fit.q
@@ -1,10 +1,11 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
vglm.fit <- function(x, y, w=rep(1, length(x[, 1])),
+ Xm2=NULL, Ym2=NULL,
etastart=NULL, mustart=NULL, coefstart=NULL,
offset=0, family,
control=vglm.control(),
@@ -75,6 +76,8 @@ vglm.fit <- function(x, y, w=rep(1, length(x[, 1])),
(criterion!="coefficients" &&
(if(minimize.criterion) new.crit > old.crit else
new.crit < old.crit)))
+ if(!is.logical(take.half.step))
+ take.half.step = TRUE
if(take.half.step) {
stepsize <- 2 * min(orig.stepsize, 2*stepsize)
new.coeffs.save <- new.coeffs
diff --git a/R/vlm.R b/R/vlm.R
index 6bd5e02..27e5361 100644
--- a/R/vlm.R
+++ b/R/vlm.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/R/vlm.wfit.q b/R/vlm.wfit.q
index beb2726..5c38a32 100644
--- a/R/vlm.wfit.q
+++ b/R/vlm.wfit.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -114,7 +114,7 @@ vlm.wfit <- function(x, z, Blist, wz=NULL, U=NULL,
cm <- Blist[[i]]
B[,i] <- cm %*% ans$coef[index]
}
- ans$mat.coefficients <- t(B) # 20/9/99; not $coefficients
+ ans$mat.coefficients <- t(B)
ans
}
diff --git a/R/vsmooth.spline.q b/R/vsmooth.spline.q
index a93c442..c66da8d 100644
--- a/R/vsmooth.spline.q
+++ b/R/vsmooth.spline.q
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
@@ -82,8 +82,7 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
constraints=list("(Intercepts)"=diag(M), x=diag(M)),
tol.nl=0.01, var.arg=FALSE,
scale.w=TRUE,
- nk=NULL)
-{
+ nk=NULL) {
if(var.arg) {
@@ -280,8 +279,8 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
spar.nl <- spar[nonlin]
df.nl <- df[nonlin]
- edimu <- if(trivc) dimw else max(ncb*(ncb+1)/2, dimw) # for wbar's size
- dimu <- if(trivc) dimw else ncb*(ncb+1)/2
+ edimu <- if(trivc != 0) dimw else max(ncb*(ncb+1)/2, dimw) # for wbar's size
+ dimu <- if(trivc != 0) dimw else ncb*(ncb+1)/2
o <- 1:nef # Already sorted
collaps <- dotFortran(name="vsuff9",
@@ -308,7 +307,7 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
varmat <- if(var.arg) {if(ncb > 1) matrix(0, nef, ncb) else
rep(0, nef)} else double(1)
index <- iam(NA, NA, ncb, both=TRUE, diagonal=TRUE)
- dimwbar <- if(trivc) dimw else ncb*(ncb+1)/2
+ dimwbar <- if(trivc != 0) dimw else ncb*(ncb+1)/2
vsplin <- dotFortran(name="vsplin",
xs=as.double(xbar), wz=as.double(collaps$wz),
@@ -386,8 +385,7 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
}
-printvsmooth.spline <- function(x, ...)
-{
+printvsmooth.spline <- function(x, ...) {
if(!is.null(cl <- x at call)) {
cat("Call:\n")
dput(cl)
@@ -402,7 +400,7 @@ printvsmooth.spline <- function(x, ...)
if(length(ncb) && ncb==1) format(x at df) else
paste(format(x at df), collapse=", "), "\n")
- if(!all(trivial.constraints(x at constraints))) {
+ if(!all(trivial.constraints(x at constraints) == 1)) {
cat("\nConstraint matrices:\n")
print(x at constraints)
}
@@ -411,13 +409,15 @@ printvsmooth.spline <- function(x, ...)
}
-coefvsmooth.spline = function(object, matrix=FALSE, ...) {
- list(lfit=coef(object at lfit, matrix=matrix), nlfit=coef(object at nlfit))
+coefvsmooth.spline.fit = function(object, ...) {
+ object at Bcoefficients
}
-coefvsmooth.spline.fit = function(object, ...) {
- object at Bcoefficients
+coefvsmooth.spline = function(object, matrix=FALSE, ...) {
+
+ list(lfit=coefvlm(object at lfit, matrix=matrix),
+ nlfit=coefvsmooth.spline.fit(object at nlfit))
}
@@ -435,8 +435,7 @@ plotvsmooth.spline <- function(x, xlab="x", ylab="", points=TRUE,
pcol=par()$col, pcex=par()$cex,
pch=par()$pch,
lcol=par()$col, lwd=par()$lwd, lty=par()$lty,
- add=FALSE, ...)
-{
+ add=FALSE, ...) {
M = ncol(x at y)
pcol = rep(pcol, length=M)
pcex = rep(pcex, length=M)
@@ -456,8 +455,7 @@ plotvsmooth.spline <- function(x, xlab="x", ylab="", points=TRUE,
-predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE)
-{
+predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE) {
if(se.fit)
warning("se.fit=TRUE is not currently implemented. Using se.fit=FALSE")
@@ -474,7 +472,7 @@ predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE)
}
- mat.coef = coef(lfit, matrix=TRUE)
+ mat.coef = coefvlm(lfit, matrix=TRUE)
coeflfit <- t(mat.coef) # M x p now
M <- nrow(coeflfit) # if(is.matrix(object at y)) ncol(object at y) else 1
@@ -494,8 +492,7 @@ predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE)
}
-predictvsmooth.spline.fit <- function(object, x, deriv=0)
-{
+predictvsmooth.spline.fit <- function(object, x, deriv=0) {
nk = nrow(object at Bcoefficients)
drangex <- object at xmax - object at xmin
if(missing(x))
diff --git a/R/zzz.R b/R/zzz.R
index 3e38373..22a118a 100644
--- a/R/zzz.R
+++ b/R/zzz.R
@@ -1,5 +1,5 @@
# These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
diff --git a/data/ruge.R b/data/ruge.R
index 560691f..363021d 100644
--- a/data/ruge.R
+++ b/data/ruge.R
@@ -1,5 +1,5 @@
"ruge" <-
structure(list(counts = c(57,203,383,525,532,408,273,139,45,27,10,4,0,1,1),
-number = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14), .Names = c("counts",
-"number"), class = "data.frame", row.names = c("1",
-"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14")))
+number = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)), .Names = c("counts",
+"number"), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9",
+"10", "11", "12", "13", "14", "15"), class = "data.frame")
diff --git a/data/wffc.R b/data/wffc.R
new file mode 100644
index 0000000..36d92c2
--- /dev/null
+++ b/data/wffc.R
@@ -0,0 +1,2924 @@
+"wffc" <-
+structure(list(length = c(180, 182, 185, 189, 193, 195, 195,
+197, 198, 209, 210, 215, 215, 218, 218, 219, 228, 228, 241, 303,
+182, 182, 195, 206, 212, 214, 217, 224, 224, 229, 231, 234, 252,
+255, 292, 294, 294, 335, 355, 393, 200, 205, 210, 238, 182, 182,
+186, 201, 205, 208, 209, 216, 218, 221, 222, 223, 224, 225, 226,
+228, 228, 229, 230, 233, 257, 260, 271, 274, 274, 316, 316, 320,
+324, 325, 337, 350, 181, 188, 190, 194, 198, 200, 212, 212, 229,
+231, 238, 240, 252, 180, 203, 205, 240, 260, 180, 180, 181, 181,
+182, 190, 191, 191, 192, 194, 195, 196, 197, 200, 203, 212, 213,
+215, 225, 248, 250, 251, 305, 181, 183, 183, 185, 193, 195, 195,
+205, 206, 210, 210, 221, 226, 231, 248, 251, 251, 257, 267, 277,
+280, 283, 285, 300, 320, 333, 340, 376, 223, 225, 230, 237, 249,
+253, 264, 275, 310, 181, 181, 182, 184, 184, 185, 185, 186, 186,
+188, 195, 195, 212, 214, 215, 235, 281, 312, 190, 201, 204, 210,
+210, 222, 245, 251, 283, 180, 180, 180, 180, 180, 185, 190, 195,
+195, 195, 200, 205, 210, 210, 215, 215, 220, 220, 220, 230, 230,
+255, 280, 280, 180, 180, 181, 182, 183, 185, 189, 195, 199, 203,
+205, 210, 211, 214, 215, 215, 220, 221, 223, 226, 229, 238, 220,
+306, 309, 348, 180, 180, 210, 210, 220, 304, 353, 180, 183, 183,
+185, 185, 187, 187, 201, 202, 230, 296, 194, 208, 213, 213, 219,
+221, 222, 225, 228, 230, 232, 258, 273, 292, 305, 306, 180, 185,
+187, 187, 189, 191, 192, 201, 203, 206, 219, 232, 252, 258, 271,
+316, 180, 188, 190, 192, 195, 210, 223, 226, 226, 231, 247, 284,
+319, 194, 197, 215, 217, 223, 264, 275, 333, 334, 182, 186, 197,
+205, 207, 207, 210, 261, 271, 180, 183, 192, 194, 205, 206, 215,
+218, 225, 225, 230, 247, 338, 180, 180, 180, 180, 185, 190, 190,
+190, 195, 205, 210, 215, 215, 220, 220, 220, 220, 220, 225, 254,
+260, 280, 290, 295, 295, 300, 300, 330, 187, 190, 192, 194, 218,
+225, 269, 270, 271, 314, 183, 183, 185, 190, 190, 195, 204, 205,
+205, 205, 205, 213, 215, 215, 220, 235, 237, 301, 325, 185, 204,
+207, 212, 221, 181, 190, 191, 192, 192, 204, 215, 220, 227, 240,
+240, 245, 246, 285, 302, 302, 310, 330, 390, 190, 268, 181, 181,
+182, 183, 185, 201, 219, 221, 222, 236, 244, 295, 315, 329, 420,
+180, 181, 182, 185, 200, 200, 210, 215, 217, 220, 220, 225, 235,
+245, 260, 270, 375, 375, 380, 445, 180, 181, 185, 190, 195, 201,
+208, 208, 212, 215, 215, 220, 229, 231, 255, 300, 325, 189, 191,
+211, 222, 226, 313, 322, 181, 182, 183, 185, 185, 185, 190, 193,
+196, 198, 200, 200, 200, 205, 205, 210, 210, 211, 215, 220, 229,
+182, 182, 190, 190, 190, 192, 217, 218, 220, 224, 242, 264, 270,
+290, 440, 181, 185, 196, 214, 210, 222, 240, 255, 300, 310, 415,
+180, 184, 194, 195, 204, 215, 231, 263, 378, 185, 190, 205, 213,
+215, 248, 255, 195, 195, 226, 250, 183, 188, 190, 196, 214, 280,
+340, 352, 180, 183, 190, 194, 202, 205, 212, 213, 218, 220, 197,
+198, 180, 180, 180, 190, 200, 210, 210, 250, 260, 182, 182, 186,
+186, 186, 190, 192, 195, 196, 202, 205, 207, 211, 214, 215, 218,
+220, 223, 234, 235, 235, 235, 236, 237, 241, 241, 243, 246, 247,
+248, 251, 252, 253, 262, 277, 180, 185, 185, 185, 190, 190, 200,
+205, 214, 215, 215, 235, 240, 260, 264, 266, 270, 287, 186, 186,
+186, 186, 188, 188, 189, 189, 192, 193, 193, 194, 198, 200, 200,
+207, 210, 213, 222, 224, 241, 246, 256, 260, 265, 266, 272, 276,
+382, 195, 222, 252, 280, 181, 182, 183, 185, 185, 188, 190, 193,
+194, 201, 204, 210, 229, 232, 234, 238, 254, 299, 301, 181, 191,
+194, 196, 212, 229, 242, 245, 250, 255, 261, 261, 266, 293, 297,
+303, 180, 181, 181, 182, 184, 185, 191, 191, 193, 201, 205, 207,
+210, 213, 215, 221, 221, 225, 236, 261, 276, 290, 356, 180, 182,
+190, 191, 192, 203, 207, 213, 214, 215, 220, 223, 233, 240, 241,
+247, 255, 260, 263, 264, 265, 285, 333, 181, 181, 208, 221, 238,
+264, 268, 275, 275, 301, 353, 180, 185, 185, 195, 195, 195, 195,
+199, 200, 200, 200, 201, 205, 210, 210, 223, 223, 235, 240, 252,
+262, 265, 285, 290, 295, 330, 410, 181, 181, 183, 184, 185, 185,
+185, 207, 221, 223, 231, 234, 234, 266, 273, 277, 282, 392, 180,
+187, 190, 195, 195, 195, 197, 200, 213, 215, 220, 222, 249, 257,
+258, 268, 270, 282, 310, 181, 181, 182, 184, 185, 193, 194, 195,
+198, 200, 204, 206, 208, 211, 219, 231, 234, 239, 239, 240, 246,
+257, 258, 260, 265, 270, 280, 302, 327, 345, 455, 195, 239, 251,
+262, 298, 307, 181, 192, 198, 198, 200, 201, 201, 203, 205, 207,
+222, 225, 228, 228, 239, 242, 254, 255, 256, 256, 282, 283, 290,
+185, 195, 202, 202, 245, 255, 265, 290, 295, 335, 393, 182, 200,
+220, 227, 245, 250, 295, 185, 195, 200, 201, 201, 210, 229, 259,
+267, 270, 273, 275, 283, 180, 180, 202, 217, 225, 251, 277, 201,
+217, 257, 258, 276, 279, 321, 324, 329, 352, 180, 181, 183, 196,
+198, 212, 228, 235, 235, 186, 190, 252, 180, 180, 181, 186, 188,
+188, 188, 190, 190, 192, 195, 196, 200, 205, 207, 216, 218, 218,
+225, 227, 230, 244, 246, 251, 255, 262, 291, 315, 180, 185, 185,
+190, 195, 195, 195, 195, 195, 200, 200, 220, 231, 240, 244, 247,
+257, 264, 337, 181, 181, 183, 184, 190, 194, 195, 195, 207, 212,
+215, 231, 233, 237, 238, 245, 251, 251, 252, 262, 272, 280, 285,
+292, 294, 295, 191, 201, 221, 233, 235, 242, 246, 248, 282, 284,
+424, 494, 185, 195, 227, 235, 248, 257, 320, 185, 200, 203, 215,
+235, 248, 250, 180, 180, 185, 185, 192, 194, 201, 210, 213, 221,
+292, 180, 180, 182, 189, 180, 182, 186, 194, 195, 195, 198, 200,
+201, 205, 217, 225, 181, 191, 206, 210, 249, 324, 190, 192, 348,
+180, 180, 182, 192, 195, 195, 195, 202, 212, 220, 240, 246, 247,
+250, 265, 265, 265, 270, 270, 272, 273, 313, 180, 189, 191, 192,
+196, 208, 211, 227, 228, 229, 230, 230, 233, 241, 245, 252, 254,
+256, 258, 262, 267, 276, 295, 362, 229, 246, 196, 212, 225, 228,
+230, 235, 251, 260, 261, 270, 289, 310, 345, 180, 184, 185, 188,
+195, 200, 210, 211, 235, 242, 245, 245, 246, 250, 264, 268, 180,
+182, 183, 202, 215, 190, 200, 210, 330, 325, 356, 185, 245, 256,
+262, 291, 342, 181, 182, 188, 191, 191, 193, 235, 248, 250, 251,
+265, 275, 328, 180, 187, 187, 195, 195, 200, 205, 235, 250, 275,
+286, 379, 192, 185, 188, 195, 221, 226, 236, 181, 183, 186, 187,
+192, 194, 197, 203, 204, 205, 207, 209, 210, 257, 274, 300, 181,
+182, 185, 202, 211, 195, 180, 180, 184, 187, 187, 189, 192, 193,
+194, 196, 196, 197, 197, 198, 200, 204, 205, 207, 207, 208, 213,
+220, 223, 225, 228, 230, 233, 234, 236, 237, 238, 242, 258, 265,
+291, 292, 293, 180, 200, 205, 205, 210, 210, 210, 214, 220, 220,
+225, 250, 270, 290, 300, 180, 181, 181, 185, 189, 190, 191, 192,
+201, 210, 212, 218, 224, 226, 231, 262, 185, 185, 190, 196, 200,
+205, 205, 210, 218, 226, 226, 230, 230, 230, 230, 240, 240, 240,
+243, 245, 248, 250, 250, 250, 250, 255, 255, 260, 265, 270, 300,
+300, 320, 320, 180, 180, 183, 185, 196, 198, 198, 201, 201, 203,
+205, 206, 208, 208, 210, 214, 215, 215, 216, 221, 222, 234, 238,
+238, 253, 253, 259, 261, 276, 180, 180, 180, 180, 181, 185, 185,
+190, 198, 200, 210, 210, 212, 215, 218, 220, 220, 222, 228, 230,
+230, 232, 239, 239, 240, 290, 290, 295, 185, 190, 195, 195, 212,
+216, 218, 218, 222, 233, 235, 240, 242, 245, 246, 250, 251, 255,
+255, 257, 280, 295, 328, 359, 180, 195, 210, 220, 220, 223, 230,
+230, 240, 242, 249, 258, 263, 267, 287, 337, 181, 190, 195, 195,
+198, 210, 212, 214, 220, 222, 223, 224, 244, 250, 275, 283, 284,
+319, 438, 180, 180, 182, 185, 189, 192, 192, 194, 198, 202, 208,
+210, 215, 215, 225, 228, 232, 238, 243, 256, 262, 273, 180, 180,
+180, 180, 180, 185, 185, 185, 186, 190, 190, 192, 193, 194, 195,
+198, 201, 208, 210, 210, 215, 216, 216, 235, 235, 240, 245, 245,
+290, 180, 181, 182, 183, 196, 200, 208, 210, 210, 237, 243, 264,
+180, 180, 187, 188, 202, 207, 210, 222, 225, 244, 185, 192, 193,
+201, 205, 225, 245, 255, 255, 258, 180, 180, 180, 180, 180, 182,
+183, 183, 186, 189, 197, 200, 200, 205, 210, 216, 219, 220, 222,
+225, 226, 226, 236, 257, 258, 258, 280, 290, 190, 246, 185, 197,
+198, 208, 228, 243, 243, 297, 298, 300, 315, 340, 345, 345, 183,
+189, 305, 396, 180, 180, 182, 182, 185, 186, 188, 188, 192, 192,
+193, 197, 201, 213, 221, 222, 224, 224, 225, 226, 231, 232, 237,
+247, 262, 265, 315, 180, 180, 180, 180, 180, 181, 190, 190, 192,
+192, 195, 200, 200, 210, 210, 210, 210, 212, 215, 220, 220, 230,
+230, 231, 240, 320, 180, 183, 183, 188, 193, 200, 200, 204, 204,
+206, 208, 209, 211, 213, 215, 218, 223, 224, 225, 227, 260, 180,
+180, 180, 182, 187, 190, 192, 195, 197, 200, 205, 206, 209, 211,
+211, 214, 225, 230, 230, 232, 233, 233, 233, 237, 247, 247, 252,
+290, 180, 196, 211, 221, 222, 226, 365, 190, 192, 195, 200, 200,
+204, 210, 212, 219, 220, 222, 225, 227, 227, 227, 228, 229, 232,
+235, 239, 240, 244, 245, 252, 254, 257, 258, 270, 281, 281, 290,
+190, 212, 240, 243, 252, 282, 358, 185, 194, 200, 210, 221, 223,
+228, 230, 232, 250, 255, 257, 258, 262, 299, 314, 180, 193, 198,
+198, 199, 205, 208, 224, 232, 232, 234, 237, 241, 245, 282, 292,
+295, 356, 370, 180, 186, 191, 196, 196, 213, 216, 225, 240, 183,
+188, 192, 213, 223, 252, 185, 190, 195, 198, 200, 203, 205, 212,
+225, 264, 182, 183, 189, 192, 195, 197, 219, 224, 226, 242, 244,
+244, 249, 270, 272, 274, 285, 308, 208, 222, 235, 281, 180, 180,
+180, 180, 181, 183, 202, 210, 220, 224, 229, 229, 239, 248, 265,
+286, 292, 245, 265, 180, 180, 193, 204, 207, 230, 260, 262, 274,
+401, 180, 190, 201, 210, 218, 220, 221, 225, 225, 233, 243, 244,
+253, 254, 345, 194, 195, 196, 214, 215, 226, 241, 248, 256, 304,
+218, 195, 180, 180, 180, 183, 184, 185, 185, 188, 193, 199, 218,
+221, 246, 260, 262, 290, 290, 305, 331, 332, 345, 180, 185, 191,
+196, 200, 222, 224, 242, 242, 261, 515, 180, 181, 232, 232, 251,
+252, 265, 185, 194, 202, 210, 235, 241, 243, 244, 250, 283, 285,
+287, 395, 191, 213, 214, 214, 214, 258, 262, 287, 301, 425, 214,
+218, 190, 195, 198, 210, 214, 216, 223, 224, 230, 236, 240, 284,
+298, 300, 180, 188, 192, 195, 198, 202, 204, 218, 218, 227, 230,
+235, 245, 254, 256, 263, 266, 275, 285, 301, 302, 392, 180, 180,
+180, 190, 199, 204, 205, 210, 212, 214, 214, 217, 218, 220, 224,
+225, 230, 230, 230, 239, 240, 241, 248, 250, 252, 265, 275, 279,
+290, 293, 310, 315, 180, 208, 210, 245, 180, 195, 199, 210, 210,
+215, 217, 220, 250, 265, 275, 275, 180, 185, 210, 215, 261, 207,
+210, 226, 227, 236, 237, 245, 246, 263, 269, 294, 308, 329, 182,
+184, 189, 190, 192, 194, 195, 215, 216, 220, 220, 225, 231, 232,
+238, 246, 248, 259, 277, 279, 307, 323, 180, 183, 191, 196, 197,
+198, 202, 202, 204, 206, 211, 226, 243, 256, 258, 260, 265, 265,
+281, 282, 294, 295, 180, 270, 274, 280, 330, 330, 350, 180, 180,
+180, 180, 181, 190, 190, 195, 200, 202, 203, 203, 206, 207, 208,
+216, 218, 219, 220, 220, 230, 234, 235, 236, 258, 262, 263, 272,
+274, 280, 280, 281, 294, 308, 323, 329, 333, 180, 182, 184, 190,
+215, 215, 215, 227, 231, 235, 240, 242, 250, 260, 280, 288, 345,
+180, 180, 182, 184, 195, 195, 198, 207, 212, 220, 220, 230, 246,
+247, 248, 248, 250, 255, 255, 262, 273, 281, 284, 290, 290, 300,
+327, 345, 181, 205, 206, 210, 219, 230, 260, 265, 290, 300, 300,
+180, 205, 207, 227, 227, 240, 250, 279, 310, 180, 197, 198, 235,
+240, 260, 285, 182, 182, 187, 192, 195, 200, 215, 216, 220, 228,
+248, 254, 263, 270, 300, 301, 303, 303, 320, 394, 181, 182, 190,
+194, 195, 220, 238, 240, 265, 280, 332, 180, 185, 185, 190, 194,
+201, 215, 218, 231, 286, 180, 185, 190, 190, 195, 200, 220, 230,
+240, 265, 280, 300, 302, 340, 181, 181, 187, 188, 197, 197, 198,
+203, 205, 212, 222, 222, 230, 236, 237, 238, 263, 266, 183, 249,
+252, 264, 302, 180, 180, 181, 182, 183, 192, 192, 199, 201, 202,
+202, 203, 211, 212, 213, 214, 215, 221, 222, 224, 227, 230, 234,
+259, 264, 277, 280, 281, 294, 315, 195, 230, 230, 240, 255, 265,
+298, 180, 180, 187, 189, 189, 206, 228, 242, 245, 255, 281, 282,
+285, 297, 304, 180, 180, 185, 190, 200, 240, 320, 186, 200, 210,
+260, 302, 180, 195, 247, 251, 254, 263, 278, 296, 310, 318, 426,
+180, 180, 182, 193, 201, 204, 247, 301, 317, 182, 270, 273, 285,
+182, 200, 208, 212, 213, 216, 229, 231, 243, 260, 345, 183, 207,
+215, 337, 180, 212, 180, 220, 265, 290, 199, 185, 263, 180, 180,
+182, 183, 185, 185, 190, 190, 211, 214, 232, 232, 234, 247, 249,
+251, 263, 309, 186, 196, 201, 241, 256, 290, 294, 331, 185, 180,
+182, 203, 203, 208, 211, 223, 223, 226, 233, 234, 244, 254, 190,
+190, 210, 210, 226, 232, 430, 182, 185, 274, 180, 180, 195, 220,
+230, 250, 265, 300, 300, 320, 325, 350, 245, 254, 300, 303, 342,
+560, 182, 185, 192, 195, 199, 205, 217, 223, 224, 227, 230, 240,
+245, 246, 258, 265, 273, 285, 295, 305, 312, 330, 336, 343, 193,
+198, 200, 225, 228, 238, 244, 284, 290, 297, 302, 182, 186, 189,
+194, 233, 250, 251, 294, 307, 335, 180, 182, 202, 217, 470, 180,
+187, 198, 239, 240, 274, 331, 335, 340, 359, 360, 365, 365, 367,
+182, 216, 332, 215, 268, 365, 435, 181, 189, 208, 212, 334, 191,
+201, 209, 211, 250, 394, 425, 457, 488, 498, 188, 189, 190, 200,
+215, 220, 228, 314, 325, 335, 355, 378, 420, 488, 185, 185, 195,
+204, 208, 210, 220, 220, 225, 225, 230, 245, 342, 355, 390, 432,
+478, 481, 510, 181, 184, 195, 225, 225, 226, 235, 242, 244, 338,
+342, 388, 540, 193, 206, 214, 215, 296, 310, 460, 181, 216, 331,
+333, 445, 500, 580, 185, 186, 212, 222, 232, 246, 272, 340, 343,
+348, 372, 385, 395, 402, 435, 445, 477, 518, 181, 182, 185, 185,
+192, 195, 196, 198, 202, 213, 220, 225, 227, 230, 232, 232, 291,
+294, 314, 325, 330, 338, 340, 360, 490, 181, 181, 181, 182, 184,
+194, 197, 207, 215, 220, 226, 230, 230, 309, 314, 338, 395, 477,
+180, 182, 182, 182, 185, 185, 190, 193, 196, 197, 198, 199, 206,
+207, 221, 222, 222, 223, 225, 225, 226, 232, 246, 252, 312, 181,
+181, 185, 185, 187, 201, 205, 210, 215, 216, 225, 181, 182, 182,
+193, 193, 198, 201, 201, 205, 206, 208, 212, 218, 230, 275, 325,
+335, 336, 339, 368, 432, 436, 503, 535, 195, 196, 198, 208, 210,
+210, 212, 217, 365, 364, 376, 463, 586, 600, 613, 195, 225, 460,
+460, 480, 555, 560, 180, 181, 184, 191, 195, 196, 197, 208, 447,
+451, 489, 181, 181, 181, 182, 182, 193, 194, 202, 202, 203, 205,
+210, 220, 228, 228, 243, 245, 248, 450, 181, 181, 186, 186, 188,
+196, 196, 197, 198, 200, 202, 205, 211, 211, 212, 215, 221, 225,
+226, 227, 230, 235, 243, 281, 336, 498, 195, 200, 214, 203, 207,
+218, 223, 236, 190, 198, 200, 200, 205, 208, 210, 210, 215, 216,
+225, 225, 227, 230, 237, 240, 248, 310, 315, 315, 370, 370, 390,
+405, 420, 420, 478, 499, 212, 254, 222, 300, 522, 185, 192, 193,
+215, 230, 332, 393, 560, 582, 582, 181, 181, 182, 189, 193, 195,
+196, 214, 215, 362, 181, 187, 201, 210, 211, 230, 231, 239, 240,
+246, 258, 339, 370, 388, 419, 471, 556, 570, 183, 190, 190, 190,
+196, 210, 210, 210, 211, 268, 328, 331, 495, 181, 181, 185, 198,
+198, 205, 210, 215, 215, 225, 227, 228, 230, 230, 235, 245, 310,
+513, 186, 193, 194, 196, 196, 203, 205, 210, 210, 212, 214, 215,
+221, 224, 227, 228, 248, 254, 310, 335, 347, 380, 396, 520, 202,
+210, 212, 217, 228, 240, 247, 259, 285, 293, 312, 315, 325, 352,
+363, 371, 382, 427, 453, 510, 192, 217, 219, 243, 369, 374, 360,
+382, 202, 250, 335, 360, 370, 401, 402, 450, 580, 180, 180, 181,
+182, 182, 182, 182, 183, 184, 184, 187, 188, 188, 190, 192, 196,
+196, 198, 200, 200, 202, 203, 205, 210, 215, 220, 220, 230, 245,
+360, 480, 185, 195, 240, 240, 245, 335, 423, 432, 443, 482, 494,
+506, 510, 190, 198, 200, 215, 228, 230, 232, 390, 181, 182, 185,
+185, 186, 187, 188, 190, 190, 190, 191, 192, 195, 196, 205, 217,
+218, 222, 222, 225, 227, 228, 229, 235, 239, 250, 395, 409, 410,
+190, 193, 217, 225, 378, 410, 181, 185, 185, 189, 192, 194, 195,
+201, 210, 210, 212, 219, 220, 222, 230, 340, 180, 186, 193, 199,
+225, 260, 181, 182, 183, 183, 186, 188, 189, 196, 197, 198, 207,
+214, 216, 260, 350, 370, 370, 404, 437, 503, 195, 195, 195, 195,
+200, 200, 210, 210, 215, 230, 230, 235, 245, 323, 325, 330, 335,
+345, 395, 495, 500, 560, 182, 200, 220, 223, 186, 187, 193, 193,
+203, 206, 208, 210, 214, 216, 226, 255, 195, 181, 185, 186, 186,
+188, 192, 193, 193, 194, 197, 202, 212, 214, 214, 216, 218, 219,
+220, 222, 223, 225, 227, 229, 309, 313, 334, 343, 419, 181, 181,
+193, 194, 198, 190, 200, 200, 220, 240, 250, 320, 330, 380, 470,
+500, 181, 189, 190, 199, 200, 202, 215, 216, 219, 239, 325, 332,
+333, 356, 369, 376, 379, 440, 452, 525, 200, 202, 204, 204, 205,
+219, 220, 304, 316, 320, 324, 333, 340, 340, 342, 342, 344, 365,
+453, 466, 506, 181, 182, 185, 196, 197, 198, 199, 212, 242, 327,
+335, 342, 402, 403, 431, 185, 195, 195, 195, 195, 200, 200, 205,
+215, 220, 225, 225, 235, 290, 308, 330, 355, 400, 420, 430, 450,
+180, 182, 191, 191, 193, 194, 195, 195, 195, 210, 212, 213, 225,
+227, 230, 298, 311, 314, 332, 335, 350, 375, 396, 413, 417, 460,
+475, 510, 180, 185, 186, 186, 190, 195, 203, 207, 210, 210, 218,
+219, 225, 226, 326, 344, 345, 410, 420, 465, 190, 210, 220, 272,
+272, 272, 272, 272, 350, 430, 435, 465, 486, 195, 345, 402, 414,
+445, 182, 208, 213, 214, 221, 226, 415, 180, 182, 182, 183, 185,
+190, 195, 205, 215, 220, 225, 225, 235, 250, 290, 310, 331, 335,
+375, 485, 189, 200, 210, 216, 222, 226, 321, 490, 180, 183, 186,
+200, 202, 206, 214, 222, 255, 316, 385, 474, 181, 181, 183, 183,
+184, 185, 186, 187, 188, 189, 191, 192, 195, 199, 209, 210, 210,
+210, 213, 215, 419, 185, 185, 190, 195, 198, 200, 204, 205, 205,
+208, 208, 215, 222, 314, 445, 180, 181, 185, 185, 186, 186, 190,
+194, 194, 196, 201, 207, 218, 220, 222, 233, 235, 305, 325, 325,
+360, 390, 180, 187, 191, 208, 214, 218, 223, 227, 243, 268, 302,
+337, 365, 377, 380, 386, 415, 420, 420, 422, 475, 480, 518, 540,
+185, 190, 200, 207, 208, 212, 215, 222, 225, 230, 235, 344, 360,
+370, 380, 390, 392, 485, 188, 189, 195, 196, 215, 217, 223, 227,
+352, 424, 180, 181, 182, 185, 186, 186, 191, 192, 193, 194, 195,
+200, 200, 200, 208, 210, 210, 218, 220, 222, 233, 245, 181, 202,
+325, 380, 181, 181, 186, 189, 189, 189, 191, 194, 195, 195, 197,
+197, 199, 204, 206, 206, 208, 209, 209, 210, 210, 214, 215, 216,
+235, 347, 389, 420, 437, 491, 181, 182, 183, 184, 185, 186, 186,
+191, 192, 193, 194, 198, 200, 202, 203, 205, 208, 212, 228, 235,
+294, 180, 215, 293, 190, 214, 245, 305, 309, 343, 358, 363, 433,
+437, 181, 181, 183, 185, 185, 190, 195, 197, 202, 203, 215, 215,
+232, 315, 185, 465, 475, 190, 190, 190, 195, 205, 210, 210, 210,
+215, 225, 245, 245, 250, 350, 390, 501, 182, 183, 188, 188, 189,
+192, 193, 195, 200, 202, 202, 205, 207, 207, 217, 217, 221, 222,
+223, 235, 318, 332, 335, 340, 370, 413, 446, 450, 475, 515, 185,
+192, 193, 195, 195, 195, 195, 205, 205, 210, 210, 210, 210, 212,
+213, 214, 218, 218, 228, 259, 458, 180, 195, 205, 205, 230, 305,
+320, 325, 330, 390, 425, 490, 186, 189, 194, 202, 205, 224, 228,
+180, 181, 181, 182, 185, 185, 195, 197, 203, 221, 223, 305, 181,
+181, 185, 186, 188, 192, 192, 193, 195, 202, 205, 208, 212, 223,
+244, 324, 335, 335, 356, 375, 381, 388, 413, 424, 180, 181, 184,
+188, 190, 210, 215, 226, 323, 180, 183, 200, 204, 209, 215, 311,
+326, 391, 428, 180, 180, 180, 183, 185, 185, 189, 192, 193, 195,
+197, 200, 201, 202, 202, 203, 205, 208, 210, 214, 218, 220, 221,
+225, 229, 251, 350, 440, 198, 215, 227, 246, 307, 334, 427, 430,
+432, 445, 465, 492, 181, 181, 182, 184, 185, 186, 190, 190, 192,
+193, 198, 199, 200, 201, 209, 218, 221, 224, 224, 227, 232, 236,
+321, 338, 339, 345, 351, 353, 430, 180, 181, 184, 185, 190, 194,
+195, 211, 213, 222, 230, 230, 372, 460, 475, 180, 181, 185, 200,
+205, 215, 370, 234, 532, 624, 528, 312, 202, 195, 253, 615, 235,
+210, 572, 215, 194, 203, 203, 200, 198, 495, 520, 205, 220, 220,
+486, 190, 225, 219, 391, 376, 425, 220, 580, 510, 225, 210, 193,
+395, 580, 420, 560, 425, 440, 284, 429, 530, 688, 197, 224, 225,
+510, 487, 379, 568, 462, 572, 206, 186, 216, 208, 200, 396, 194,
+503, 237, 231, 201, 183, 388, 438, 417, 413, 450, 592, 185, 228,
+478, 205, 205, 437, 480, 184, 225, 203, 485, 574, 496, 424, 544,
+335, 405, 514, 207, 408, 230, 186, 216, 202, 467, 193, 187, 435,
+508, 187, 590, 198, 222, 571, 285, 568, 228, 285, 435, 499, 399,
+508, 390, 209, 225, 450, 541, 362, 415, 238, 610, 214, 500, 388,
+215, 356, 432, 518, 412, 689, 212, 205, 202, 485, 610, 195, 220,
+627, 549, 525, 273, 190, 197, 242, 193, 215, 484, 436, 442, 431,
+211, 267, 365, 250, 186, 211, 430, 365, 186, 208, 189, 208, 389,
+211, 241, 196, 504, 421, 242, 320, 402, 501, 211, 195, 652, 550,
+198, 202, 215, 198, 568, 210, 585, 225, 570, 230, 575, 200, 191,
+615, 223, 418, 210, 521, 380, 560, 224, 620, 232, 236, 180, 230,
+220, 238, 194, 183, 222, 181, 182, 552, 191, 208, 430, 225, 226,
+206, 212, 197, 212, 205, 195, 400, 375, 235, 186, 535, 391, 385,
+375, 213, 212, 410, 211, 404, 227, 213, 194, 221, 400, 575, 180,
+200, 205, 585, 391, 486, 250, 222, 213, 365, 206, 221, 206, 207,
+180, 458, 216, 457, 211, 226, 211, 197, 443, 188, 215, 211, 185,
+203, 590, 229, 439, 423, 291, 565, 470, 312, 455, 441, 441, 254,
+406, 340, 498, 498, 475, 574, 435, 205, 425, 425, 486, 443, 482,
+505, 495, 470, 545, 385, 444, 477, 265, 391, 457, 429, 430, 450,
+480, 450, 441, 270, 545, 505, 450, 481, 524, 480, 293, 439, 252,
+471, 467, 476, 511, 473, 535, 462, 604, 426, 443, 421, 470, 515,
+501, 476, 487, 493, 580, 490, 410, 383, 510, 470, 510, 455, 234,
+492, 490, 572, 400, 490, 435, 490, 466, 195, 184, 431, 235, 415,
+444, 405, 430, 500, 465, 548, 461, 475, 427, 400, 510, 328, 231,
+461, 430, 505, 263, 411, 450, 490, 455, 242, 395, 530, 444, 550,
+440, 565, 490, 565, 490, 525, 475, 517, 510, 480, 470, 510, 470,
+474, 399, 292, 533, 406, 455, 512, 287, 530, 411, 450, 395, 477,
+493, 396, 414, 518, 520, 590, 594, 439, 407, 417, 361, 528, 498,
+390, 470, 432, 505, 475, 445, 510, 410, 375, 435, 190, 480, 475,
+204, 414, 442, 441, 276, 347, 450, 340, 260, 431, 467, 457, 414,
+412, 535, 563, 454, 393, 447, 189, 461, 428, 425, 439, 314, 420,
+290, 455, 400, 405, 372, 430, 538, 530, 274), water = structure(c(1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5), .Label = c("Waihou", "Waimakariri", "Whanganui", "Otamangakau",
+"Rotoaira"), class = "factor"), session = c(1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), sector = c(4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3), beatboat = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8,
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 2, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+8, 8, 8, 8, 8, 9, 9, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
+6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9,
+9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16,
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16,
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18,
+18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18,
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11,
+12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+18, 18, 18, 18, 18, 19, 19, 19, 19, 10, 10, 11, 11, 11, 11, 11,
+11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, 16,
+16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 18, 18, 18, 18, 18, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9,
+9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
+5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7,
+7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8,
+8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19,
+19, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15,
+15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19,
+19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13,
+13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 15, 15,
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12,
+12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,
+14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
+16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 1, 1, 1,
+1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
+8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 1, 2, 2, 2, 2,
+2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9,
+9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+9, 9, 9, 9, 9, 9, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1,
+1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5,
+5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7,
+7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,
+14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 17,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18,
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11,
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
+18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+19, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,
+11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16,
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17,
+17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19,
+19, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11,
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
+15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+19, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16,
+16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 1, 1, 3, 3, 5, 5, 6,
+6, 7, 8, 8, 8, 8, 9, 10, 11, 11, 12, 12, 12, 12, 12, 13, 13,
+13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16,
+17, 17, 19, 19, 19, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 9, 9, 10,
+10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15,
+15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 1,
+2, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 9,
+9, 9, 11, 11, 11, 11, 11, 12, 13, 13, 15, 15, 16, 16, 16, 16,
+16, 17, 18, 18, 18, 18, 18, 18, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3,
+4, 4, 4, 4, 5, 5, 5, 5, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11,
+11, 11, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 17,
+17, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 7, 7, 7, 7, 7, 7, 8, 9, 10, 10,
+11, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
+14, 15, 15, 15, 16, 16, 17, 17, 17, 17, 18, 19, 19, 19, 19, 1,
+1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 10, 11, 11, 12, 12, 12, 13, 13,
+14, 14, 14, 15, 15, 15, 15, 15, 16, 17, 17, 1, 1, 1, 2, 3, 3,
+4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 10, 10,
+10, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 15, 15, 17, 17,
+17, 17, 17, 17, 18, 18, 19, 19, 19, 19, 1, 2, 2, 2, 3, 3, 3,
+3, 4, 4, 5, 5, 5, 8, 8, 9, 9, 9, 10, 11, 11, 11, 12, 12, 13,
+13, 14, 14, 15, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+17, 18, 18, 18, 19, 19, 1, 1, 1, 3, 3, 3, 4, 4, 5, 6, 7, 7, 9,
+9, 9, 9, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 17,
+17, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 2, 2, 4, 5, 5, 7,
+7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 13, 14, 14, 14, 14, 15, 15, 15,
+15, 17, 18, 18, 19, 19, 19), comid = c(42, 42, 42, 42, 42, 42,
+42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 74, 74, 74, 74, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 79,
+79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 90, 90, 90, 90,
+90, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 24, 24, 24, 24, 55, 55, 55, 55, 55, 55, 55, 55,
+55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+55, 55, 55, 55, 88, 88, 88, 88, 88, 88, 88, 88, 88, 61, 61, 61,
+61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 30,
+30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+35, 35, 35, 35, 35, 35, 92, 92, 92, 92, 73, 73, 73, 73, 73, 73,
+73, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 31, 31, 31, 31,
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 50, 50, 50, 50,
+50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 69, 69, 69, 69,
+69, 69, 69, 69, 69, 69, 69, 69, 69, 54, 54, 54, 54, 54, 54, 54,
+54, 54, 51, 51, 51, 51, 51, 51, 51, 51, 51, 82, 82, 82, 82, 82,
+82, 82, 82, 82, 82, 82, 82, 82, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 40, 40,
+40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+40, 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 95, 94, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+33, 33, 33, 33, 33, 33, 33, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+20, 20, 20, 20, 20, 20, 20, 20, 65, 65, 65, 65, 65, 65, 65, 56,
+56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+56, 56, 56, 56, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+52, 52, 52, 77, 77, 91, 91, 17, 17, 17, 17, 17, 17, 17, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 4, 4, 4, 4, 4, 4, 4, 85, 85, 85,
+85, 8, 8, 8, 8, 8, 8, 8, 8, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+22, 62, 62, 39, 39, 39, 39, 39, 39, 39, 39, 39, 19, 19, 19, 19,
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 63,
+63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+63, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 98, 98,
+98, 98, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+53, 53, 53, 53, 53, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 46, 46, 46, 46,
+46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+46, 46, 46, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 45, 45,
+45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 47, 47, 47, 47, 47,
+47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 38, 38, 38, 38, 38,
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 9, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 81, 81, 81, 81, 81, 81, 32, 32, 32, 32,
+32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+32, 32, 32, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 68, 68,
+68, 68, 68, 68, 68, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+58, 58, 60, 60, 60, 60, 60, 60, 60, 21, 21, 21, 21, 21, 21, 21,
+21, 21, 21, 64, 64, 64, 64, 64, 64, 64, 64, 64, 96, 96, 96, 7,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+36, 36, 36, 36, 36, 36, 36, 36, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 18, 18, 18, 18,
+18, 18, 18, 18, 18, 18, 18, 18, 59, 59, 59, 59, 59, 59, 59, 84,
+84, 84, 84, 84, 84, 84, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 67, 67, 67, 67, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 66, 66, 66, 66, 66, 66, 78, 78, 78, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 43, 43, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+44, 44, 48, 48, 48, 48, 48, 86, 86, 86, 86, 76, 76, 83, 83, 83,
+83, 83, 83, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 97, 71, 71, 71,
+71, 71, 71, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+37, 37, 37, 87, 87, 87, 87, 87, 49, 50, 50, 50, 50, 50, 50, 50,
+50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 92, 92,
+92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 68, 68, 68,
+68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 21, 21, 21,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 31,
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 23, 23, 23, 23, 23, 23, 23, 23,
+23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+58, 58, 58, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+53, 53, 53, 53, 53, 53, 53, 53, 53, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 90,
+90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 42, 42, 42, 42, 42,
+42, 42, 42, 42, 42, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 63,
+63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 98, 98, 70, 70, 70,
+70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 74, 74, 74, 74, 51,
+51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 18, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+59, 59, 59, 59, 59, 59, 59, 59, 59, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 89, 89, 89, 89, 89, 89, 89, 11, 11, 11, 11,
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 69, 69, 69, 69, 69,
+69, 69, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+84, 84, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+54, 54, 54, 54, 54, 71, 71, 71, 71, 71, 71, 71, 71, 71, 17, 17,
+17, 17, 17, 17, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 22, 22,
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+91, 91, 91, 91, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 75, 75, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 39,
+39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 56, 56,
+56, 56, 56, 56, 56, 56, 56, 56, 99, 65, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 52,
+52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 95, 95, 95, 95, 95, 95,
+95, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 77, 77, 60, 60, 60, 60, 60, 60,
+60, 60, 60, 60, 60, 60, 60, 60, 32, 32, 32, 32, 32, 32, 32, 32,
+32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 38, 38,
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 35, 35,
+35, 35, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 73, 73,
+73, 73, 73, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+41, 41, 41, 41, 41, 41, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 47, 47, 47, 47, 47, 47, 47, 45, 45,
+45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+45, 45, 45, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 55, 55, 55, 55, 55,
+55, 55, 55, 55, 46, 46, 46, 46, 46, 46, 46, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+19, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+96, 96, 96, 96, 96, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 67, 67, 67, 67,
+67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64,
+64, 64, 64, 64, 64, 64, 82, 82, 82, 82, 82, 36, 36, 36, 36, 36,
+36, 36, 36, 36, 36, 36, 40, 40, 40, 40, 40, 40, 40, 40, 40, 57,
+57, 57, 57, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 85, 85,
+85, 85, 76, 76, 37, 37, 37, 37, 62, 97, 97, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 8, 8, 8,
+8, 8, 8, 8, 8, 49, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 94, 94, 94, 94, 94, 94, 94, 66, 66, 66, 33, 33, 33, 33,
+33, 33, 33, 33, 33, 33, 33, 33, 86, 86, 86, 86, 86, 86, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43,
+43, 43, 43, 48, 48, 48, 48, 48, 44, 44, 44, 44, 44, 44, 44, 75,
+75, 75, 75, 75, 75, 75, 97, 97, 97, 85, 85, 85, 85, 83, 83, 83,
+83, 83, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 8, 8, 8, 8, 8,
+8, 8, 8, 8, 8, 8, 8, 8, 8, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 39, 39, 39, 39, 39, 39,
+39, 39, 39, 39, 39, 39, 39, 76, 76, 76, 76, 76, 76, 76, 96, 59,
+59, 59, 59, 59, 59, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 67, 67, 67,
+67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+67, 67, 67, 67, 67, 67, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+82, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 64, 64, 64, 64, 64, 64, 64, 64, 64, 33, 33, 33,
+33, 33, 33, 20, 20, 20, 20, 20, 20, 20, 52, 52, 52, 52, 52, 52,
+52, 52, 52, 52, 52, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+65, 65, 65, 65, 65, 65, 65, 65, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 66, 66, 66, 77, 77, 77, 77, 77, 44, 44, 44, 44, 44, 44,
+44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+44, 44, 44, 44, 44, 44, 79, 79, 63, 63, 63, 19, 19, 19, 19, 19,
+19, 19, 19, 19, 19, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 55,
+55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+55, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 53, 53,
+53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 42, 42, 42, 42, 42, 42, 42, 42,
+42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 61, 61, 61, 61,
+61, 61, 81, 81, 29, 29, 29, 29, 29, 29, 29, 29, 29, 38, 38, 38,
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+38, 38, 38, 38, 38, 38, 41, 41, 41, 41, 41, 41, 23, 23, 23, 23,
+23, 23, 23, 23, 23, 23, 23, 23, 23, 30, 30, 30, 30, 30, 30, 30,
+30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 92, 92,
+92, 92, 92, 92, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+71, 71, 71, 71, 62, 62, 62, 62, 62, 62, 17, 17, 17, 17, 17, 17,
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 91, 91, 91, 91, 49, 49, 49, 49, 49, 49, 49, 49,
+49, 49, 49, 49, 87, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 34, 34, 34, 34, 34,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 18, 18, 18, 18, 18,
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 40,
+40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+40, 40, 40, 40, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+54, 54, 54, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+51, 51, 51, 51, 51, 51, 51, 51, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 57, 57,
+57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+57, 57, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 89,
+89, 89, 89, 89, 69, 69, 69, 69, 69, 69, 69, 36, 36, 36, 36, 36,
+36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 94,
+94, 94, 94, 94, 94, 94, 94, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+56, 56, 56, 56, 56, 56, 56, 56, 43, 43, 43, 43, 43, 43, 43, 43,
+43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, 48, 48, 48, 48,
+48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 86, 86, 86,
+86, 86, 86, 86, 86, 86, 86, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 95, 95, 95,
+95, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 98, 98, 98, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+70, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 74,
+74, 74, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+45, 45, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 73, 73, 73, 73, 73, 73,
+73, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 9, 9, 9,
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+58, 58, 58, 58, 58, 58, 58, 58, 58, 50, 50, 50, 50, 50, 50, 50,
+50, 50, 50, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 60,
+60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 21, 21, 21, 21, 21,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+21, 21, 21, 21, 21, 21, 21, 21, 32, 32, 32, 32, 32, 32, 32, 32,
+32, 32, 32, 32, 32, 32, 32, 68, 68, 68, 68, 68, 68, 68, 66, 66,
+16, 16, 78, 78, 77, 77, 33, 48, 48, 48, 48, 56, 65, 86, 86, 20,
+20, 20, 20, 20, 1, 1, 1, 1, 1, 15, 15, 15, 15, 5, 5, 5, 5, 5,
+5, 14, 14, 14, 52, 52, 43, 43, 43, 58, 58, 58, 58, 30, 30, 30,
+30, 30, 30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 31, 60,
+60, 60, 60, 60, 38, 38, 81, 81, 32, 32, 68, 68, 21, 21, 29, 29,
+47, 47, 47, 47, 61, 61, 61, 9, 9, 9, 9, 9, 9, 9, 9, 41, 41, 41,
+41, 41, 73, 73, 73, 73, 23, 23, 75, 22, 62, 62, 62, 62, 62, 62,
+39, 39, 8, 8, 8, 8, 8, 8, 93, 76, 87, 87, 4, 4, 4, 4, 80, 80,
+80, 80, 80, 85, 17, 17, 12, 12, 37, 37, 37, 37, 37, 34, 49, 49,
+49, 49, 49, 49, 3, 3, 3, 26, 26, 74, 74, 74, 74, 74, 42, 42,
+42, 42, 13, 13, 13, 13, 88, 25, 25, 25, 25, 63, 63, 63, 63, 79,
+79, 19, 19, 19, 27, 24, 24, 24, 24, 46, 46, 46, 72, 72, 72, 70,
+70, 55, 55, 54, 84, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 10, 10, 10, 6, 6, 6, 6,
+6, 6, 82, 69, 57, 57, 59, 59, 59, 96, 2, 2, 2, 2, 2, 2, 2, 18,
+18, 18, 18, 18, 18, 67, 67, 67, 64, 64, 11, 11, 11, 11, 51, 89,
+89, 89, 89, 43, 43, 48, 5, 5, 20, 20, 66, 66, 66, 1, 14, 15,
+15, 78, 78, 78, 44, 44, 77, 77, 77, 16, 16, 16, 16, 16, 33, 65,
+65, 34, 34, 34, 39, 12, 12, 85, 93, 93, 80, 80, 80, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 91, 37, 49, 49, 49, 62, 62, 76, 76, 22,
+17, 17, 17, 17, 17, 17, 87, 87, 28, 28, 28, 28, 28, 28, 75, 75,
+8, 8, 8, 8, 50, 61, 61, 61, 30, 30, 30, 30, 32, 32, 81, 81, 81,
+9, 9, 73, 73, 73, 60, 68, 68, 68, 47, 47, 29, 29, 92, 92, 35,
+21, 21, 21, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 41, 41, 41,
+31, 31, 10, 10, 10, 40, 40, 40, 57, 57, 6, 96, 69, 69, 64, 64,
+64, 64, 64, 64, 36, 51, 7, 7, 67, 59, 18, 18, 82, 11, 11, 11,
+11, 11, 11, 11, 54, 54, 54, 2, 2, 2, 2, 24, 24, 53, 46, 46, 19,
+19, 13, 13, 13, 13, 27, 27, 27, 27, 90, 79, 3, 3, 3, 3, 26, 26,
+26, 26, 42, 74, 74, 72, 72, 72), iname = c("BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "MichaelHeckler", "MichaelHeckler",
+"MichaelHeckler", "MichaelHeckler", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic",
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic",
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic",
+"BoskoBarisic", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp",
+"AndreSteenkamp", "AndreSteenkamp", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "HansBock", "HansBock", "HansBock", "HansBock",
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"ArturTrzaskos", "VernBarby", "VernBarby", "VernBarby", "VernBarby",
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "StefanFlorea", "StefanFlorea",
+"StefanFlorea", "StefanFlorea", "JamieHarries", "JamieHarries",
+"JamieHarries", "JamieHarries", "JamieHarries", "JamieHarries",
+"JamieHarries", "JoseDias", "JoseDias", "JoseDias", "JoseDias",
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias",
+"JoseDias", "TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "TimRolston", "TimRolston",
+"TimRolston", "TimRolston", "TimRolston", "TimRolston", "TimRolston",
+"TimRolston", "TimRolston", "TimRolston", "TimRolston", "TimRolston",
+"TimRolston", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "SimonGrootemaat",
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat",
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat",
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"AlessandroSgrani", "AlessandroSgrani", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "KimTribe", "KimTribe", "KimTribe",
+"KimTribe", "KimTribe", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "SabahudinPehadzicBIHI",
+"MarinkoPuskaric", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "JoshStephens", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JohnTrench",
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench",
+"JohnTrench", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "RobertVanRensburg", "RobertVanRensburg", "MisakoIshimura",
+"MisakoIshimura", "JohnBell", "JohnBell", "JohnBell", "JohnBell",
+"JohnBell", "JohnBell", "JohnBell", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "AntonioRodrigues",
+"AntonioRodrigues", "AntonioRodrigues", "AntonioRodrigues", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "TorbjornEriksson", "TorbjornEriksson",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"YoshikoIzumiya", "YoshikoIzumiya", "YoshikoIzumiya", "YoshikoIzumiya",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland",
+"MarkYelland", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ReneKoops",
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops",
+"ReneKoops", "VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "JouniNeste", "JouniNeste",
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste",
+"JouniNeste", "JouniNeste", "StephenVarga", "StephenVarga", "StephenVarga",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "ScottTucker", "ScottTucker", "ScottTucker",
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "MiroslavKaticic",
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "MiroslavKaticic", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "TakashiKawahara", "TakashiKawahara",
+"TakashiKawahara", "TakashiKawahara", "TakashiKawahara", "TakashiKawahara",
+"DavidEricDavies", "DavidEricDavies", "DavidEricDavies", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"HowardCroston", "HowardCroston", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "HelderRodrigues",
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "RickyLehman",
+"RickyLehman", "PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic",
+"PeterDindic", "PeterDindic", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja",
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja",
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja",
+"JohnBeaven", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton",
+"JohnFoxton", "JohnFoxton", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "JanKwisthout",
+"JanKwisthout", "JanKwisthout", "JanKwisthout", "JanKwisthout",
+"GaryGlenYoung", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "StefanFlorea",
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea",
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea",
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea",
+"StefanFlorea", "StefanFlorea", "ReneKoops", "ReneKoops", "ReneKoops",
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops",
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops",
+"ReneKoops", "ReneKoops", "ReneKoops", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby",
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby",
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby",
+"VernBarby", "VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp",
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp",
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp",
+"AndreSteenkamp", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BoskoBarisic", "BoskoBarisic",
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic",
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "YoshikoIzumiya",
+"YoshikoIzumiya", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "MichaelHeckler",
+"MichaelHeckler", "MichaelHeckler", "MichaelHeckler", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "ScottTucker",
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker",
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker",
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker",
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"KimTribe", "KimTribe", "KimTribe", "KimTribe", "KimTribe", "KimTribe",
+"KimTribe", "AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "TimRolston",
+"TimRolston", "TimRolston", "TimRolston", "TimRolston", "TimRolston",
+"TimRolston", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton",
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton",
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell",
+"PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic",
+"PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic",
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "PavelMachan", "MisakoIshimura",
+"MisakoIshimura", "MisakoIshimura", "MisakoIshimura", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "BrianJeremiah", "BrianJeremiah", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"DionDavies", "JohnTrench", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "SabahudinPehadzicBIHI",
+"SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI",
+"SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"JoshStephens", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "RobertVanRensburg", "RobertVanRensburg", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "JamieHarries",
+"JamieHarries", "JamieHarries", "JamieHarries", "JamieHarries",
+"MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland",
+"MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland",
+"MarkYelland", "MarkYelland", "MarkYelland", "JoseDias", "JoseDias",
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias",
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias",
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias",
+"JoseDias", "JoseDias", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "MikeTinnion",
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"MikeTinnion", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "HansBock", "HansBock",
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "HansBock",
+"HansBock", "HansBock", "HansBock", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "StephenVarga", "StephenVarga", "StephenVarga",
+"StephenVarga", "StephenVarga", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi",
+"ToddOishi", "ToddOishi", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JouniNeste", "JouniNeste", "JouniNeste",
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "SimonGrootemaat",
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja",
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja",
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AntonioRodrigues",
+"AntonioRodrigues", "AntonioRodrigues", "AntonioRodrigues", "RickyLehman",
+"RickyLehman", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "TorbjornEriksson",
+"JohnBeaven", "JohnBeaven", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"GaryGlenYoung", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "MarinkoPuskaric",
+"MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric",
+"MarinkoPuskaric", "MarinkoPuskaric", "TakashiKawahara", "TakashiKawahara",
+"TakashiKawahara", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "HelderRodrigues", "HelderRodrigues", "HelderRodrigues",
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "HowardCroston",
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston",
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston",
+"HowardCroston", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley",
+"JoeRiley", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"BrianJeremiah", "BrianJeremiah", "BrianJeremiah", "BrianJeremiah",
+"BrianJeremiah", "BrianJeremiah", "BrianJeremiah", "JohnBeaven",
+"JohnBeaven", "JohnBeaven", "AntonioRodrigues", "AntonioRodrigues",
+"AntonioRodrigues", "AntonioRodrigues", "PeterDindic", "PeterDindic",
+"PeterDindic", "PeterDindic", "PeterDindic", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan",
+"PavelMachan", "PavelMachan", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek",
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "RickyLehman",
+"RickyLehman", "RickyLehman", "RickyLehman", "RickyLehman", "RickyLehman",
+"RickyLehman", "StephenVarga", "ScottTucker", "ScottTucker",
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny",
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi",
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi",
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi",
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi",
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi",
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat",
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat",
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "JouniNeste",
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste",
+"JouniNeste", "JouniNeste", "JouniNeste", "MichalBenatinsky",
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky",
+"MichalBenatinsky", "JoshStephens", "JoshStephens", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen",
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JohnTrench",
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench",
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench",
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench",
+"JohnTrench", "JohnTrench", "JohnTrench", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "TakashiKawahara",
+"TakashiKawahara", "TakashiKawahara", "RobertVanRensburg", "RobertVanRensburg",
+"RobertVanRensburg", "RobertVanRensburg", "RobertVanRensburg",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier",
+"BoskoBarisic", "BoskoBarisic", "JohnBuckley", "JohnBuckley",
+"JohnBuckley", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther",
+"LloydStruther", "LloydStruther", "LloydStruther", "AndreSteenkamp",
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp",
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp",
+"AndreSteenkamp", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman",
+"CraigColtman", "CraigColtman", "CraigColtman", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon",
+"AndrewDixon", "AndrewDixon", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "ArturTrzaskos",
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"ArturTrzaskos", "MarkYelland", "MarkYelland", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel",
+"GeorgeDaniel", "JoseDias", "JoseDias", "JoseDias", "JoseDias",
+"JoseDias", "JoseDias", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "VernBarby", "VernBarby",
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby",
+"VernBarby", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "StefanFlorea", "StefanFlorea",
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea",
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton",
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton",
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton",
+"JohnFoxton", "TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson",
+"TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson", "JohnBell",
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell",
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell",
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell",
+"JohnBell", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko",
+"JanBartko", "JanBartko", "JanBartko", "MisakoIshimura", "MisakoIshimura",
+"MisakoIshimura", "MisakoIshimura", "GaryGlenYoung", "GaryGlenYoung",
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung",
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung",
+"GaryGlenYoung", "GaryGlenYoung", "JanKwisthout", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "AnthonyNaranja", "AnthonyNaranja",
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek",
+"PeterBienek", "PeterBienek", "PeterBienek", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop",
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani",
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic",
+"MiroslavKaticic", "KimTribe", "KimTribe", "KimTribe", "KimTribe",
+"KimTribe", "TimRolston", "TimRolston", "TimRolston", "TimRolston",
+"TimRolston", "TimRolston", "TimRolston", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "MarinkoPuskaric",
+"MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric",
+"MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse",
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston",
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston",
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston",
+"HowardCroston", "HowardCroston", "HowardCroston", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucjanBurda", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley",
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley",
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley",
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "HelderRodrigues",
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "HelderRodrigues",
+"HelderRodrigues", "HelderRodrigues", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI",
+"SabahudinPehadzicBIHI", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"LanceEgan", "LanceEgan", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "YoshikoIzumiya", "YoshikoIzumiya",
+"YoshikoIzumiya", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou",
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "HansBock",
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "HansBock",
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "HansBock",
+"HansBock", "MichaelHeckler", "MichaelHeckler", "MichaelHeckler",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri",
+"YannCaleri", "TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"OlliToivonen", "JamieHarries", "JamieHarries", "JamieHarries",
+"JamieHarries", "JamieHarries", "JamieHarries", "JamieHarries",
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"MikeTinnion", "MikeTinnion", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille",
+"TerenceCourtoreille", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar",
+"CraigFarrar", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal",
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops",
+"ReneKoops", "ReneKoops", "TakashiKawahara", "TakashiKawahara",
+"DonaldThom", "DonaldThom", "DavidEricDavies", "DavidEricDavies",
+"RobertVanRensburg", "RobertVanRensburg", "MichalBenatinsky",
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "PeterElberse",
+"JohnTrench", "HelderRodrigues", "HelderRodrigues", "JoshStephens",
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens",
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz",
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "LucjanBurda",
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda",
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "JarkkoSuominen",
+"JarkkoSuominen", "HowardCroston", "HowardCroston", "HowardCroston",
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola",
+"VilleAnttiJaakkola", "VernBarby", "VernBarby", "VernBarby",
+"VernBarby", "VernBarby", "VernBarby", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh",
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "TerenceCourtoreille",
+"TerenceCourtoreille", "TerenceCourtoreille", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa",
+"SeiichiKomatsuzawa", "GeorgeDaniel", "GeorgeDaniel", "MarkYelland",
+"MarkYelland", "MiroslavAntal", "MiroslavAntal", "ReneKoops",
+"ReneKoops", "CraigFarrar", "CraigFarrar", "GianlucaMazzocco",
+"GianlucaMazzocco", "MikeTinnion", "MikeTinnion", "MikeTinnion",
+"MikeTinnion", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam",
+"TomasAdam", "TomasAdam", "TomasAdam", "JoseDias", "JoseDias",
+"JoseDias", "JoseDias", "JoseDias", "JamieHarries", "JamieHarries",
+"JamieHarries", "JamieHarries", "ChristopheIdre", "ChristopheIdre",
+"BrianJeremiah", "PavelMachan", "TorbjornEriksson", "TorbjornEriksson",
+"TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson",
+"StanislawGuzdek", "StanislawGuzdek", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"JannePirkkalainen", "AidenHodgins", "RickyLehman", "JanKwisthout",
+"JanKwisthout", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"RandyTaylor", "RandyTaylor", "RandyTaylor", "RandyTaylor", "RandyTaylor",
+"AntonioRodrigues", "JohnBell", "JohnBell", "JanBartko", "JanBartko",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini",
+"ValerioSantiAmantini", "ValerioSantiAmantini", "AnthonyNaranja",
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung",
+"GaryGlenYoung", "GaryGlenYoung", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "JohnNishi", "JohnNishi", "MichaelHeckler",
+"MichaelHeckler", "MichaelHeckler", "MichaelHeckler", "MichaelHeckler",
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "HansBock",
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen",
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "BoskoBarisic",
+"BoskoBarisic", "LloydStruther", "LloydStruther", "LloydStruther",
+"MarekWalczyk", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan",
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "ThibaultGuilpain",
+"ThibaultGuilpain", "ThibaultGuilpain", "StanislawMankou", "StanislawMankou",
+"CraigColtman", "CraigColtman", "NunoDuarte", "MiroslavKaticic",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson",
+"SimonRobinson", "DamienWalsh", "DamienWalsh", "DamienWalsh",
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "PiotrKonieczny",
+"PiotrKonieczny", "PiotrKonieczny", "DesArmstrong", "DesArmstrong",
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong",
+"SimonGrootemaat", "TimRolston", "AlessandroSgrani", "AlessandroSgrani",
+"ScottTucker", "ScottTucker", "ScottTucker", "StephenVarga",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"JulienDaguillanes", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "ToddOishi",
+"ToddOishi", "ToddOishi", "JouniNeste", "JouniNeste", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "BretBishop",
+"KimTribe", "KimTribe", "KimTribe", "KimTribe", "HowardCroston",
+"HowardCroston", "JoeRiley", "LucjanBurda", "LucjanBurda", "JoshStephens",
+"JoshStephens", "TakashiKawahara", "TakashiKawahara", "TakashiKawahara",
+"MartinDroz", "LucaPapandrea", "AaronWest", "AaronWest", "DavidEricDavies",
+"DavidEricDavies", "DavidEricDavies", "EricLelouvrier", "EricLelouvrier",
+"RobertVanRensburg", "RobertVanRensburg", "RobertVanRensburg",
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom",
+"MichalBenatinsky", "JohnTrench", "JohnTrench", "AnthonyNaranja",
+"AnthonyNaranja", "AnthonyNaranja", "StanislawGuzdek", "JanBartko",
+"JanBartko", "AntonioRodrigues", "AidenHodgins", "AidenHodgins",
+"RandyTaylor", "RandyTaylor", "RandyTaylor", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey",
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "MisakoIshimura", "ValerioSantiAmantini",
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "TorbjornEriksson",
+"TorbjornEriksson", "RickyLehman", "RickyLehman", "PavelMachan",
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell",
+"JanKwisthout", "JanKwisthout", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin",
+"BertrandJacquemin", "BrianJeremiah", "BrianJeremiah", "JannePirkkalainen",
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen",
+"IvicaMagdic", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos",
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "MiroslavAntal",
+"MiroslavAntal", "MarkYelland", "MarkYelland", "MarkYelland",
+"TomasAdam", "TomasAdam", "JamieHarries", "JamieHarries", "JamieHarries",
+"SeiichiKomatsuzawa", "ReneKoops", "ReneKoops", "ReneKoops",
+"MikeTinnion", "MikeTinnion", "GianlucaMazzocco", "GianlucaMazzocco",
+"StefanFlorea", "StefanFlorea", "WilliamKavenagh", "CraigFarrar",
+"CraigFarrar", "CraigFarrar", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre",
+"JoseDias", "JoseDias", "JoseDias", "TerenceCourtoreille", "TerenceCourtoreille",
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PeterBienek",
+"PeterBienek", "PeterBienek", "AlessandroSgrani", "AlessandroSgrani",
+"DesArmstrong", "StephenVarga", "TimRolston", "TimRolston", "JouniNeste",
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste",
+"DamienWalsh", "BretBishop", "SimonRobinson", "SimonRobinson",
+"ToddOishi", "ScottTucker", "KiyoshiNakagawa", "KiyoshiNakagawa",
+"SimonGrootemaat", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek",
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "JulienDaguillanes",
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes",
+"LanceEgan", "LanceEgan", "PauloMorais", "AndrewDixon", "AndrewDixon",
+"LloydStruther", "LloydStruther", "SandroSoldarini", "SandroSoldarini",
+"SandroSoldarini", "SandroSoldarini", "MarekWalczyk", "MarekWalczyk",
+"MarekWalczyk", "MarekWalczyk", "AndreSteenkamp", "BoskoBarisic",
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu",
+"TomasStarychfojtu", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi",
+"BorisDzurek", "MichaelHeckler", "MichaelHeckler", "ThibaultGuilpain",
+"ThibaultGuilpain", "ThibaultGuilpain"), country = c("SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "WAL", "WAL", "WAL", "WAL", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "RSA", "RSA", "RSA",
+"RSA", "RSA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"ROM", "ROM", "ROM", "ROM", "WAL", "WAL", "WAL", "WAL", "WAL",
+"WAL", "WAL", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA",
+"RSA", "RSA", "RSA", "RSA", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "WAL", "WAL", "WAL", "WAL", "WAL", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "NDI",
+"CRO", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "RSA", "RSA", "JPN",
+"JPN", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "POR", "POR", "POR",
+"POR", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "SWE", "SWE", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "JPN", "JPN", "JPN", "JPN", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "BUL",
+"BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL",
+"BUL", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "RSA", "RSA", "RSA",
+"RSA", "RSA", "RSA", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "MAL", "MAL", "MAL", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "JPN", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "WAL", "WAL", "WAL", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "ENG", "ENG", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "AUS", "AUS", "AUS", "AUS", "AUS", "POR", "POR", "POR",
+"POR", "AUS", "AUS", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "CAN", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "NED", "NED", "NED", "NED", "NED", "RSA",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM",
+"ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "RSA",
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA",
+"RSA", "RSA", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "JPN", "JPN", "BUL", "BUL",
+"BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL",
+"BUL", "BUL", "BUL", "WAL", "WAL", "WAL", "WAL", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA",
+"RSA", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "JPN", "JPN",
+"JPN", "JPN", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "WAL", "WAL", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "WAL", "IRE", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"NDI", "NDI", "NDI", "NDI", "NDI", "NDI", "NDI", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "RSA", "RSA", "JPN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "IRE", "IRE", "IRE", "IRE", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "WAL",
+"WAL", "WAL", "WAL", "WAL", "RSA", "RSA", "RSA", "RSA", "RSA",
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "MAL", "MAL",
+"MAL", "MAL", "MAL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "NED",
+"NED", "NED", "NED", "NED", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "ITA", "ITA", "ITA",
+"ITA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "POR", "POR", "POR", "POR", "AUS", "AUS",
+"ITA", "ITA", "ITA", "ITA", "SWE", "CAN", "CAN", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "RSA", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"JPN", "JPN", "JPN", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "POR", "POR", "POR",
+"POR", "POR", "POR", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "AUS", "AUS", "AUS", "AUS", "AUS", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "WAL", "WAL", "WAL",
+"WAL", "WAL", "WAL", "WAL", "CAN", "CAN", "CAN", "POR", "POR",
+"POR", "POR", "CRO", "CRO", "CRO", "CRO", "CRO", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "MAL", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "NED", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "JPN", "JPN", "JPN",
+"RSA", "RSA", "RSA", "RSA", "RSA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "CRO", "CRO", "IRE",
+"IRE", "IRE", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA",
+"RSA", "RSA", "RSA", "RSA", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "POL", "POL",
+"POL", "POL", "POL", "POL", "RSA", "RSA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "POR", "POR", "POR", "POR", "POR",
+"POR", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "ROM", "ROM", "ROM",
+"ROM", "ROM", "ROM", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "SWE", "SWE", "SWE", "SWE", "SWE", "SWE", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "JPN", "JPN", "JPN", "JPN", "RSA",
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA",
+"RSA", "RSA", "NED", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "USA", "USA", "USA", "USA", "USA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CRO", "CRO", "CRO", "CRO", "WAL", "WAL", "WAL", "WAL",
+"WAL", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "NED", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "AUS", "POR", "POR", "POR", "POR", "POR",
+"POR", "POR", "POR", "POR", "POR", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"NDI", "NDI", "NDI", "NDI", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA",
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL",
+"POL", "JPN", "JPN", "JPN", "BUL", "BUL", "BUL", "BUL", "BUL",
+"BUL", "BUL", "BUL", "BUL", "BUL", "NED", "NED", "NED", "NED",
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED",
+"NED", "WAL", "WAL", "WAL", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA",
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FIN",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN",
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO",
+"CRO", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN",
+"CAN", "CAN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "JPN", "JPN", "JPN", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK",
+"SVK", "SVK", "SVK", "SVK", "NED", "NED", "NED", "NED", "NED",
+"NED", "NED", "JPN", "JPN", "CAN", "CAN", "WAL", "WAL", "RSA",
+"RSA", "SVK", "AUS", "AUS", "AUS", "AUS", "NED", "IRE", "POR",
+"POR", "USA", "USA", "USA", "USA", "USA", "CZE", "CZE", "CZE",
+"CZE", "CZE", "NZL", "NZL", "NZL", "NZL", "POL", "POL", "POL",
+"POL", "POL", "POL", "ITA", "ITA", "ITA", "FIN", "FIN", "ENG",
+"ENG", "ENG", "FIN", "FIN", "FIN", "FIN", "AUS", "AUS", "AUS",
+"AUS", "AUS", "AUS", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE",
+"IRE", "IRE", "IRE", "CAN", "CAN", "CAN", "JPN", "JPN", "JPN",
+"JPN", "JPN", "USA", "USA", "RSA", "RSA", "SVK", "SVK", "NED",
+"NED", "NZL", "NZL", "ITA", "ITA", "ENG", "ENG", "ENG", "ENG",
+"POL", "POL", "POL", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE",
+"CZE", "CZE", "POR", "POR", "POR", "POR", "POR", "WAL", "WAL",
+"WAL", "WAL", "FRA", "FRA", "WAL", "CZE", "SWE", "SWE", "SWE",
+"SWE", "SWE", "SWE", "POL", "POL", "FIN", "FIN", "FIN", "FIN",
+"FIN", "FIN", "IRE", "AUS", "NED", "NED", "ENG", "ENG", "ENG",
+"ENG", "CAN", "CAN", "CAN", "CAN", "CAN", "POR", "NZL", "NZL",
+"SVK", "SVK", "ITA", "ITA", "ITA", "ITA", "ITA", "USA", "RSA",
+"RSA", "RSA", "RSA", "RSA", "RSA", "CZE", "CZE", "CZE", "CAN",
+"CAN", "WAL", "WAL", "WAL", "WAL", "WAL", "SVK", "SVK", "SVK",
+"SVK", "ITA", "ITA", "ITA", "ITA", "NED", "FIN", "FIN", "FIN",
+"FIN", "IRE", "IRE", "IRE", "IRE", "CRO", "CRO", "NZL", "NZL",
+"NZL", "POL", "USA", "USA", "USA", "USA", "ENG", "ENG", "ENG",
+"FRA", "FRA", "FRA", "BUL", "BUL", "AUS", "AUS", "POR", "CRO",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "IRE",
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "POL", "POL", "POL",
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NED", "RSA", "ITA",
+"ITA", "AUS", "AUS", "AUS", "MAL", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN",
+"CAN", "CAN", "CAN", "FIN", "FIN", "CZE", "CZE", "CZE", "CZE",
+"USA", "WAL", "WAL", "WAL", "WAL", "ENG", "ENG", "AUS", "POL",
+"POL", "USA", "USA", "JPN", "JPN", "JPN", "CZE", "ITA", "NZL",
+"NZL", "WAL", "WAL", "WAL", "FRA", "FRA", "RSA", "RSA", "RSA",
+"CAN", "CAN", "CAN", "CAN", "CAN", "SVK", "IRE", "IRE", "USA",
+"USA", "USA", "POL", "SVK", "SVK", "POR", "IRE", "IRE", "CAN",
+"CAN", "CAN", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG",
+"ENG", "ENG", "ENG", "JPN", "ITA", "RSA", "RSA", "RSA", "SWE",
+"SWE", "AUS", "AUS", "CZE", "NZL", "NZL", "NZL", "NZL", "NZL",
+"NZL", "NED", "NED", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"WAL", "WAL", "FIN", "FIN", "FIN", "FIN", "CRO", "POL", "POL",
+"POL", "AUS", "AUS", "AUS", "AUS", "SVK", "SVK", "RSA", "RSA",
+"RSA", "CZE", "CZE", "WAL", "WAL", "WAL", "JPN", "NED", "NED",
+"NED", "ENG", "ENG", "ITA", "ITA", "ROM", "ROM", "IRE", "NZL",
+"NZL", "NZL", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA",
+"FRA", "FRA", "FRA", "POR", "POR", "POR", "CAN", "CAN", "POL",
+"POL", "POL", "SVK", "SVK", "SVK", "ITA", "ITA", "NZL", "MAL",
+"RSA", "RSA", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "IRE",
+"USA", "ENG", "ENG", "CAN", "AUS", "JPN", "JPN", "NED", "CZE",
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "POR", "POR", "POR",
+"FRA", "FRA", "FRA", "FRA", "USA", "USA", "POR", "ENG", "ENG",
+"NZL", "NZL", "ITA", "ITA", "ITA", "ITA", "POL", "POL", "POL",
+"POL", "RSA", "CRO", "CZE", "CZE", "CZE", "CZE", "CAN", "CAN",
+"CAN", "CAN", "SVK", "WAL", "WAL", "FRA", "FRA", "FRA")), .Names = c("length",
+"water", "session", "sector", "beatboat", "comid", "iname", "country"
+), row.names = c(NA, 4267), class = "data.frame")
diff --git a/data/wffc.indiv.R b/data/wffc.indiv.R
new file mode 100644
index 0000000..840345b
--- /dev/null
+++ b/data/wffc.indiv.R
@@ -0,0 +1,94 @@
+"wffc.indiv" <-
+structure(list(totalPlacings = c(20, 20, 22, 22, 22, 24, 24,
+24, 25, 27, 27, 27, 30, 30, 30, 30, 30, 31, 32, 32, 34, 34, 35,
+35, 36, 38, 38, 38, 39, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44,
+45, 47, 49, 49, 50, 53, 53, 53, 53, 53, 54, 54, 54, 55, 55, 56,
+56, 57, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 62, 63, 65, 65,
+65, 66, 66, 66, 66, 66, 67, 68, 68, 69, 69, 69, 70, 70, 72, 73,
+74, 74, 75, 76, 79, 79, 83, 88, 88, 88, 93, 94), points = c(51360,
+48540, 58980, 39480, 35240, 52800, 52140, 28540, 53180, 47180,
+47060, 35500, 40460, 36380, 34400, 32460, 29660, 41000, 40660,
+29440, 48020, 30720, 45020, 39840, 44680, 38680, 37900, 28560,
+39040, 29040, 43840, 38260, 28500, 19200, 36320, 35720, 22260,
+43040, 24900, 33520, 29800, 34020, 20220, 33200, 46480, 28300,
+27340, 21140, 15800, 36240, 34440, 24140, 33460, 29620, 36200,
+27700, 24180, 26580, 23880, 26880, 24780, 11660, 29240, 21160,
+17680, 10920, 22640, 21280, 18340, 25680, 16320, 6240, 16080,
+11980, 9980, 9660, 8920, 6340, 16440, 6900, 18340, 17080, 11880,
+23440, 9080, 13880, 6600, 20420, 13640, 14800, 6600, 16620, 2880,
+9740, 7080, 6540, 3420, 5120, 540), noofcaptures = c(78, 73, 98,
+59, 56, 87, 90, 40, 87, 80, 71, 56, 65, 59, 55, 54, 41, 66, 64,
+44, 78, 49, 60, 69, 73, 61, 66, 44, 65, 43, 78, 64, 40, 32, 65,
+58, 36, 78, 40, 52, 47, 55, 32, 53, 80, 48, 43, 33, 23, 64, 59,
+39, 60, 47, 57, 53, 38, 45, 38, 39, 42, 17, 53, 33, 30, 17, 40,
+35, 30, 38, 31, 6, 26, 18, 12, 14, 14, 8, 28, 8, 26, 31, 21,
+37, 14, 22, 10, 35, 21, 28, 11, 27, 3, 16, 12, 11, 6, 9, 1),
+ longest = c(540, 585, 515, 689, 580, 535, 552, 610, 475,
+ 533, 518, 560, 535, 580, 498, 624, 627, 525, 585, 560, 550,
+ 515, 568, 615, 652, 520, 563, 510, 580, 572, 474, 500, 615,
+ 484, 503, 535, 498, 592, 541, 512, 590, 510, 530, 499, 501,
+ 495, 574, 572, 604, 466, 450, 515, 513, 480, 570, 419, 530,
+ 688, 580, 492, 514, 508, 522, 594, 477, 532, 528, 505, 493,
+ 620, 340, 560, 571, 475, 572, 470, 486, 574, 568, 610, 548,
+ 432, 342, 486, 480, 560, 432, 501, 590, 362, 511, 455, 450,
+ 490, 380, 395, 332, 293, 218), individual = c(0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0),
+ country = c("CZE", "FRA", "CZE", "ENG", "POL", "NZL", "ENG",
+ "FIN", "CZE", "POL", "CZE", "SVK", "ITA", "ITA", "NZL", "CAN",
+ "NZL", "JPN", "NZL", "USA", "NZL", "CZE", "FRA", "USA", "FIN",
+ "CAN", "POL", "FRA", "ITA", "AUS", "CAN", "SVK", "SVK", "USA",
+ "IRE", "IRE", "ITA", "USA", "POL", "SVK", "POR", "SVK", "ENG",
+ "FRA", "FRA", "ENG", "ENG", "AUS", "RSA", "CRO", "USA", "FIN",
+ "POR", "POR", "AUS", "NED", "ITA", "FIN", "AUS", "JPN", "POL",
+ "SWE", "IRE", "FIN", "IRE", "JPN", "CAN", "NED", "RSA", "BUL",
+ "IRE", "FRA", "WAL", "WAL", "WAL", "AUS", "RSA", "WAL", "CRO",
+ "CAN", "RSA", "NED", "CRO", "CRO", "POR", "POR", "NED", "NED",
+ "WAL", "RSA", "JPN", "ROM", "IRE", "CRO", "NDI", "MAL", "CAN",
+ "JPN", "WAL"), iname = c("MartinDroz", "JulienDaguillanes",
+ "TomasStarychfojtu", "JohnHorsey", "LucjanBurda", "DesArmstrong",
+ "SimonRobinson", "JannePirkkalainen", "TomasAdam", "PiotrKonieczny",
+ "AntoninPesek", "JanBartko", "SandroSoldarini", "LucaPapandrea",
+ "AaronWest", "DonaldThom", "JohnBell", "KiyoshiNakagawa",
+ "LloydStruther", "JoshStephens", "CraigFarrar", "PavelMachan",
+ "ChristopheIdre", "LanceEgan", "OlliToivonen", "JohnNishi",
+ "MarekWalczyk", "BertrandJacquemin", "GianlucaMazzocco",
+ "VernBarby", "TerenceCourtoreille", "MiroslavAntal", "MichalBenatinsky",
+ "AnthonyNaranja", "WilliamKavenagh", "DamienWalsh", "ValerioSantiAmantini",
+ "GeorgeDaniel", "StanislawGuzdek", "PeterBienek", "JoseDias",
+ "BorisDzurek", "HowardCroston", "EricLelouvrier", "YannCaleri",
+ "AndrewDixon", "MikeTinnion", "JoeRiley", "GaryGlenYoung",
+ "IvicaMagdic", "BretBishop", "JarkkoSuominen", "PauloMorais",
+ "NunoDuarte", "CraigColtman", "PeterElberse", "AlessandroSgrani",
+ "VilleAnttiJaakkola", "ScottTucker", "SeiichiKomatsuzawa",
+ "ArturTrzaskos", "TorbjornEriksson", "JohnBuckley", "JouniNeste",
+ "JohnTrench", "TakashiKawahara", "ToddOishi", "ReneKoops",
+ "TimRolston", "StanislawMankou", "JohnFoxton", "ThibaultGuilpain",
+ "JamieHarries", "MichaelHeckler", "BrianJeremiah", "RickyLehman",
+ "RobertVanRensburg", "DavidEricDavies", "BoskoBarisic", "RandyTaylor",
+ "MarkYelland", "SimonGrootemaat", "PeterDindic", "MiroslavKaticic",
+ "AntonioRodrigues", "HelderRodrigues", "JanKwisthout", "HansBock",
+ "KimTribe", "AndreSteenkamp", "MisakoIshimura", "StefanFlorea",
+ "AidenHodgins", "MarinkoPuskaric", "SabahudinPehadzicBIHI",
+ "StephenVarga", "JohnBeaven", "YoshikoIzumiya", "DionDavies"
+ ), comid = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 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)), .Names = c("totalPlacings",
+"points", "noofcaptures", "longest", "individual", "country", "iname",
+"comid"), row.names = c("1", "2", "3", "4", "5", "6", "7", "8",
+"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
+"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
+"31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41",
+"42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52",
+"53", "54", "55", "56", "57", "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"), class = "data.frame")
diff --git a/data/wffc.nc.R b/data/wffc.nc.R
new file mode 100644
index 0000000..881df11
--- /dev/null
+++ b/data/wffc.nc.R
@@ -0,0 +1,351 @@
+"wffc.nc" <-
+structure(list(sector = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3), session = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1,
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), beatboat = c(1,
+2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7,
+8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5,
+6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3,
+4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1,
+2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+10, 11, 12, 13, 14, 15, 16, 17, 18, 19), numbers = c(20, 20,
+4, 32, 13, 5, 23, 28, 9, 35, 18, 29, 4, 19, 16, 23, 23, 11, 27,
+18, 9, 24, 22, 4, 7, 11, 16, 16, 18, 19, 31, 6, 23, 11, 7, 13,
+7, 10, 13, 9, 9, 13, 28, 10, 19, 5, 19, 9, 3, 28, 19, 26, 12,
+7, 7, 11, 4, 1, 1, 15, 20, 17, 7, 21, 15, 2, 12, 6, 3, 22, 24,
+2, 13, 16, 5, 4, 2, 7, 9, 7, 4, 8, 10, 2, 9, 2, 6, 13, 12, 0,
+1, 6, 16, 5, 1, 37, 15, 16, 34, 29, 28, 24, 16, 19, 14, 22, 32,
+4, 12, 5, 13, 22, 22, 7, 22, 29, 12, 10, 10, 28, 2, 14, 4, 37,
+17, 28, 11, 9, 7, 20, 11, 10, 14, 27, 26, 21, 28, 7, 31, 7, 16,
+19, 18, 5, 30, 7, 15, 7, 5, 11, 9, 4, 9, 6, 10, 18, 4, 17, 2,
+10, 15, 11, 4, 2, 4, 1, 2, 18, 8, 1, 0, 10, 1, 1, 21, 11, 7,
+13, 10, 2, 13, 7, 3, 12, 6, 24, 11, 10, 5, 7, 7, 3, 4, 5, 10,
+14, 19, 13, 7, 16, 6, 20, 22, 4, 12, 1, 28, 5, 11, 1, 6, 18,
+25, 18, 25, 11, 24, 9, 20, 21, 15, 21, 28, 20, 13, 5, 7, 20,
+6, 7, 0, 11, 19, 26, 3, 5, 28, 8, 12, 21, 15, 22, 24, 18, 10,
+22, 4, 2, 3, 10, 10, 18, 13, 18, 24, 20, 30, 21, 3, 10, 14, 3,
+16, 30, 21, 12, 6, 2, 9, 25, 6, 13, 8, 29, 6, 7, 12, 24, 9, 10,
+28, 12, 29, 15, 7, 2, 0, 2, 0, 2, 2, 1, 4, 1, 1, 2, 5, 5, 4,
+6, 3, 2, 0, 3, 4, 6, 9, 3, 5, 2, 2, 0, 2, 2, 2, 2, 4, 3, 8, 5,
+4, 2, 0, 1, 1, 6, 2, 6, 1, 1, 2, 4, 0, 5, 1, 2, 0, 2, 5, 1, 6,
+0, 3, 2, 5, 4, 4, 0, 1, 4, 4, 2, 3, 1, 4, 3, 3, 2, 2, 0, 0, 1,
+1, 17, 7, 3, 0, 6, 1, 1, 2, 3, 1, 7, 6, 3, 2, 4, 1, 4, 2, 1,
+2, 0, 2, 0, 0, 3, 1, 1, 2, 3, 2, 3, 5, 1, 2, 0, 0, 3, 1, 2, 1,
+2, 3, 10, 1, 1, 3, 2, 2, 1, 6, 2, 0, 6, 2, 4, 1, 3, 4, 2, 3,
+0, 0, 2, 3, 1, 3, 2, 2, 2, 1, 3, 10, 3, 2, 3, 0, 3, 2, 1, 1,
+2, 0, 6, 1, 1, 2, 1, 1, 2, 1, 7, 3, 4, 0, 2, 0, 1, 2, 0, 2, 4,
+4, 1, 0, 0, 1, 4, 4, 0, 1, 2, 3), comid = c(42, 26, 74, 3, 79,
+90, 24, 55, 88, 19, 63, 25, 98, 53, 13, 27, 46, 70, 45, 61, 30,
+29, 35, 92, 73, 41, 31, 50, 47, 38, 9, 81, 32, 23, 68, 58, 60,
+21, 69, 54, 51, 82, 10, 57, 40, 89, 2, 64, 96, 7, 36, 6, 18,
+59, 84, 11, 67, 95, 94, 5, 33, 20, 65, 56, 52, 77, 16, 66, 78,
+14, 1, 43, 15, 44, 48, 86, 91, 17, 28, 4, 85, 8, 22, 62, 39,
+76, 83, 12, 34, 75, 97, 71, 37, 87, 49, 50, 92, 68, 21, 31, 29,
+23, 30, 58, 60, 32, 38, 35, 61, 73, 81, 41, 9, 47, 53, 3, 90,
+42, 79, 63, 98, 70, 74, 45, 27, 25, 88, 55, 46, 13, 26, 24, 19,
+51, 18, 59, 10, 89, 11, 69, 84, 54, 7, 96, 6, 67, 2, 64, 82,
+36, 40, 57, 71, 17, 83, 22, 91, 12, 75, 4, 39, 34, 85, 76, 37,
+62, 97, 28, 8, 49, 87, 56, 99, 65, 14, 52, 95, 20, 15, 77, 16,
+94, 66, 33, 86, 1, 5, 43, 48, 44, 75, 97, 85, 83, 37, 8, 22,
+39, 76, 71, 62, 17, 12, 91, 49, 87, 4, 34, 28, 96, 59, 11, 7,
+10, 67, 82, 6, 64, 18, 40, 54, 51, 2, 57, 84, 89, 69, 36, 33,
+20, 78, 52, 65, 15, 66, 77, 44, 94, 14, 56, 43, 5, 1, 48, 86,
+16, 95, 79, 63, 19, 90, 55, 46, 53, 26, 42, 24, 27, 98, 70, 88,
+74, 45, 3, 13, 25, 61, 81, 29, 38, 41, 23, 30, 35, 92, 73, 47,
+9, 58, 50, 31, 60, 21, 32, 68, 66, 94, 16, 95, 78, 77, 33, 48,
+56, 65, 86, 20, 1, 15, 5, 14, 52, 44, 43, 58, 30, 35, 31, 60,
+38, 81, 92, 32, 68, 21, 29, 47, 61, 9, 41, 73, 23, 50, 75, 22,
+62, 39, 8, 93, 76, 87, 4, 91, 80, 85, 17, 28, 12, 37, 34, 49,
+83, 3, 26, 74, 42, 13, 98, 88, 25, 63, 79, 19, 27, 24, 46, 72,
+70, 55, 90, 53, 54, 84, 7, 36, 10, 40, 6, 82, 69, 57, 59, 96,
+2, 18, 67, 64, 11, 51, 89, 43, 48, 5, 86, 20, 52, 94, 66, 1,
+14, 15, 78, 44, 77, 16, 33, 65, 95, 56, 34, 39, 12, 85, 93, 80,
+4, 91, 37, 49, 62, 76, 22, 17, 87, 83, 28, 75, 8, 50, 61, 30,
+32, 81, 38, 58, 9, 73, 60, 68, 47, 29, 92, 35, 21, 23, 41, 31,
+10, 89, 40, 57, 6, 96, 69, 84, 64, 36, 51, 7, 67, 59, 18, 82,
+11, 54, 2, 63, 24, 70, 53, 46, 25, 19, 13, 27, 90, 98, 55, 79,
+3, 26, 88, 42, 74, 72), iname = c("BorisDzurek", "JohnNishi",
+"MichaelHeckler", "TomasStarychfojtu", "BoskoBarisic", "AndreSteenkamp",
+"LanceEgan", "CraigColtman", "HansBock", "LloydStruther", "JohnBuckley",
+"OlliToivonen", "YoshikoIzumiya", "PauloMorais", "SandroSoldarini",
+"MarekWalczyk", "AndrewDixon", "StanislawMankou", "YannCaleri",
+"ArturTrzaskos", "VernBarby", "GianlucaMazzocco", "WilliamKavenagh",
+"StefanFlorea", "JamieHarries", "JoseDias", "TerenceCourtoreille",
+"IvicaMagdic", "MikeTinnion", "GeorgeDaniel", "TomasAdam", "MarkYelland",
+"MiroslavAntal", "ChristopheIdre", "ReneKoops", "VilleAnttiJaakkola",
+"SeiichiKomatsuzawa", "CraigFarrar", "TimRolston", "NunoDuarte",
+"BretBishop", "SimonGrootemaat", "PiotrKonieczny", "AlessandroSgrani",
+"PeterBienek", "KimTribe", "JulienDaguillanes", "JouniNeste",
+"StephenVarga", "SimonRobinson", "DamienWalsh", "DesArmstrong",
+"KiyoshiNakagawa", "ScottTucker", "MiroslavKaticic", "AntoninPesek",
+"ToddOishi", "SabahudinPehadzicBIHI", "MarinkoPuskaric", "LucjanBurda",
+"MichalBenatinsky", "JoshStephens", "JohnTrench", "PeterElberse",
+"JarkkoSuominen", "RobertVanRensburg", "DonaldThom", "TakashiKawahara",
+"DavidEricDavies", "LucaPapandrea", "MartinDroz", "HowardCroston",
+"AaronWest", "EricLelouvrier", "JoeRiley", "HelderRodrigues",
+"MisakoIshimura", "JohnBell", "BertrandJacquemin", "JohnHorsey",
+"AntonioRodrigues", "JannePirkkalainen", "PavelMachan", "TorbjornEriksson",
+"StanislawGuzdek", "RickyLehman", "PeterDindic", "JanBartko",
+"AnthonyNaranja", "BrianJeremiah", "JohnBeaven", "JohnFoxton",
+"ValerioSantiAmantini", "JanKwisthout", "GaryGlenYoung", "IvicaMagdic",
+"StefanFlorea", "ReneKoops", "CraigFarrar", "TerenceCourtoreille",
+"GianlucaMazzocco", "ChristopheIdre", "VernBarby", "VilleAnttiJaakkola",
+"SeiichiKomatsuzawa", "MiroslavAntal", "GeorgeDaniel", "WilliamKavenagh",
+"ArturTrzaskos", "JamieHarries", "MarkYelland", "JoseDias", "TomasAdam",
+"MikeTinnion", "PauloMorais", "TomasStarychfojtu", "AndreSteenkamp",
+"BorisDzurek", "BoskoBarisic", "JohnBuckley", "YoshikoIzumiya",
+"StanislawMankou", "MichaelHeckler", "YannCaleri", "MarekWalczyk",
+"OlliToivonen", "HansBock", "CraigColtman", "AndrewDixon", "SandroSoldarini",
+"JohnNishi", "LanceEgan", "LloydStruther", "BretBishop", "KiyoshiNakagawa",
+"ScottTucker", "PiotrKonieczny", "KimTribe", "AntoninPesek",
+"TimRolston", "MiroslavKaticic", "NunoDuarte", "SimonRobinson",
+"StephenVarga", "DesArmstrong", "ToddOishi", "JulienDaguillanes",
+"JouniNeste", "SimonGrootemaat", "DamienWalsh", "PeterBienek",
+"AlessandroSgrani", "JohnFoxton", "JohnBell", "PeterDindic",
+"PavelMachan", "MisakoIshimura", "JanBartko", "BrianJeremiah",
+"JohnHorsey", "StanislawGuzdek", "AnthonyNaranja", "AntonioRodrigues",
+"RickyLehman", "ValerioSantiAmantini", "TorbjornEriksson", "JohnBeaven",
+"BertrandJacquemin", "JannePirkkalainen", "GaryGlenYoung", "JanKwisthout",
+"PeterElberse", "DionDavies", "JohnTrench", "LucaPapandrea",
+"JarkkoSuominen", "SabahudinPehadzicBIHI", "JoshStephens", "AaronWest",
+"RobertVanRensburg", "DonaldThom", "MarinkoPuskaric", "TakashiKawahara",
+"MichalBenatinsky", "HelderRodrigues", "MartinDroz", "LucjanBurda",
+"HowardCroston", "JoeRiley", "EricLelouvrier", "BrianJeremiah",
+"JohnBeaven", "AntonioRodrigues", "PeterDindic", "ValerioSantiAmantini",
+"JannePirkkalainen", "PavelMachan", "StanislawGuzdek", "RickyLehman",
+"JohnFoxton", "TorbjornEriksson", "JohnBell", "JanBartko", "MisakoIshimura",
+"GaryGlenYoung", "JanKwisthout", "JohnHorsey", "AnthonyNaranja",
+"BertrandJacquemin", "StephenVarga", "ScottTucker", "AntoninPesek",
+"SimonRobinson", "PiotrKonieczny", "ToddOishi", "SimonGrootemaat",
+"DesArmstrong", "JouniNeste", "KiyoshiNakagawa", "PeterBienek",
+"NunoDuarte", "BretBishop", "JulienDaguillanes", "AlessandroSgrani",
+"MiroslavKaticic", "KimTribe", "TimRolston", "DamienWalsh", "MichalBenatinsky",
+"JoshStephens", "DavidEricDavies", "JarkkoSuominen", "JohnTrench",
+"AaronWest", "TakashiKawahara", "RobertVanRensburg", "EricLelouvrier",
+"MarinkoPuskaric", "LucaPapandrea", "PeterElberse", "HowardCroston",
+"LucjanBurda", "MartinDroz", "JoeRiley", "HelderRodrigues", "DonaldThom",
+"SabahudinPehadzicBIHI", "BoskoBarisic", "JohnBuckley", "LloydStruther",
+"AndreSteenkamp", "CraigColtman", "AndrewDixon", "PauloMorais",
+"JohnNishi", "BorisDzurek", "LanceEgan", "MarekWalczyk", "YoshikoIzumiya",
+"StanislawMankou", "HansBock", "MichaelHeckler", "YannCaleri",
+"TomasStarychfojtu", "SandroSoldarini", "OlliToivonen", "ArturTrzaskos",
+"MarkYelland", "GianlucaMazzocco", "GeorgeDaniel", "JoseDias",
+"ChristopheIdre", "VernBarby", "WilliamKavenagh", "StefanFlorea",
+"JamieHarries", "MikeTinnion", "TomasAdam", "VilleAnttiJaakkola",
+"IvicaMagdic", "TerenceCourtoreille", "SeiichiKomatsuzawa", "CraigFarrar",
+"MiroslavAntal", "ReneKoops", "TakashiKawahara", "MarinkoPuskaric",
+"DonaldThom", "SabahudinPehadzicBIHI", "DavidEricDavies", "RobertVanRensburg",
+"MichalBenatinsky", "JoeRiley", "PeterElberse", "JohnTrench",
+"HelderRodrigues", "JoshStephens", "MartinDroz", "AaronWest",
+"LucjanBurda", "LucaPapandrea", "JarkkoSuominen", "EricLelouvrier",
+"HowardCroston", "VilleAnttiJaakkola", "VernBarby", "WilliamKavenagh",
+"TerenceCourtoreille", "SeiichiKomatsuzawa", "GeorgeDaniel",
+"MarkYelland", "StefanFlorea", "MiroslavAntal", "ReneKoops",
+"CraigFarrar", "GianlucaMazzocco", "MikeTinnion", "ArturTrzaskos",
+"TomasAdam", "JoseDias", "JamieHarries", "ChristopheIdre", "IvicaMagdic",
+"BrianJeremiah", "PavelMachan", "TorbjornEriksson", "StanislawGuzdek",
+"JannePirkkalainen", "AidenHodgins", "RickyLehman", "JanKwisthout",
+"JohnHorsey", "MisakoIshimura", "RandyTaylor", "AntonioRodrigues",
+"JohnBell", "BertrandJacquemin", "JanBartko", "ValerioSantiAmantini",
+"AnthonyNaranja", "GaryGlenYoung", "PeterDindic", "TomasStarychfojtu",
+"JohnNishi", "MichaelHeckler", "BorisDzurek", "SandroSoldarini",
+"YoshikoIzumiya", "HansBock", "OlliToivonen", "JohnBuckley",
+"BoskoBarisic", "LloydStruther", "MarekWalczyk", "LanceEgan",
+"AndrewDixon", "ThibaultGuilpain", "StanislawMankou", "CraigColtman",
+"AndreSteenkamp", "PauloMorais", "NunoDuarte", "MiroslavKaticic",
+"SimonRobinson", "DamienWalsh", "PiotrKonieczny", "PeterBienek",
+"DesArmstrong", "SimonGrootemaat", "TimRolston", "AlessandroSgrani",
+"ScottTucker", "StephenVarga", "JulienDaguillanes", "KiyoshiNakagawa",
+"ToddOishi", "JouniNeste", "AntoninPesek", "BretBishop", "KimTribe",
+"HowardCroston", "JoeRiley", "LucjanBurda", "HelderRodrigues",
+"JoshStephens", "JarkkoSuominen", "MarinkoPuskaric", "TakashiKawahara",
+"MartinDroz", "LucaPapandrea", "AaronWest", "DavidEricDavies",
+"EricLelouvrier", "RobertVanRensburg", "DonaldThom", "MichalBenatinsky",
+"JohnTrench", "SabahudinPehadzicBIHI", "PeterElberse", "AnthonyNaranja",
+"StanislawGuzdek", "JanBartko", "AntonioRodrigues", "AidenHodgins",
+"RandyTaylor", "JohnHorsey", "MisakoIshimura", "ValerioSantiAmantini",
+"GaryGlenYoung", "TorbjornEriksson", "RickyLehman", "PavelMachan",
+"JohnBell", "JanKwisthout", "PeterDindic", "BertrandJacquemin",
+"BrianJeremiah", "JannePirkkalainen", "IvicaMagdic", "ArturTrzaskos",
+"VernBarby", "MiroslavAntal", "MarkYelland", "GeorgeDaniel",
+"VilleAnttiJaakkola", "TomasAdam", "JamieHarries", "SeiichiKomatsuzawa",
+"ReneKoops", "MikeTinnion", "GianlucaMazzocco", "StefanFlorea",
+"WilliamKavenagh", "CraigFarrar", "ChristopheIdre", "JoseDias",
+"TerenceCourtoreille", "PiotrKonieczny", "KimTribe", "PeterBienek",
+"AlessandroSgrani", "DesArmstrong", "StephenVarga", "TimRolston",
+"MiroslavKaticic", "JouniNeste", "DamienWalsh", "BretBishop",
+"SimonRobinson", "ToddOishi", "ScottTucker", "KiyoshiNakagawa",
+"SimonGrootemaat", "AntoninPesek", "NunoDuarte", "JulienDaguillanes",
+"JohnBuckley", "LanceEgan", "StanislawMankou", "PauloMorais",
+"AndrewDixon", "OlliToivonen", "LloydStruther", "SandroSoldarini",
+"MarekWalczyk", "AndreSteenkamp", "YoshikoIzumiya", "CraigColtman",
+"BoskoBarisic", "TomasStarychfojtu", "JohnNishi", "HansBock",
+"BorisDzurek", "MichaelHeckler", "ThibaultGuilpain"), country = c("SVK",
+"CAN", "WAL", "CZE", "CRO", "RSA", "USA", "AUS", "NED", "NZL",
+"IRE", "FIN", "JPN", "POR", "ITA", "POL", "ENG", "BUL", "FRA",
+"POL", "AUS", "ITA", "IRE", "ROM", "WAL", "POR", "CAN", "CRO",
+"ENG", "USA", "CZE", "RSA", "SVK", "FRA", "NED", "FIN", "JPN",
+"NZL", "RSA", "POR", "USA", "NED", "POL", "ITA", "SVK", "WAL",
+"FRA", "FIN", "MAL", "ENG", "IRE", "NZL", "JPN", "AUS", "CRO",
+"CZE", "CAN", "NDI", "CRO", "POL", "SVK", "USA", "IRE", "NED",
+"FIN", "RSA", "CAN", "JPN", "WAL", "ITA", "CZE", "ENG", "NZL",
+"FRA", "AUS", "POR", "JPN", "NZL", "FRA", "ENG", "POR", "FIN",
+"CZE", "SWE", "POL", "AUS", "CRO", "SVK", "USA", "WAL", "CAN",
+"IRE", "ITA", "NED", "RSA", "CRO", "ROM", "NED", "NZL", "CAN",
+"ITA", "FRA", "AUS", "FIN", "JPN", "SVK", "USA", "IRE", "POL",
+"WAL", "RSA", "POR", "CZE", "ENG", "POR", "CZE", "RSA", "SVK",
+"CRO", "IRE", "JPN", "BUL", "WAL", "FRA", "POL", "FIN", "NED",
+"AUS", "ENG", "ITA", "CAN", "USA", "NZL", "USA", "JPN", "AUS",
+"POL", "WAL", "CZE", "RSA", "CRO", "POR", "ENG", "MAL", "NZL",
+"CAN", "FRA", "FIN", "NED", "IRE", "SVK", "ITA", "IRE", "NZL",
+"CRO", "CZE", "JPN", "SVK", "WAL", "ENG", "POL", "USA", "POR",
+"AUS", "ITA", "SWE", "CAN", "FRA", "FIN", "RSA", "NED", "NED",
+"WAL", "IRE", "ITA", "FIN", "NDI", "USA", "NZL", "RSA", "CAN",
+"CRO", "JPN", "SVK", "POR", "CZE", "POL", "ENG", "AUS", "FRA",
+"WAL", "CAN", "POR", "CRO", "ITA", "FIN", "CZE", "POL", "AUS",
+"IRE", "SWE", "NZL", "SVK", "JPN", "RSA", "NED", "ENG", "USA",
+"FRA", "MAL", "AUS", "CZE", "ENG", "POL", "CAN", "NED", "NZL",
+"FIN", "JPN", "SVK", "POR", "USA", "FRA", "ITA", "CRO", "WAL",
+"RSA", "IRE", "SVK", "USA", "WAL", "FIN", "IRE", "NZL", "JPN",
+"RSA", "FRA", "CRO", "ITA", "NED", "ENG", "POL", "CZE", "AUS",
+"POR", "CAN", "NDI", "CRO", "IRE", "NZL", "RSA", "AUS", "ENG",
+"POR", "CAN", "SVK", "USA", "POL", "JPN", "BUL", "NED", "WAL",
+"FRA", "CZE", "ITA", "FIN", "POL", "RSA", "ITA", "USA", "POR",
+"FRA", "AUS", "IRE", "ROM", "WAL", "ENG", "CZE", "FIN", "CRO",
+"CAN", "JPN", "NZL", "SVK", "NED", "JPN", "CRO", "CAN", "NDI",
+"WAL", "RSA", "SVK", "AUS", "NED", "IRE", "POR", "USA", "CZE",
+"NZL", "POL", "ITA", "FIN", "FRA", "ENG", "FIN", "AUS", "IRE",
+"CAN", "JPN", "USA", "RSA", "ROM", "SVK", "NED", "NZL", "ITA",
+"ENG", "POL", "CZE", "POR", "WAL", "FRA", "CRO", "WAL", "CZE",
+"SWE", "POL", "FIN", "IRE", "AUS", "NED", "ENG", "JPN", "CAN",
+"POR", "NZL", "FRA", "SVK", "ITA", "USA", "RSA", "CRO", "CZE",
+"CAN", "WAL", "SVK", "ITA", "JPN", "NED", "FIN", "IRE", "CRO",
+"NZL", "POL", "USA", "ENG", "FRA", "BUL", "AUS", "RSA", "POR",
+"POR", "CRO", "ENG", "IRE", "POL", "SVK", "NZL", "NED", "RSA",
+"ITA", "AUS", "MAL", "FRA", "JPN", "CAN", "FIN", "CZE", "USA",
+"WAL", "ENG", "AUS", "POL", "POR", "USA", "FIN", "CRO", "JPN",
+"CZE", "ITA", "NZL", "WAL", "FRA", "RSA", "CAN", "SVK", "IRE",
+"NDI", "NED", "USA", "POL", "SVK", "POR", "IRE", "CAN", "ENG",
+"JPN", "ITA", "RSA", "SWE", "AUS", "CZE", "NZL", "NED", "CRO",
+"FRA", "WAL", "FIN", "CRO", "POL", "AUS", "SVK", "RSA", "USA",
+"FIN", "CZE", "WAL", "JPN", "NED", "ENG", "ITA", "ROM", "IRE",
+"NZL", "FRA", "POR", "CAN", "POL", "WAL", "SVK", "ITA", "NZL",
+"MAL", "RSA", "CRO", "FIN", "IRE", "USA", "ENG", "CAN", "AUS",
+"JPN", "NED", "CZE", "POR", "FRA", "IRE", "USA", "BUL", "POR",
+"ENG", "FIN", "NZL", "ITA", "POL", "RSA", "JPN", "AUS", "CRO",
+"CZE", "CAN", "NED", "SVK", "WAL", "FRA")), .Names = c("sector",
+"session", "beatboat", "numbers", "comid", "iname", "country"), row.names = c("1",
+"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
+"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",
+"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
+"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46",
+"47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57",
+"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", "117", "118",
+"119", "120", "121", "122", "123", "124", "125", "126", "127",
+"128", "129", "130", "131", "132", "133", "134", "135", "136",
+"137", "138", "139", "140", "141", "142", "143", "144", "145",
+"146", "147", "148", "149", "150", "151", "152", "153", "154",
+"155", "156", "157", "158", "159", "160", "161", "162", "163",
+"164", "165", "166", "167", "168", "169", "170", "171", "172",
+"173", "174", "175", "176", "177", "178", "179", "180", "181",
+"182", "183", "184", "185", "186", "187", "188", "189", "190",
+"191", "192", "193", "194", "195", "196", "197", "198", "199",
+"200", "201", "202", "203", "204", "205", "206", "207", "208",
+"209", "210", "211", "212", "213", "214", "215", "216", "217",
+"218", "219", "220", "221", "222", "223", "224", "225", "226",
+"227", "228", "229", "230", "231", "232", "233", "234", "235",
+"236", "237", "238", "239", "240", "241", "242", "243", "244",
+"245", "246", "247", "248", "249", "250", "251", "252", "253",
+"254", "255", "256", "257", "258", "259", "260", "261", "262",
+"263", "264", "265", "266", "267", "268", "269", "270", "271",
+"272", "273", "274", "275", "276", "277", "278", "279", "280",
+"281", "282", "283", "284", "285", "286", "287", "288", "289",
+"290", "291", "292", "293", "294", "295", "296", "297", "298",
+"299", "300", "301", "302", "303", "304", "305", "306", "307",
+"308", "309", "310", "311", "312", "313", "314", "315", "316",
+"317", "318", "319", "320", "321", "322", "323", "324", "325",
+"326", "327", "328", "329", "330", "331", "332", "333", "334",
+"335", "336", "337", "338", "339", "340", "341", "342", "343",
+"344", "345", "346", "347", "348", "349", "350", "351", "352",
+"353", "354", "355", "356", "357", "358", "359", "360", "361",
+"362", "363", "364", "365", "366", "367", "368", "369", "370",
+"371", "372", "373", "374", "375", "376", "377", "378", "379",
+"380", "381", "382", "383", "384", "385", "386", "387", "388",
+"389", "390", "391", "392", "393", "394", "395", "396", "397",
+"398", "399", "400", "401", "402", "403", "404", "405", "406",
+"407", "408", "409", "410", "411", "412", "413", "414", "415",
+"416", "417", "418", "419", "420", "421", "422", "423", "424",
+"425", "426", "427", "428", "429", "430", "431", "432", "433",
+"434", "435", "436", "437", "438", "439", "440", "441", "442",
+"443", "444", "445", "446", "447", "448", "449", "450", "451",
+"452", "453", "454", "455", "456", "457", "458", "459", "460",
+"461", "462", "463", "464", "465", "466", "467", "468", "469",
+"470", "471", "472", "473", "474", "475"), class = "data.frame")
diff --git a/data/wffc.teams.R b/data/wffc.teams.R
new file mode 100644
index 0000000..3aa4aa7
--- /dev/null
+++ b/data/wffc.teams.R
@@ -0,0 +1,14 @@
+"wffc.teams" <-
+structure(list(country = c("CZE", "NZL", "FRA", "POL", "ITA",
+"ENG", "SVK", "USA", "CAN", "FIN", "IRE", "AUS", "POR", "JPN",
+"RSA", "NED", "WAL", "CRO"), totalPlacings = c(125, 148, 164,
+186, 196, 197, 202, 203, 227, 229, 249, 269, 293, 307, 315, 321,
+328, 333), points = c(241300, 205540, 208040, 170000, 162320,
+167480, 169800, 165960, 147940, 145100, 138160, 119920, 115380,
+90520, 76200, 93080, 58560, 97740), noofcaptures = c(383, 325, 316,
+284, 263, 272, 267, 282, 247, 230, 240, 185, 189, 142, 121, 164,
+86, 166), longestfish = c(540, 627, 585, 580, 580, 689, 615,
+615, 624, 688, 535, 580, 590, 532, 604, 505, 590, 568)), .Names = c("country",
+"totalPlacings", "points", "noofcaptures", "longestfish"), row.names = c("1",
+"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
+"14", "15", "16", "17", "18"), class = "data.frame")
diff --git a/man/AICvlm.Rd b/man/AICvlm.Rd
new file mode 100644
index 0000000..f2bf1fd
--- /dev/null
+++ b/man/AICvlm.Rd
@@ -0,0 +1,100 @@
+\name{AICvlm}
+\alias{AICvlm}
+%\alias{AICvglm}
+\alias{AICvgam}
+\alias{AICrrvglm}
+%\alias{AICqrrvglm}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Akaike's An Information Criterion }
+\description{
+ Calculates the Akaike information criterion for a fitted model object
+ for which a log-likelihood value has been obtained.
+
+}
+\usage{
+AICvlm(object, \dots, k = 2)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{object}{
+ Some \pkg{VGAM} object, for example, having
+ class \code{\link{vglmff-class}}.
+ }
+ \item{\dots}{
+ Other possible arguments fed into
+ \code{logLik} in order to compute the log-likelihood.
+ }
+ \item{k}{
+ Numeric, the penalty per parameter to be used;
+ the default is the classical AIC.
+ }
+}
+\details{
+ The following formula is used for VGLMs:
+ \eqn{-2 \mbox{log-likelihood} + k n_{par}}{-2*log-likelihood
+ + k*npar}, where \eqn{n_{par}}{npar} represents the number of parameters
+ in the fitted model, and \eqn{k = 2} for the usual AIC.
+ One can assign \eqn{k = \log(n)} (\eqn{n} the number of observations)
+ for the so-called BIC or SBC (Schwarz's Bayesian criterion).
+
+ This code relies on the log-likelihood being defined, and computed,
+ for the object.
+ When comparing fitted objects, the smaller the AIC, the better the fit.
+ The log-likelihood and hence the AIC is only defined up to an additive
+ constant.
+
+ Any estimated scale parameter (in GLM parlance) is used as one
+ parameter.
+
+ For VGAMs the nonlinear effective degrees of freedom for each
+ smoothed component is used. This is heuristic.
+
+}
+\value{
+ Returns a numeric value with the corresponding AIC (or BIC, or \dots,
+ depending on \code{k}).
+
+}
+\author{T. W. Yee }
+\note{
+ AIC has not been defined for QRR-VGLMs yet.
+
+}
+
+%\references{
+% Sakamoto, Y., Ishiguro, M., and Kitagawa G. (1986).
+% \emph{Akaike Information Criterion Statistics}.
+% D. Reidel Publishing Company.
+%}
+
+\section{Warning }{
+ This code has not been double-checked.
+ The general applicability of \code{AIC} for the VGLM/VGAM classes
+ has not been developed fully.
+ In particular, \code{AIC} should not be run on some \pkg{VGAM} family
+ functions because of violation of certain regularity conditions, etc.
+
+}
+
+\seealso{
+ VGLMs are described in \code{\link{vglm-class}};
+ RR-VGLMs are described in \code{\link{rrvglm-class}};
+ \code{\link[stats]{AIC}}.
+
+}
+\examples{
+# Fit a proportional odds model
+data(pneumo)
+pneumo = transform(pneumo, let=log(exposure.time))
+(fit1 = vglm(cbind(normal, mild, severe) ~ let,
+ cumulative(parallel=TRUE, reverse=TRUE), pneumo))
+coef(fit1, matrix=TRUE)
+AIC(fit1)
+(fit2 = vglm(cbind(normal, mild, severe) ~ let,
+ cumulative(parallel=FALSE, reverse=TRUE), pneumo))
+coef(fit2, matrix=TRUE)
+AIC(fit2)
+}
+\keyword{models}
+\keyword{regression}
+
diff --git a/man/DeLury.Rd b/man/DeLury.Rd
new file mode 100644
index 0000000..3715c35
--- /dev/null
+++ b/man/DeLury.Rd
@@ -0,0 +1,176 @@
+\name{DeLury}
+\alias{DeLury}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ DeLury's Method for Population Size Estimation }
+\description{
+ Computes DeLury's method or Leslie's method for estimating a
+ biological population size.
+
+}
+\usage{
+DeLury(catch, effort, type=c("DeLury","Leslie"), ricker=FALSE)
+
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{catch, effort}{
+ Catch and effort. These should be numeric vectors of equal length.
+
+ }
+ \item{type}{
+ Character specifying which of the DeLury or Leslie models is to be fitted.
+ The default is the first value.
+
+ }
+ \item{ricker}{
+ Logical. If \code{TRUE} then the Ricker (1975) modification is computed.
+
+ }
+}
+\details{
+ This simple function implements the methods of DeLury (1947).
+ These are called the DeLury and Leslie models.
+ Note that there are many assumptions.
+ These include: (i) Catch and effort records are available for a series
+ of consecutive time intervals. The catch for a given time
+ interval, specified by \eqn{t}, is \eqn{c(t)}, and the
+ corresponding effort by \eqn{e(t)}.
+ The \emph{catch per unit effort} (CPUE) for the time interval \eqn{t} is
+ \eqn{C(t) = c(t)/e(t)}.
+ Let \eqn{d(t)} represent the proportion of the population
+ captured during the time interval \eqn{t}.
+ Then \eqn{d(t) = k(t) e(t)} so that \eqn{k(t)} is the
+ proportion of the population captured during interval \eqn{t} by one unit
+ of effort. Then \eqn{k(t)} is called the \emph{catchability},
+ and the \emph{intensity} of effort is \eqn{e(t)}.
+ Let \eqn{E(t)} and \eqn{K(t)} be the total effort and total catch
+ up to interval \eqn{t}, and \eqn{N(t)} be the number of individuals
+ in the population at time \eqn{t}.
+ It is good idea to plot
+ \eqn{\log(C(t))} against \eqn{E(t)} for \code{type="DeLury"} and
+ \eqn{C(t)} versus \eqn{K(t)} for \code{type="Leslie"}.
+
+The other assumptions are as follows.
+%
+ (ii) The population is closed---the population must be closed to sources
+ of animals such as recruitment and immigration and losses of animals
+ due to natural mortality and emigration.
+%
+ (iii) Catchability is constant over the period of removals.
+%
+ (iv) The units of effort are independent, i.e., the individual units
+ of the method of capture (i.e., nets, traps, etc) do not compete with
+ each other.
+%
+ (v) All fish are equally vulnerable to the method of capture---source
+ of error may include gear saturation and trap-happy or trap-shy
+ individuals.
+%
+ (vi) Enough fish must be removed to substantially reduce the CPUE.
+%
+ (vii) The catches may remove less than 2\% of the population.
+%
+ Also, the usual assumptions of simple regression such as
+%
+ (viii) random sampling,
+%
+ (ix) the independent variable(s) are measured without error---both
+ catches and effort should be known, not estimated,
+%
+ (x) a line describes the data,
+%
+ (xi) the errors are independent and normally distributed.
+
+
+
+}
+\value{
+ A list with the following components.
+
+ \item{catch, effort }{
+ Catch and effort. Same as the original vectors.
+ These correspond to \eqn{c(t)} and \eqn{e(t)} respectively.
+
+ }
+ \item{type, ricker}{Same as input.
+
+ }
+ \item{N0}{an estimate of the population size at time 0.
+ Only valid if the assumptions are satisfied.
+
+ }
+ \item{CPUE}{Catch Per Unit Effort \eqn{=C(t)}. }
+ \item{K, E}{\eqn{K(t)}, \eqn{E(t)}. Only one is computed
+ depending on \code{type}. }
+ \item{lmfit}{
+ the \code{\link[stats:lm]{lm}} object from the
+ fit of \code{log(CPUE)} on \code{K} (when \code{type="Leslie"}).
+ Note that the \code{x} component of the object is the model matrix.
+
+ }
+
+}
+\references{
+
+DeLury, D. B. (1947)
+On the estimation of biological populations.
+\emph{Biometrics},
+\bold{3}, 145--167.
+
+Ricker, W. E. (1975)
+Computation and interpretation of biological
+statistics of fish populations.
+\emph{Bull. Fish. Res. Bd. Can.},
+\bold{191}, 382--
+
+}
+\author{ T. W. Yee. }
+\note{
+The data in the example below comes from DeLury (1947), and
+some plots of his are reproduced.
+Note that he used log to base 10 whereas natural logs are used here.
+His plots had some observations obscured by the y-axis!
+
+}
+\seealso{ \code{\link{wffc.nc}}. }
+\examples{
+pounds = c( 147, 2796, 6888, 7723, 5330, 8839, 6324, 3569, 8120, 8084,
+ 8252, 8411, 6757, 1152, 1500, 11945, 6995, 5851, 3221, 6345,
+ 3035, 6271, 5567, 3017, 4559, 4721, 3613, 473, 928, 2784,
+ 2375, 2640, 3569)
+traps = c( 200, 3780, 7174, 8850, 5793, 9504, 6655, 3685, 8202, 8585,
+ 9105, 9069, 7920, 1215, 1471, 11597, 8470, 7770, 3430, 7970,
+ 4740, 8144, 7965, 5198, 7115, 8585, 6935, 1060, 2070, 5725,
+ 5235, 5480, 8300)
+table1 = DeLury(pounds/1000, traps/1000)
+
+\dontrun{
+with(table1, plot(1+log(CPUE) ~ E, las=1, pch=19, main="DeLury method",
+ xlab="E(t)", ylab="1 + log(C(t))", col="blue"))
+}
+omitIndices = -(1:16)
+table1b = DeLury(pounds[omitIndices]/1000, traps[omitIndices]/1000)
+\dontrun{
+with(table1b, plot(1+log(CPUE) ~ E, las=1, pch=19, main="DeLury method",
+ xlab="E(t)", ylab="1 + log(C(t))", col="blue"))
+mylmfit = with(table1b, lmfit)
+lines(mylmfit$x[,2], 1 + predict.lm(mylmfit), col="red", lty="dashed")
+}
+
+
+
+omitIndices = -(1:16)
+table2 = DeLury(pounds[omitIndices]/1000, traps[omitIndices]/1000, type="L")
+\dontrun{
+with(table2, plot(CPUE ~ K, las=1, pch=19,
+ main="Leslie method; Fig. III",
+ xlab="K(t)", ylab="C(t)", col="blue"))
+mylmfit = with(table2, lmfit)
+abline(a=coef(mylmfit)[1], b=coef(mylmfit)[2], col="red", lty="dashed")
+}
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ models }
+
+
diff --git a/man/VGAM-package.Rd b/man/VGAM-package.Rd
index 5ad2669..0441dca 100644
--- a/man/VGAM-package.Rd
+++ b/man/VGAM-package.Rd
@@ -95,6 +95,10 @@ Yee, T. W. (2006)
Constrained additive ordination.
\emph{Ecology}, \bold{87}, 203--213.
+Yee, T. W. (2008)
+The \code{VGAM} Package.
+\emph{R News}, \bold{8}, 28--39.
+
Documentation accompanying the \pkg{VGAM} package at
\url{http://www.stat.auckland.ac.nz/~yee/VGAM}
contains further information and examples.
@@ -143,20 +147,19 @@ fit2 = vgam(cbind(agaaus, kniexc) ~ s(altitude, df=c(2,3)),
coef(fit2, mat=TRUE) # Not really interpretable
\dontrun{
plot(fit2, se=TRUE, overlay=TRUE, lcol=1:2, scol=1:2)
-attach(hunua)
-o = order(altitude)
-matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2, las=1,
- xlab="Altitude (m)", ylab="Probability of presence",
- main="Two plant species' response curves", ylim=c(0,.8))
-rug(altitude)
-detach(hunua)
+
+o = with(hunua, order(altitude))
+with(hunua, matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2,
+ xlab="Altitude (m)", ylab="Probability of presence", las=1,
+ main="Two plant species' response curves", ylim=c(0,.8)))
+with(hunua, rug(altitude))
}
# Example 4
# LMS quantile regression
data(bminz)
-fit = vgam(BMI ~ s(age, df=c(4,2)), fam=lms.bcn(zero=1), data=bminz, tr=TRUE)
+fit = vgam(BMI ~ s(age, df=c(4,2)), lms.bcn(zero=1), dat=bminz, tr=TRUE)
predict(fit)[1:3,]
fitted(fit)[1:3,]
bminz[1:3,]
diff --git a/man/alaplace3.Rd b/man/alaplace3.Rd
index 2ae0157..ed51205 100644
--- a/man/alaplace3.Rd
+++ b/man/alaplace3.Rd
@@ -299,7 +299,7 @@ with(alldat, matlines(x, fitted(fitp3), col="black", lty="solid", lwd=mylwd))
# successive solutions which are added to previous solutions; use a log
# link to ensure an increasing quantiles at any value of x.
-mytau = seq(0.1, 0.9, by=0.1)
+mytau = seq(0.2, 0.9, by=0.1)
answer = matrix(0, nrow(alldat), length(mytau)) # Stores the quantiles
alldat = transform(alldat, offsety=y*0)
usetau = mytau
@@ -308,7 +308,7 @@ for(ii in 1:length(mytau)) {
alldat = transform(alldat, usey=y-offsety)
iloc = ifelse(ii==1, with(alldat, median(y)), 1.0) # Well-chosen!
mydf = ifelse(ii==1, 5, 3) # Maybe less smoothing will help
- lloc = ifelse(ii==1, "loge", "loge") # 2nd value must be "loge"
+ lloc = ifelse(ii==1, "identity", "loge") # 2nd value must be "loge"
fit3 = vglm(usey ~ ns(x, df=mydf), data=alldat, trace=TRUE,
fam=alaplace1(tau=usetau[ii], lloc=lloc, iloc=iloc))
answer[,ii] = (if(ii==1) 0 else answer[,ii-1]) + fitted(fit3)
diff --git a/man/benfUC.Rd b/man/benfUC.Rd
new file mode 100644
index 0000000..cecfea3
--- /dev/null
+++ b/man/benfUC.Rd
@@ -0,0 +1,130 @@
+\name{Benford}
+\alias{Benford}
+\alias{dbenf}
+\alias{pbenf}
+\alias{qbenf}
+\alias{rbenf}
+\title{ Benford's Distribution }
+\description{
+ Density, distribution function,
+ quantile function,
+ and random generation
+ for Benford's distribution.
+
+}
+\usage{
+dbenf(x, ndigits=1, log=FALSE)
+pbenf(q, ndigits=1, log.p=FALSE)
+qbenf(p, ndigits=1)
+rbenf(n, ndigits=1)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{x, q}{
+ Vector of quantiles.
+ See \code{ndigits}.
+
+ }
+ \item{p}{vector of probabilities.}
+ \item{n}{number of observations. A single positive integer.
+ Else if \code{length(n) > 1} then the length is
+ taken to be the number required.
+ }
+ \item{ndigits}{
+ Number of leading digits, either 1 or 2.
+ If 1 then the support of the distribution is \{1,\ldots,9\}, else
+ \{10,\ldots,99\}.
+
+ }
+ \item{log, log.p}{
+ Logical.
+ If \code{log.p=TRUE} then all probabilities \code{p} are
+ given as \code{log(p)}.
+
+ }
+
+}
+\details{
+
+Benford's Law (aka \emph{the significant-digit law}) is the
+empirical observation that in many naturally occuring tables of
+numerical data, the leading significant (nonzero) digit
+is not uniformly distributed in \eqn{\{1,2,\ldots,9\}}{1:9}.
+Instead, the leading significant digit (\eqn{=D}, say)
+obeys the law
+ \deqn{P(D=d) = \log_{10} \left( 1 + \frac1d \right)}{%
+ P(D=d) = log10(1 + 1/d)}
+for \eqn{d=1,\ldots,9}.
+This means
+the probability the first\ significant\ digit is 1 is
+approximately \eqn{0.301}, etc.
+
+Benford's Law was apparently first discovered in 1881
+by astronomer/mathematician
+S. Newcombe. It started by the observation
+that the pages of a book of logarithms were dirtiest at the
+beginning and progressively cleaner throughout.
+In 1938, a General Electric physicist called F. Benford
+rediscovered the law on this same observation. Over
+several years he collected data from different sources
+as different as atomic weights, baseball statistics,
+numerical data from \emph{Reader's Digest},
+and drainage areas of rivers.
+
+Applications of Benford's Law has been as diverse as
+to the area of
+fraud detection in accounting and the design computers.
+
+}
+\value{
+ \code{dbenf} gives the density,
+ \code{pbenf} gives the distribution function, and
+ \code{qbenf} gives the quantile function, and
+ \code{rbenf} generates random deviates.
+
+}
+\references{
+
+Benford, F. (1938)
+The Law of Anomalous Numbers.
+\emph{Proceedings of the American Philosophical Society},
+\bold{78}, 551--572.
+
+Newcomb, S. (1881)
+Note on the Frequency of Use of the Different Digits in Natural Numbers.
+\emph{American Journal of Mathematics},
+\bold{4}, 39--40.
+
+}
+\author{ T. W. Yee }
+%\note{
+% Currently only the leading digit is handled.
+% The first two leading digits would be the next simple extension.
+%
+%}
+
+%\seealso{
+% \code{\link{logff}}.
+%}
+\examples{
+x = c(0:10, NA, NaN, -Inf, Inf)
+dbenf(x)
+pbenf(x)
+
+\dontrun{
+x = 1:9; # par(mfrow=c(2,1))
+barplot(dbenf(x), col = "lightblue", las=1, xlab="Leading digit",
+ ylab = "Probability",
+ main=paste("Benford's distribution", sep=""),
+ names.arg = as.character(x))
+
+hist(rbenf(n=1000), border = "blue", prob=TRUE,
+ main="Random variates from Benford's distribution",
+ xlab="Leading digit",
+ sub="Red is the true probability",
+ breaks=0:9+0.5, ylim=c(0, 0.35), xlim=c(0, 10.0))
+lines(1:9, dbenf(1:9), col="red", type="h")
+points(1:9, dbenf(1:9), col="red")
+}
+}
+\keyword{distribution}
diff --git a/man/betabin.ab.Rd b/man/betabin.ab.Rd
index f0941cd..1df56b1 100644
--- a/man/betabin.ab.Rd
+++ b/man/betabin.ab.Rd
@@ -173,8 +173,7 @@ cbind(fit at y, weights(fit, type="prior"))[1:5,]
# Example 2
data(lirat)
-fit = vglm(cbind(R,N-R) ~ 1, betabin.ab, data=lirat,
- trace=TRUE, subset=N>1)
+fit = vglm(cbind(R,N-R) ~ 1, betabin.ab, data=lirat, tra=TRUE, subset=N>1)
coef(fit, matrix=TRUE)
Coef(fit)
fit at misc$rho # The correlation parameter
@@ -196,24 +195,21 @@ coef(fit2, matrix=TRUE)
Coef(fit2)
coef(fit2, matrix=TRUE)[,1] - coef(fit2, matrix=TRUE)[,2] # logit(p)
\dontrun{
-plot(lirat$hb[lirat$N>1], fit2 at misc$rho,
- xlab="Hemoglobin", ylab="Estimated rho",
- pch=as.character(lirat$grp[lirat$N>1]),
- col=lirat$grp[lirat$N>1])
+with(lirat, plot(hb[N>1], fit2 at misc$rho,
+ xlab="Hemoglobin", ylab="Estimated rho",
+ pch=as.character(grp[N>1]), col=grp[N>1]))
}
\dontrun{
data(lirat)
-attach(lirat)
# cf. Figure 3 of Moore and Tsiatis (1991)
-plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
- xlab="Hemoglobin level", ylab="Proportion Dead",
- main="Fitted values (lines)")
-detach(lirat)
+with(lirat, plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
+ xlab="Hemoglobin level", ylab="Proportion Dead",
+ main="Fitted values (lines)"))
-smalldf = lirat[lirat$N>1,]
+smalldf = with(lirat, lirat[N>1,])
for(gp in 1:4) {
- xx = smalldf$hb[smalldf$grp==gp]
- yy = fitted(fit2)[smalldf$grp==gp]
+ xx = with(smalldf, hb[grp==gp])
+ yy = with(smalldf, fitted(fit2)[grp==gp])
o = order(xx)
lines(xx[o], yy[o], col=gp)
}
diff --git a/man/betabinUC.Rd b/man/betabinUC.Rd
index 438cd58..3640be6 100644
--- a/man/betabinUC.Rd
+++ b/man/betabinUC.Rd
@@ -92,19 +92,25 @@ rbetabin.ab(n, size, shape1, shape2)
\dontrun{
N = 9; x = 0:N; s1=2; s2=3
dy = dbetabin.ab(x, size=N, shape1=s1, shape2=s2)
-plot(x, dy, type="h", col="red", ylim=c(0,0.25), ylab="Probability",
- main=paste("Beta-binomial (size=",N,", shape1=",s1,
- ", shape2=",s2,")", sep=""))
-lines(x+0.1, dbinom(x, size=N, prob=s1/(s1+s2)), type="h", col="blue")
+barplot(rbind(dy, dbinom(x, size=N, prob=s1/(s1+s2))),
+ beside = TRUE, col = c("blue","green"),
+ main=paste("Beta-binomial (size=",N,", shape1=",s1,
+ ", shape2=",s2,") (blue) vs\n",
+ " Binomial(size=", N, ", prob=", s1/(s1+s2), ") (green)", sep=""),
+ names.arg = as.character(x))
sum(dy*x) # Check expected values are equal
sum(dbinom(x, size=N, prob=s1/(s1+s2))*x)
cumsum(dy) - pbetabin.ab(x, N, shape1=s1, shape2=s2)
y = rbetabin.ab(n=10000, size=N, shape1=s1, shape2=s2)
ty = table(y)
-lines(as.numeric(names(ty))+0.2, ty/sum(ty), type="h", col="green")
-legend(5, 0.25, leg=c("beta-binomial","binomial", "random generated"),
- col=c("red","blue","green"), lty=1)
+barplot(rbind(dy, ty/sum(ty)),
+ beside = TRUE, col = c("blue","red"),
+ main=paste("Beta-binomial (size=",N,", shape1=",s1,
+ ", shape2=",s2,") (blue) vs\n",
+ " Random generated beta-binomial(size=", N, ", prob=", s1/(s1+s2),
+ ") (red)", sep=""),
+ names.arg = as.character(x))
}
}
\keyword{distribution}
diff --git a/man/betabinomial.Rd b/man/betabinomial.Rd
index b06fd92..29cb0c8 100644
--- a/man/betabinomial.Rd
+++ b/man/betabinomial.Rd
@@ -186,24 +186,20 @@ fit2 = vglm(cbind(R,N-R) ~ fgrp + hb, betabinomial(zero=2),
data=lirat, trace=TRUE, subset=N>1)
coef(fit2, matrix=TRUE)
\dontrun{
-plot(lirat$hb[lirat$N>1], fit2 at misc$rho,
- xlab="Hemoglobin", ylab="Estimated rho",
- pch=as.character(lirat$grp[lirat$N>1]),
- col=lirat$grp[lirat$N>1])
+with(lirat, plot(hb[N>1], fit2 at misc$rho,
+ xlab="Hemoglobin", ylab="Estimated rho",
+ pch=as.character(grp[N>1]), col=grp[N>1]))
}
\dontrun{
data(lirat)
-attach(lirat)
# cf. Figure 3 of Moore and Tsiatis (1991)
-plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
- xlab="Hemoglobin level", ylab="Proportion Dead",
- main="Fitted values (lines)")
-detach(lirat)
-
-smalldf = lirat[lirat$N>1,]
+with(lirat, plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
+ xlab="Hemoglobin level", ylab="Proportion Dead",
+ main="Fitted values (lines)"))
+smalldf = with(lirat, lirat[N>1,])
for(gp in 1:4) {
- xx = smalldf$hb[smalldf$grp==gp]
- yy = fitted(fit2)[smalldf$grp==gp]
+ xx = with(smalldf, hb[grp==gp])
+ yy = with(smalldf, fitted(fit2)[grp==gp])
o = order(xx)
lines(xx[o], yy[o], col=gp)
}
diff --git a/man/binom2.or.Rd b/man/binom2.or.Rd
index 8f6bb69..435105c 100644
--- a/man/binom2.or.Rd
+++ b/man/binom2.or.Rd
@@ -13,7 +13,7 @@
binom2.or(lmu = "logit", lmu1 = lmu, lmu2 = lmu, loratio = "loge",
emu=list(), emu1=emu, emu2=emu, eoratio=list(),
imu1=NULL, imu2=NULL, ioratio = NULL,
- zero = 3, exchangeable = FALSE, tol = 0.001)
+ zero = 3, exchangeable = FALSE, tol = 0.001, morerobust=FALSE)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -60,6 +60,13 @@ binom2.or(lmu = "logit", lmu1 = lmu, lmu2 = lmu, loratio = "loge",
small positive numerical value.
}
+ \item{morerobust}{
+ Logical. If \code{TRUE} then some measures are taken to compute the
+ derivatives and working weights more robustly, i.e., in an attempt
+ to avoid numerical problems. Currently this feature is not debugged
+ if set \code{TRUE}.
+
+ }
}
\details{
Known also as the \emph{Palmgren model}, the bivariate logistic model is
@@ -172,6 +179,9 @@ fit = vglm(cbind(nBnW,nBW,BnW,BW) ~ Age, binom2.or(zero=NULL), coalminers)
fitted(fit)
summary(fit)
coef(fit, matrix=TRUE)
+
+c(weights(fit, type="prior")) * fitted(fit) # Table 6.8
+
\dontrun{
with(coalminers, matplot(Age, fitted(fit), type="l", las=1,
xlab="(age - 42) / 5", lwd=2))
diff --git a/man/binom2.rho.Rd b/man/binom2.rho.Rd
index 87232fc..c6fbae7 100644
--- a/man/binom2.rho.Rd
+++ b/man/binom2.rho.Rd
@@ -1,13 +1,16 @@
\name{binom2.rho}
\alias{binom2.rho}
%- Also NEED an '\alias' for EACH other topic documented here.
-\title{ Bivariate Probit Model }
+\title{ Bivariate Probit Model (Family Function) }
\description{
Fits a bivariate probit model to two binary responses.
+ The correlation parameter rho is the measure of dependency.
+
}
\usage{
binom2.rho(lrho = "rhobit", erho=list(),
- init.rho = 0.4, zero = 3, exchangeable = FALSE)
+ imu1 = NULL, imu2 = NULL, init.rho = NULL,
+ zero = 3, exchangeable = FALSE, nsimEIM=NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -22,13 +25,21 @@ binom2.rho(lrho = "rhobit", erho=list(),
}
\item{init.rho}{
- Initial value for \eqn{\rho}{rho}.
- This should lie between \eqn{-1} and \eqn{1}.
+ Optional initial value for \eqn{\rho}{rho}.
+ If given, this should lie between \eqn{-1} and \eqn{1}.
+ See below for more comments.
+
+ }
+ \item{imu1, imu2}{
+ Optional initial values for the two marginal probabilities.
+ May be a vector.
}
\item{zero}{
- Which linear/additive predictor is modelled as an
- intercept only? A \code{NULL} means none.
+ Which linear/additive predictor is modelled as an intercept only?
+ A \code{NULL} means none.
+ Numerically, the \eqn{\rho}{rho} parameter is easiest modelled as
+ an intercept only, hence the default.
}
\item{exchangeable}{
@@ -37,6 +48,13 @@ binom2.rho(lrho = "rhobit", erho=list(),
be equal.
}
+ \item{nsimEIM}{
+ See \code{\link{CommonVGAMffArguments}} for more information.
+ A value of at least 100 is recommended;
+ the larger the value the better.
+
+ }
+
}
\details{
The \emph{bivariate probit model} was one of the earliest regression
@@ -47,11 +65,12 @@ binom2.rho(lrho = "rhobit", erho=list(),
unit variances). One can think of the joint probabilities being
\eqn{\Phi(\eta_1,\eta_2;\rho)}{Phi(eta1,eta2;rho)} where \eqn{\Phi}{Phi}
is the cumulative distribution function of a standard bivariate normal
- distribution with correlation parameter \eqn{\rho}{rho}.
+ distribution (i.e., \code{\link[stats:Normal]{pnorm}})
+ with correlation parameter \eqn{\rho}{rho}.
The bivariate probit model should not be confused with a \emph{bivariate
logit model} with a probit link (see \code{\link{binom2.or}}).
- The latter uses the odds ratio to quantify the association. Actually,
+ The latter uses the odds ratio to quantify the association. Actually,
the bivariate logit model is recommended over the bivariate probit
model because the odds ratio is a more natural way of measuring the
association between two binary responses.
@@ -91,21 +110,30 @@ contains further information and examples.
\eqn{\rho}{rho} lies in the interval \eqn{(-1,1)}{(-1,1)}, therefore
a \code{\link{rhobit}} link is default.
- If converge problems occur, try setting \code{init.rho} to some
- value, e.g., a negative number such as \eqn{-0.5}{-0.5}.
+ Converge problems can occur.
+ If so, assign \code{init.rho} a range of
+ values and monitor convergence (e.g., set \code{trace=TRUE}).
+ Practical experience shows that local solutions can occur,
+ and that \code{init.rho} needs to be quite close to the (global)
+ solution.
+ Also, \code{imu1} and \code{imu2} may be used.
+
}
\seealso{
+ \code{\link{rbinom2.rho}},
\code{\link{binom2.or}},
\code{\link{loglinb2}},
\code{\link{coalminers}},
\code{\link{binomialff}},
\code{\link{rhobit}},
\code{\link{fisherz}}.
+
}
\examples{
data(coalminers)
coalminers = transform(coalminers, Age = (age - 42) / 5)
-fit = vglm(cbind(nBnW,nBW,BnW,BW) ~ Age, binom2.rho, coalminers)
+fit = vglm(cbind(nBnW,nBW,BnW,BW) ~ Age, binom2.rho,
+ data=coalminers, trace=TRUE)
summary(fit)
coef(fit, matrix=TRUE)
}
diff --git a/man/binom2.rhoUC.Rd b/man/binom2.rhoUC.Rd
new file mode 100644
index 0000000..be441fb
--- /dev/null
+++ b/man/binom2.rhoUC.Rd
@@ -0,0 +1,120 @@
+\name{Binom2.rho}
+\alias{Binom2.rho}
+\alias{dbinom2.rho}
+\alias{rbinom2.rho}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Bivariate Probit Model }
+\description{
+ Density and random generation for a bivariate probit model.
+ The correlation parameter rho is the measure of dependency.
+
+}
+\usage{
+rbinom2.rho(n, mu1,
+ mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+ rho=0, exchangeable=FALSE, twoCols=TRUE,
+ colnames=if(twoCols) c("y1","y2") else c("00", "01", "10", "11"),
+ ErrorCheck=TRUE)
+dbinom2.rho(mu1,
+ mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+ rho=0, exchangeable=FALSE,
+ colnames=c("00", "01", "10", "11"), ErrorCheck=TRUE)
+
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{n}{
+ number of observations. Must be a single positive integer.
+ The arguments \code{mu1}, \code{mu2}, \code{rho} are recycled to
+ length \code{n}.
+
+ }
+ \item{mu1, mu2}{
+ The marginal probabilities.
+ Only \code{mu1} is needed if \code{exchangeable=TRUE}.
+ Values should be between 0 and 1.
+
+ }
+ \item{rho}{
+ The correlation parameter.
+ Must be numeric and lie between \eqn{-1} and \eqn{1}.
+ The default value of zero means the responses are uncorrelated.
+
+ }
+ \item{exchangeable}{
+ Logical. If \code{TRUE}, the two marginal probabilities are constrained
+ to be equal.
+
+ }
+ \item{twoCols}{
+ Logical.
+ If \code{TRUE}, then a \eqn{n} \eqn{\times}{*} \eqn{2} matrix of 1s
+ and 0s is returned.
+ If \code{FALSE}, then a \eqn{n} \eqn{\times}{*} \eqn{4} matrix of 1s
+ and 0s is returned.
+
+ }
+ \item{colnames}{
+ The \code{dimnames} argument of
+ \code{\link[base]{matrix}} is assigned \code{list(NULL, colnames)}.
+
+ }
+ \item{ErrorCheck}{
+ Logical. Do some error checking of the input parameters?
+
+ }
+
+}
+\details{
+ The function \code{rbinom2.rho} generates data coming from a bivariate
+ probit model.
+ The data might be fitted with the \pkg{VGAM} family function
+ \code{\link{binom2.rho}}.
+
+ The function \code{dbinom2.rho} does not really compute the density
+ (because that does not make sense here) but rather returns the
+ four joint probabilities.
+
+}
+\value{
+ The function \code{rbinom2.rho} returns
+ either a 2 or 4 column matrix of 1s and 0s, depending on the argument
+ \code{twoCols}.
+
+ The function \code{dbinom2.rho} returns
+ a 4 column matrix of joint probabilities; each row adds up to unity.
+
+}
+\author{ T. W. Yee }
+\seealso{
+ \code{\link{binom2.rho}}.
+
+}
+\examples{
+# Example 1
+nn = 2000
+(myrho <- rhobit(2, inverse=TRUE))
+ymat = rbinom2.rho(n=nn, mu1=0.8, rho=myrho, exch=TRUE)
+(mytab <- table(ymat[,1], ymat[,2]))
+fit = vglm(ymat ~ 1, binom2.rho(exch=TRUE))
+coef(fit, matrix=TRUE)
+
+# Example 2
+x = sort(runif(nn))
+mu1 = probit(-2+4*x, inverse=TRUE)
+mu2 = probit(-1+3*x, inverse=TRUE)
+dmat = dbinom2.rho(mu1=mu1, mu2=mu2, rho=myrho)
+ymat = rbinom2.rho(n=nn, mu1=mu1, mu2=mu2, rho=myrho)
+fit2 = vglm(ymat ~ x, binom2.rho)
+coef(fit2, matrix=TRUE)
+\dontrun{
+matplot(x, dmat, lty=1:4, col=1:4, type="l", main="Joint probabilities",
+ ylim=0:1, lwd=2, ylab="Probability")
+legend(x=0.25, y=0.9, lty=1:4, col=1:4, lwd=2,
+ legend=c("1 = (y1=0, y2=0)", "2 = (y1=0, y2=1)",
+ "3 = (y1=1, y2=0)", "4 = (y1=1, y2=1)"))
+}
+}
+\keyword{distribution}
+
+
diff --git a/man/binomialff.Rd b/man/binomialff.Rd
index 3fa4ab1..fc27285 100644
--- a/man/binomialff.Rd
+++ b/man/binomialff.Rd
@@ -156,12 +156,10 @@ quasibinomialff(link="probit")
data(hunua)
fit = vgam(agaaus ~ poly(altitude, 2), binomialff(link=cloglog), hunua)
\dontrun{
-attach(hunua)
-plot(altitude, agaaus, col="blue", ylab="P(agaaus=1)",
- main="Presence/absence of Agathis australis", las=1)
-o = order(altitude)
-lines(altitude[o], fitted(fit)[o], col="red", lwd=2)
-detach(hunua)
+with(hunua, plot(altitude, agaaus, col="blue", ylab="P(agaaus=1)",
+ main="Presence/absence of Agathis australis", las=1))
+o = with(hunua, order(altitude))
+with(hunua, lines(altitude[o], fitted(fit)[o], col="red", lwd=2))
}
}
\keyword{models}
diff --git a/man/bisa.Rd b/man/bisa.Rd
index 264db75..f8ea790 100644
--- a/man/bisa.Rd
+++ b/man/bisa.Rd
@@ -54,7 +54,7 @@ bisa(lshape = "loge", lscale = "loge",
F(y;a,k) = pnorm[xi(y/b)/a] }
where \eqn{\Phi(\cdot)}{pnorm()} is the
cumulative distribution function of a standard normal
- (see \code{\link[stats]{pnorm}}),
+ (see \code{\link[stats:Normal]{pnorm}}),
\eqn{\xi(t) = \sqrt{t} - 1 / \sqrt{t}}{xi(t) = t^(0.5) - t^(-0.5)},
\eqn{y > 0},
\eqn{a>0} is the shape parameter,
diff --git a/man/bminz.Rd b/man/bminz.Rd
index b7b5d77..6eb1a3c 100644
--- a/man/bminz.Rd
+++ b/man/bminz.Rd
@@ -39,9 +39,8 @@ Health Study: design and baseline findings.
\examples{
\dontrun{
data(bminz)
-attach(bminz); plot(age, BMI, col="blue"); detach(bminz)
-
-fit = vgam(BMI ~ s(age, df=c(2,4,2)), fam=lms.yjn, data=bminz, tr=TRUE)
+with(bminz, plot(age, BMI, col="blue"))
+fit = vgam(BMI ~ s(age, df=c(2,4,2)), fam=lms.yjn, bminz, tr=TRUE)
qtplot(fit, pcol="blue", tcol="brown", lcol="brown")
}
}
diff --git a/man/brat.Rd b/man/brat.Rd
index 5df3a16..bcf5588 100644
--- a/man/brat.Rd
+++ b/man/brat.Rd
@@ -63,7 +63,7 @@ Citation patterns in the journals of statistics and probability.
\emph{Statistical Science},
\bold{9}, 94--108.
-The \code{BradleyTerry} package has more comprehensive capabilities
+The \pkg{BradleyTerry} package has more comprehensive capabilities
than this function.
}
\author{ T. W. Yee }
diff --git a/man/calibrate.Rd b/man/calibrate.Rd
index 895bbeb..1294758 100644
--- a/man/calibrate.Rd
+++ b/man/calibrate.Rd
@@ -55,6 +55,7 @@ calibrate(object, ...)
}
\examples{
+\dontrun{
data(hspider)
hspider[,1:6] = scale(hspider[,1:6]) # Standardized environmental vars
set.seed(123)
@@ -68,7 +69,6 @@ p1 = cao(cbind(Pardlugu, Pardmont, Pardnigr, Pardpull, Zoraspin) ~
siteNos = 1:2 # Calibrate these sites
cp1 = calibrate(p1, new=data.frame(p1 at y[siteNos,]), trace=TRUE)
-\dontrun{
# Graphically compare the actual site scores with their calibrated values
persp(p1, main="Solid=actual, dashed=calibrated site scores",
label=TRUE, col="blue", las=1)
diff --git a/man/cao.Rd b/man/cao.Rd
index a8b409b..cf20149 100644
--- a/man/cao.Rd
+++ b/man/cao.Rd
@@ -246,14 +246,18 @@ Constrained additive ordination.
}
\section{Warning }{
+ CAO is very costly to compute. With version 0.7-8 it took 28 minutes on
+ a fast machine. I hope to look at ways of speeding things up in the
+ future.
+
CAO models present a difficult optimization problem, partly because the
- log-likelihood function contains many local solutions. To obtain the
+ log-likelihood function contains many local solutions. To obtain the
(global) solution the user is advised to try many initial values. This
can be done by setting \code{Bestof} some appropriate value (see
\code{\link{cao.control}}). Trying many initial values becomes
progressively more important as the nonlinear degrees of freedom of
the smooths increase. Use \code{\link[base:Random]{set.seed}} to make your
- results reproducible.
+ results reproducible.
% The code is a little fragile at this stage, so the function might
% hang/lock up in the microsoft Windows version.
@@ -283,6 +287,7 @@ Constrained additive ordination.
}
\examples{
+\dontrun{
data(hspider)
hspider[,1:6] = scale(hspider[,1:6]) # Standardized environmental vars
set.seed(149)
@@ -297,7 +302,6 @@ sort(ap1 at misc$deviance.Bestof) # A history of all the iterations
Coef(ap1)
ccoef(ap1)
-\dontrun{
par(mfrow=c(2,2))
plot(ap1) # All the curves are unimodal; some quite symmetric
diff --git a/man/chest.Rd b/man/chest.Rd
index bb79118..552ad11 100644
--- a/man/chest.Rd
+++ b/man/chest.Rd
@@ -41,3 +41,5 @@ plot(fit, which.cf=2, se=TRUE)
}
}
\keyword{datasets}
+
+
diff --git a/man/cqo.Rd b/man/cqo.Rd
index 50d1bca..2b7d240 100644
--- a/man/cqo.Rd
+++ b/man/cqo.Rd
@@ -420,7 +420,7 @@ if(deviance(p1) > 1177) stop("suboptimal fit obtained")
S = ncol(p1 at y) # Number of species
clr = (1:(S+1))[-7] # omits yellow
lvplot(p1, y=TRUE, lcol=clr, pch=1:S, pcol=clr, las=1) # ordination diagram
-legend("topright", leg=dimnames(p1 at y)[[2]], col=clr,
+legend("topright", leg=colnames(p1 at y), col=clr,
pch=1:S, merge=TRUE, bty="n", lty=1:S, lwd=2)
}
(cp = Coef(p1))
@@ -482,5 +482,5 @@ cbind(truth=attr(mydata, "ccoefficients"), fitted=ccoef(b1))
\keyword{models}
\keyword{regression}
-%legend("topright", x=1, y=135, leg=dimnames(p1 at y)[[2]], col=clr,
+%legend("topright", x=1, y=135, leg=colnames(p1 at y), col=clr,
% pch=1:S, merge=TRUE, bty="n", lty=1:S, lwd=2)
diff --git a/man/cumulative.Rd b/man/cumulative.Rd
index ad6cb4e..e531423 100644
--- a/man/cumulative.Rd
+++ b/man/cumulative.Rd
@@ -5,7 +5,7 @@
\title{ Ordinal Regression with Cumulative Probabilities }
\description{
Fits a cumulative logit/probit/cloglog/cauchit/...
- regression model to an ordered (preferably) factor response.
+ regression model to a (preferably ordered) factor response.
}
\usage{
@@ -43,6 +43,7 @@ scumulative(link="logit", earg = list(),
\item{parallel}{
A logical or formula specifying which terms have
equal/unequal coefficients.
+ See below for more information about the parallelism assumption.
}
\item{sparallel}{
@@ -107,8 +108,8 @@ scumulative(link="logit", earg = list(),
In almost all the literature, the constraint matrices associated
with this family of models are known. For example, setting
- \code{parallel=TRUE} will make all constraint matrices (except for
- the intercept) equal to a vector of \eqn{M} 1's.
+ \code{parallel=TRUE} will make all constraint matrices
+ (except for the intercept) equal to a vector of \eqn{M} 1's.
If the constraint matrices are equal, unknown and to be estimated, then
this can be achieved by fitting the model as a
reduced-rank vector generalized
@@ -162,6 +163,11 @@ contains further information and examples.
are all positive), or a factor. In both cases, the \code{y} slot
returned by \code{vglm}/\code{vgam}/\code{rrvglm} is the matrix
of counts.
+ The formula must contain an intercept term.
+ Other \pkg{VGAM} family functions for an ordinal response include
+ \code{\link{acat}},
+ \code{\link{cratio}},
+ \code{\link{sratio}}.
For a nominal (unordered) factor response, the multinomial
logit model (\code{\link{multinomial}}) is more appropriate.
@@ -185,9 +191,18 @@ contains further information and examples.
the regression coefficients for \code{x1} and \code{x2} to be
equal; those of the intercepts and \code{x3} would be different.
- In the future, this family function may be renamed to
- ``\code{cups}'' (for \bold{cu}mulative \bold{p}robabilitie\bold{s})
- or ``\code{cute}'' (for \bold{cu}mulative probabili\bold{t}i\bold{e}s).
+ If the data is inputted in \emph{long} format
+ (not \emph{wide} format, as in \code{\link{pneumo}} below)
+ then good initial values are needed; use
+ \code{mustart},
+ \code{coefstart} and/or
+ \code{etatstart}.
+ See the example below.
+
+
+% In the future, this family function may be renamed to
+% ``\code{cups}'' (for \bold{cu}mulative \bold{p}robabilitie\bold{s})
+% or ``\code{cute}'' (for \bold{cu}mulative probabili\bold{t}i\bold{e}s).
% Please let me know if you strongly agree or disagree about this.
@@ -204,6 +219,7 @@ contains further information and examples.
\code{\link{sratio}},
\code{\link{multinomial}},
\code{\link{pneumo}},
+ \code{\link{Links}},
\code{\link{logit}},
\code{\link{probit}},
\code{\link{cloglog}},
@@ -239,7 +255,7 @@ plot(fit2, se=TRUE, overlay=TRUE, lcol=1:2, scol=1:2)
# A factor() version of fit ----------------------------------
nobs = round(fit at y * c(weights(fit, type="prior")))
-sumnobs = apply(nobs, 2, sum)
+sumnobs = colSums(nobs) # apply(nobs, 2, sum)
mydat = data.frame(
response = ordered(c(rep("normal", times=sumnobs["normal"]),
rep("mild", times=sumnobs["mild"]),
@@ -250,6 +266,21 @@ mydat = data.frame(
with(pneumo, rep(let, times=nobs[,"severe"]))))
(fit4 = vglm(response ~ LET, data=mydat,
cumulative(parallel=TRUE, reverse=TRUE), trace=TRUE))
+
+
+# Long format (cf. wide format above) ----------------------------------
+longdata = data.frame(symptoms=ordered(rep(rep(colnames(nobs), nrow(nobs)),
+ times=c(t(nobs))),
+ levels = colnames(nobs)),
+ let = rep(rep(with(pneumo, let), each=ncol(nobs)),
+ times=c(t(nobs))))
+with(longdata, table(let, symptoms)) # check it; should be same as pneumo
+mymustart = matrix(sumnobs / sum(sumnobs),
+ nrow(longdata), ncol(nobs), byrow=TRUE)
+fit.long = vglm(symptoms ~ let,
+ fam = cumulative(parallel=TRUE, reverse=TRUE),
+ mustart=mymustart, data = longdata, trace=TRUE)
+coef(fit.long, matrix=TRUE) # Should be same as coef(fit, matrix=TRUE)
}
\keyword{models}
\keyword{regression}
diff --git a/man/enzyme.Rd b/man/enzyme.Rd
index d4bb099..99ad822 100644
--- a/man/enzyme.Rd
+++ b/man/enzyme.Rd
@@ -32,14 +32,8 @@ Watts, D. G. (1981)
}
\examples{
data(enzyme)
-fit = vglm(velocity ~ 1, micmen, enzyme, trace = TRUE, crit = "c",
- regressor = enzyme$conc)
-\dontrun{attach(enzyme)
-plot(conc, velocity, xlab="concentration", las=1, main="enzyme data")
-lines(conc, fitted(fit), col="blue")
-detach(enzyme)
-}
-
+fit = vglm(velocity ~ 1, micmen, data=enzyme, trace = TRUE,
+ form2 = ~ conc - 1, crit = "crit")
summary(fit)
}
\keyword{datasets}
diff --git a/man/erf.Rd b/man/erf.Rd
index 05a959b..e0d3c82 100644
--- a/man/erf.Rd
+++ b/man/erf.Rd
@@ -16,7 +16,7 @@ erf(x)
\eqn{Erf(x)} is defined as
\deqn{Erf(x) = \frac{2}{\sqrt{\pi}} \int_0^x \exp(-t^2) dt}{%
Erf(x) = (2/sqrt(pi)) int_0^x exp(-t^2) dt}
- so that it is closely related to \code{\link[stats]{pnorm}}.
+ so that it is closely related to \code{\link[stats:Normal]{pnorm}}.
}
\value{
Returns the value of the function evaluated at \code{x}.
@@ -38,7 +38,10 @@ New York: Dover Publications Inc.
as \eqn{1-erf(x)}, and is implemented by \code{erfc}.
}
-\seealso{ \code{\link[stats]{pnorm}}. }
+\seealso{
+ \code{\link[stats:Normal]{pnorm}}.
+}
+
\examples{
\dontrun{
x = seq(-3, 3, len=200)
diff --git a/man/fitted.vlm.Rd b/man/fitted.vlm.Rd
index d2eba00..0f134ba 100644
--- a/man/fitted.vlm.Rd
+++ b/man/fitted.vlm.Rd
@@ -10,13 +10,13 @@
}
\usage{
-fitted.vlm(object, matrix = TRUE, ...)
+fitted.vlm(object, matrix.arg = TRUE, ...)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
\item{object}{ a model object that inherits from a VLM.
}
- \item{matrix}{ Logical. Return the answer as a matrix?
+ \item{matrix.arg}{ Logical. Return the answer as a matrix?
If \code{FALSE} then it will be a vector. }
\item{\dots}{ Currently unused. }
}
diff --git a/man/fnormUC.Rd b/man/fnormUC.Rd
index 6d1d13c..e24e6dc 100644
--- a/man/fnormUC.Rd
+++ b/man/fnormUC.Rd
@@ -21,7 +21,7 @@ rfnorm(n, mean=0, sd=1, a1=1, a2=1)
\item{p}{vector of probabilities.}
\item{n}{number of observations.
Must be a positive integer of length 1.}
- \item{mean, sd}{ see \code{\link[stats]{rnorm}}. }
+ \item{mean, sd}{ see \code{\link[stats:Normal]{rnorm}}. }
\item{a1, a2}{ see \code{\link{fnormal1}}. }
\item{\ldots}{
Arguments that can be passed into \code{\link[stats]{uniroot}}.
diff --git a/man/fnormal1.Rd b/man/fnormal1.Rd
index 0a492c0..fdf86ae 100644
--- a/man/fnormal1.Rd
+++ b/man/fnormal1.Rd
@@ -73,7 +73,7 @@ fnormal1(lmean="identity", lsd="loge", emean=list(), esd=list(),
mu*[1-2*Phi(-mu/sigma)] }
and these are returned as the fitted values.
Here, \eqn{\Phi()}{Phi} is the cumulative distribution function of a
- standard normal (\code{\link[stats]{pnorm}}).
+ standard normal (\code{\link[stats:Normal]{pnorm}}).
}
\value{
@@ -108,7 +108,7 @@ fnormal1(lmean="identity", lsd="loge", emean=list(), esd=list(),
\seealso{
\code{\link{rfnorm}},
\code{\link{normal1}},
- \code{\link[stats]{dnorm}},
+ \code{\link[stats:Normal]{dnorm}},
\code{\link{skewnormal1}}.
}
diff --git a/man/gev.Rd b/man/gev.Rd
index cca2060..11e5467 100644
--- a/man/gev.Rd
+++ b/man/gev.Rd
@@ -255,11 +255,9 @@ fitted(fit1)[1:4,]
par(mfrow=c(1,2), las=1)
plot(fit1, se=TRUE, lcol="blue", scol="forestgreen",
main="Fitted mu(year) function (centered)")
-attach(venice)
-matplot(year, y[,1:2], ylab="Sea level (cm)", col=1:2,
- main="Highest 2 annual sealevels and fitted 95 percentile")
-lines(year, fitted(fit1)[,1], lty="dashed", col="blue")
-detach(venice)
+with(venice, matplot(year, y[,1:2], ylab="Sea level (cm)", col=1:2,
+ main="Highest 2 annual sealevels + fitted 95 percentile"))
+with(venice, lines(year, fitted(fit1)[,1], lty="dashed", col="blue"))
}
diff --git a/man/grc.Rd b/man/grc.Rd
index 42b8faf..13a81f4 100644
--- a/man/grc.Rd
+++ b/man/grc.Rd
@@ -18,8 +18,8 @@ grc(y, Rank = 1, Index.corner = 2:(1 + Rank),
Note that \code{y} must be at least 3 by 3.
}
\item{Rank}{
- An integer in the range
- {1,\ldots,\code{min(nrow(y), ncol(y))}}.
+ An integer from the set
+ \{1,\ldots,\code{min(nrow(y), ncol(y))}\}.
This is the dimension of the fit.
}
@@ -31,7 +31,7 @@ grc(y, Rank = 1, Index.corner = 2:(1 + Rank),
}
\item{Structural.zero}{
- An integer in the range {1,\ldots,\code{min(nrow(y), ncol(y))}},
+ An integer from the set \{1,\ldots,\code{min(nrow(y), ncol(y))}\},
specifying the row that is used as the structural zero.
}
\item{summary.arg}{
diff --git a/man/lirat.Rd b/man/lirat.Rd
index 1f5c95e..c84925e 100644
--- a/man/lirat.Rd
+++ b/man/lirat.Rd
@@ -57,11 +57,9 @@ are accounted for.
\examples{
\dontrun{
data(lirat)
-attach(lirat)
# cf. Figure 3 of Moore and Tsiatis (1991)
-plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
- xlab="Hemoglobin level", ylab="Proportion Dead")
-detach(lirat)
+with(lirat, plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
+ xlab="Hemoglobin level", ylab="Proportion Dead"))
}
}
\keyword{datasets}
diff --git a/man/lms.bcg.Rd b/man/lms.bcg.Rd
index 08ca629..ebd1491 100644
--- a/man/lms.bcg.Rd
+++ b/man/lms.bcg.Rd
@@ -7,11 +7,11 @@
to the gamma distribution.
}
\usage{
-lms.bcg(percentiles = c(25, 50, 75), zero = NULL,
- link.mu="identity", link.sigma = "loge",
- emu=list(), esigma=list(),
+lms.bcg(percentiles = c(25, 50, 75), zero = c(1,3),
+ llambda="identity", lmu="identity", lsigma = "loge",
+ elambda=list(), emu=list(), esigma=list(),
dfmu.init=4, dfsigma.init=2,
- init.lambda = 1, init.sigma = NULL)
+ ilambda = 1, isigma = NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -30,7 +30,11 @@ lms.bcg(percentiles = c(25, 50, 75), zero = NULL,
functions of the covariates.
}
- \item{link.mu}{
+ \item{llambda}{
+ Parameter link function applied to the first linear/additive predictor.
+
+ }
+ \item{lmu}{
Parameter link function applied to the second linear/additive predictor.
% The natural log is offered because mu
@@ -39,14 +43,14 @@ lms.bcg(percentiles = c(25, 50, 75), zero = NULL,
% (it is something similar to the running median).
}
- \item{link.sigma}{
+ \item{lsigma}{
Parameter link function applied to the third linear/additive predictor.
See \code{\link{Links}} for more choices.
% It is the natural log by default because sigma is positive.
}
- \item{emu, esigma}{
+ \item{elambda, emu, esigma}{
List. Extra argument for each of the links.
See \code{earg} in \code{\link{Links}} for general information.
@@ -65,12 +69,12 @@ lms.bcg(percentiles = c(25, 50, 75), zero = NULL,
using some other algorithm.
}
- \item{init.lambda}{
+ \item{ilambda}{
Initial value for lambda.
If necessary, it is recycled to be a vector of length \eqn{n}.
}
- \item{init.sigma}{
+ \item{isigma}{
Optional initial value for sigma.
If necessary, it is recycled to be a vector of length \eqn{n}.
The default value, \code{NULL}, means an initial value is computed
@@ -114,8 +118,8 @@ The LMS-Yeo-Johnson-normal method can handle
both positive and negative values.
In general, the lambda and sigma functions should be more smoother
-than the mean function. Often setting \code{zero=1} or
-\code{zero=3} or \code{zero=c(1,3)} is a good idea.
+than the mean function.
+Having \code{zero=1}, \code{zero=3} or \code{zero=c(1,3)} is often a good idea.
See the example below.
While it is usual to regress the response against a single
@@ -164,7 +168,7 @@ plotvgam(fit, se=TRUE) # Plot mu function (only)
# Difficult to get a model that converges
# Here, we prematurely stop iterations because it fails near the solution
fit = vgam(BMI ~ s(age, df=c(4,2)), maxit=4,
- fam=lms.bcg(zero=1, init.lam=3), data=bminz, tr=TRUE)
+ fam=lms.bcg(zero=1, ilam=3), data=bminz, tr=TRUE)
summary(fit)
predict(fit)[1:3,]
fitted(fit)[1:3,]
diff --git a/man/lms.bcn.Rd b/man/lms.bcn.Rd
index e5972b4..b5c48cc 100644
--- a/man/lms.bcn.Rd
+++ b/man/lms.bcn.Rd
@@ -7,11 +7,11 @@
to normality.
}
\usage{
-lms.bcn(percentiles = c(25, 50, 75), zero = NULL,
- link.mu="identity", link.sigma = "loge",
- emu=list(), esigma=list(),
+lms.bcn(percentiles = c(25, 50, 75), zero = c(1,3),
+ llambda="identity", lmu="identity", lsigma = "loge",
+ elambda=list(), emu=list(), esigma=list(),
dfmu.init=4, dfsigma.init=2,
- init.lambda = 1, init.sigma = NULL)
+ ilambda = 1, isigma = NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -30,7 +30,12 @@ lms.bcn(percentiles = c(25, 50, 75), zero = NULL,
functions of the covariates.
}
- \item{link.mu}{
+ \item{llambda}{
+ Parameter link function applied to the first linear/additive predictor.
+ See \code{\link{Links}} for more choices.
+
+ }
+ \item{lmu}{
Parameter link function applied to the second linear/additive predictor.
See \code{\link{Links}} for more choices.
@@ -39,14 +44,14 @@ lms.bcn(percentiles = c(25, 50, 75), zero = NULL,
% (it is something similar to the running median).
}
- \item{link.sigma}{
+ \item{lsigma}{
Parameter link function applied to the third linear/additive predictor.
See \code{\link{Links}} for more choices.
% It is the natural log by default because sigma is positive.
}
- \item{emu, esigma}{
+ \item{elambda, emu, esigma}{
List. Extra argument for each of the links.
See \code{earg} in \code{\link{Links}} for general information.
@@ -65,12 +70,12 @@ lms.bcn(percentiles = c(25, 50, 75), zero = NULL,
using some other algorithm.
}
- \item{init.lambda}{
+ \item{ilambda}{
Initial value for lambda.
If necessary, it is recycled to be a vector of length \eqn{n}.
}
- \item{init.sigma}{
+ \item{isigma}{
Optional initial value for sigma.
If necessary, it is recycled to be a vector of length \eqn{n}.
The default value, \code{NULL}, means an initial value is computed
@@ -115,8 +120,8 @@ The LMS-Yeo-Johnson-normal method can handle
both positive and negative values.
In general, the lambda and sigma functions should be more smoother
-than the mean function. Often setting \code{zero=1} or
-\code{zero=3} or \code{zero=c(1,3)} is a good idea.
+than the mean function.
+Having \code{zero=1}, \code{zero=3} or \code{zero=c(1,3)} is often a good idea.
See the example below.
While it is usual to regress the response against a single
diff --git a/man/lms.yjn.Rd b/man/lms.yjn.Rd
index 256e96c..ed63731 100644
--- a/man/lms.yjn.Rd
+++ b/man/lms.yjn.Rd
@@ -8,15 +8,15 @@
to normality.
}
\usage{
-lms.yjn(percentiles = c(25, 50, 75), zero = NULL,
- link.lambda = "identity", link.sigma = "loge", elambda=list(),
- esigma=list(), dfmu.init=4, dfsigma.init=2, init.lambda = 1,
- init.sigma = NULL, rule = c(10, 5), yoffset = NULL, diagW=FALSE,
+lms.yjn(percentiles = c(25, 50, 75), zero = c(1,3),
+ llambda = "identity", lsigma = "loge", elambda=list(),
+ esigma=list(), dfmu.init=4, dfsigma.init=2, ilambda = 1,
+ isigma = NULL, rule = c(10, 5), yoffset = NULL, diagW=FALSE,
iters.diagW=6)
-lms.yjn2(percentiles=c(25,50,75), zero=NULL,
- link.lambda="identity", link.mu = "identity", link.sigma="loge",
+lms.yjn2(percentiles=c(25,50,75), zero=c(1,3),
+ llambda="identity", lmu = "identity", lsigma="loge",
elambda=list(), emu = list(), esigma=list(), dfmu.init=4,
- dfsigma.init=2, init.lambda=1.0, init.sigma=NULL, yoffset=NULL,
+ dfsigma.init=2, ilambda=1.0, isigma=NULL, yoffset=NULL,
nsimEIM=250)
}
%- maybe also 'usage' for other objects documented here.
@@ -36,9 +36,9 @@ lms.yjn2(percentiles=c(25,50,75), zero=NULL,
functions of the covariates.
}
- \item{link.lambda, link.mu, link.sigma}{
+ \item{llambda, lmu, lsigma}{
Parameter link function applied to the first, second and third
- linear/additive predictor.
+ linear/additive predictors.
See \code{\link{Links}} for more choices.
}
@@ -60,12 +60,12 @@ lms.yjn2(percentiles=c(25,50,75), zero=NULL,
using some other algorithm.
}
- \item{init.lambda}{
+ \item{ilambda}{
Initial value for lambda.
If necessary, it is recycled to be a vector of length \eqn{n}.
}
- \item{init.sigma}{
+ \item{isigma}{
Optional initial value for sigma.
If necessary, it is recycled to be a vector of length \eqn{n}.
The default value, \code{NULL}, means an initial value is computed
@@ -158,8 +158,8 @@ methods only handle a positive response because the
Box-Cox transformation cannot handle negative values.
In general, the lambda and sigma functions should be more smoother
-than the mean function. Often setting \code{zero=1} or
-\code{zero=3} or \code{zero=c(1,3)} is a good idea.
+than the mean function.
+Having \code{zero=1}, \code{zero=3} or \code{zero=c(1,3)} is often a good idea.
See the example below.
While it is usual to regress the response against a single
@@ -213,10 +213,9 @@ a = deplot(fit, x0=20, y=ygrid, xlab="BMI", col="black",
a
a = deplot(fit, x0=42, y=ygrid, add=TRUE, llty=2, col="red")
a = deplot(fit, x0=55, y=ygrid, add=TRUE, llty=4, col="blue", Attach=TRUE)
-a at post$deplot # Contains density function values
+with(a at post, deplot) # Contains density function values; == a at post$deplot
}
}
\keyword{models}
\keyword{regression}
-%fit = vgam(BMI ~ s(age, df=c(2,4,2)), fam=lms.yjn, data=bminz, tr=TRUE)
diff --git a/man/logUC.Rd b/man/logUC.Rd
index 69ba67b..d439962 100644
--- a/man/logUC.Rd
+++ b/man/logUC.Rd
@@ -2,7 +2,7 @@
\alias{Log}
\alias{dlog}
\alias{plog}
-\alias{qlog}
+% \alias{qlog}
\alias{rlog}
\title{ Logarithmic Distribution }
\description{
@@ -13,7 +13,7 @@
}
\usage{
-dlog(x, prob)
+dlog(x, prob, log=FALSE)
plog(q, prob, log.p=FALSE)
% qlog(p, prob)
rlog(n, prob, Smallno=1.0e-6)
@@ -33,9 +33,10 @@ rlog(n, prob, Smallno=1.0e-6)
For \code{rlog()} this parameter must be of length 1.
}
- \item{log.p}{
+ \item{log, log.p}{
Logical.
- If \code{TRUE} then all probabilities \code{p} are given as \code{log(p)}.
+ If \code{log.p=TRUE} then all probabilities \code{p} are
+ given as \code{log(p)}.
}
\item{Smallno}{
@@ -67,6 +68,12 @@ New York: Wiley-Interscience, Third edition.
\note{
Given some response data, the \pkg{VGAM} family function
\code{\link{logff}} estimates the parameter \code{prob}.
+ For \code{plog()}, if argument \code{q} contains large values
+ and/or \code{q} is long in length
+ then the memory requirements may be very high.
+ Very large values in \code{q} are handled by an approximation by
+ Owen (1965).
+
}
\seealso{
diff --git a/man/logff.Rd b/man/logff.Rd
index 2ed98a3..79d74f7 100644
--- a/man/logff.Rd
+++ b/man/logff.Rd
@@ -3,7 +3,7 @@
%- Also NEED an '\alias' for EACH other topic documented here.
\title{ Logarithmic Distribution }
\description{
- Estimating the parameter of the logarithmic distribution.
+ Estimating the (single) parameter of the logarithmic distribution.
}
\usage{
logff(link = "logit", earg=list(), init.c = NULL)
@@ -68,6 +68,10 @@ contains further information and examples.
In the \pkg{VGAM} library, a link function with option
\code{\link{loge}} corresponds to this.
+ The logarithmic distribution is sometimes confused with the log-series
+ distribution. The latter was used by Fisher et al. for species abundance
+ data, and has two parameters.
+
}
\seealso{
diff --git a/man/loglinb2.Rd b/man/loglinb2.Rd
index 7eaadfd..28cc52d 100644
--- a/man/loglinb2.Rd
+++ b/man/loglinb2.Rd
@@ -84,15 +84,16 @@ temp = vglm(cbind(nBnW,nBW,BnW,BW) ~ age, binom2.or, coalminers)
counts = round(c(weights(temp, type="prior")) * temp at y)
# Create a n x 2 matrix response for loglinb2()
-fred = matrix(c(0,0, 0,1, 1,0, 1,1), 4, 2, byrow=TRUE)
-yy = kronecker(matrix(1, nrow(counts), 1), fred)
-wt = c(t(counts))
-age = rep(coalminers$age, rep(4, length(coalminers$age)))
-yy = yy[wt>0,]
-age = age[wt>0]
-wt = wt[wt>0]
+# bwmat = matrix(c(0,0, 0,1, 1,0, 1,1), 4, 2, byrow=TRUE)
+bwmat = cbind(bln=c(0,0,1,1), wheeze=c(0,1,0,1))
+matof1 = matrix(1, nrow(counts), 1)
+newminers = data.frame(bln = kronecker(matof1, bwmat[,1]),
+ wheeze = kronecker(matof1, bwmat[,2]),
+ wt = c(t(counts)),
+ age = with(coalminers, rep(age, rep(4, length(age)))))
+newminers = newminers[with(newminers, wt) > 0,]
-fit = vglm(yy ~ age, loglinb2, trace=TRUE, wei=wt)
+fit = vglm(cbind(bln,wheeze) ~ age, loglinb2, wei=wt, data=newminers)
coef(fit, mat=TRUE) # Same! (at least for the log odds-ratio)
summary(fit)
@@ -102,5 +103,3 @@ summary(fit)
\keyword{models}
\keyword{regression}
-%coalminers$age = (coalminers$age - 42) / 5
-%counts = round(temp at prior.weights * temp at y)
diff --git a/man/lqnorm.Rd b/man/lqnorm.Rd
index 407aa5f..90c3613 100644
--- a/man/lqnorm.Rd
+++ b/man/lqnorm.Rd
@@ -105,11 +105,11 @@ lqnorm(qpower=2, link="identity", earg=list(),
\examples{
set.seed(123)
-d = data.frame(x = sort(runif(n <- 100)))
+d = data.frame(x = sort(runif(n <- 10 )))
realfun = function(x) 4 + 5*x
d = transform(d, y = realfun(x) + rnorm(n, sd=exp(1)))
-d$y[1] = 4 * d$y[1] # Outlier
-d$x[1] = -1 # Outlier
+# Make the first observation an outlier
+d = transform(d, y = c(4*y[1], y[-1]), x=c(-1, x[-1]))
fit = vglm(y ~ x, fam = lqnorm(qpower=1.2), data=d)
coef(fit, matrix=TRUE)
fitted(fit)[1:4,]
diff --git a/man/lvplot.rrvglm.Rd b/man/lvplot.rrvglm.Rd
index 7407647..f48fad7 100644
--- a/man/lvplot.rrvglm.Rd
+++ b/man/lvplot.rrvglm.Rd
@@ -20,13 +20,13 @@ lvplot.rrvglm(object,
object at misc$predictors.names else paste("LP", 1:M, sep = ""),
Aadj = par()$adj, Acex = par()$cex, Acol = par()$col,
Apch = NULL,
- Clabels = dimnames(Cmat)[[1]], Cadj = par()$adj,
+ Clabels = rownames(Cmat), Cadj = par()$adj,
Ccex = par()$cex, Ccol = par()$col, Clty = par()$lty,
Clwd = par()$lwd,
chull.arg = FALSE, ccex = par()$cex, ccol = par()$col,
clty = par()$lty, clwd = par()$lwd,
spch = NULL, scex = par()$cex, scol = par()$col,
- slabels = dimnames(x2mat)[[1]], ...)
+ slabels = rownames(x2mat), ...)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
diff --git a/man/micmen.Rd b/man/micmen.Rd
index 7db602a..1a7aebe 100644
--- a/man/micmen.Rd
+++ b/man/micmen.Rd
@@ -54,8 +54,8 @@ micmen(rpar = 0.001, divisor = 10, init1 = NULL, init2 = NULL,
}
\details{
The Michaelis-Menten Model is given by
- \deqn{E(Y_i) = (\theta_1 x_i) / (\theta_2 + x_i)}{%
- E(Y_i) = theta1 * x_i / (theta2 + x_i)}
+ \deqn{E(Y_i) = (\theta_1 u_i) / (\theta_2 + u_i)}{%
+ E(Y_i) = theta1 * u_i / (theta2 + u_i)}
where \eqn{\theta_1}{theta1} and \eqn{\theta_2}{theta2}
are the two parameters.
@@ -92,11 +92,15 @@ micmen(rpar = 0.001, divisor = 10, init1 = NULL, init2 = NULL,
}
\author{ T. W. Yee }
\note{
- The regressor values \eqn{x_i}{x_i} are inputted as a vector in the
- \code{regressor} argument.
- To predict the response at new values of \eqn{x_i}{x_i} one must assign
- the \code{@extra$uvec} slot in the fitted object these values, e.g.,
- see the example below.
+ The regressor values \eqn{u_i}{u_i} are inputted as the RHS of
+ the \code{form2} argument.
+ It should just be a simple term; no smart prediction is used.
+ It should just a single vector so omit the intercept term.
+ The LHS is ignored.
+
+% To predict the response at new values of \eqn{u_i}{u_i} one must assign
+% the \code{@extra$uvec} slot in the fitted object these values, e.g.,
+% see the example below.
Numerical problems may occur. If so, try setting some initial values
for the parameters. In the future, several self-starting initial values
@@ -111,17 +115,17 @@ micmen(rpar = 0.001, divisor = 10, init1 = NULL, init2 = NULL,
\examples{
data(enzyme)
fit = vglm(velocity ~ 1, micmen, enzyme, trace=TRUE, crit="c",
- regressor=enzyme$conc)
+ form2 = ~ conc - 1)
\dontrun{
-attach(enzyme)
-plot(conc, velocity, xlab="concentration", las=1, main="Enzyme data")
-lines(conc, fitted(fit), col="blue") # Join up the fitted values
-detach(enzyme)
-
-# Predict the response at other concentrations and add it to the plot
-newdata = new=data.frame(concentration=seq(0, 2, len=200))
-fit at extra$uvec = newdata$concentration
-lines(newdata$conc, predict(fit, new=newdata, type="res"), col="red")
+with(enzyme, plot(conc, velocity, xlab="concentration", las=1,
+ main="Enzyme data", ylim=c(0,max(velocity)),
+ xlim=c(0,max(conc))))
+with(enzyme, points(conc, fitted(fit), col="blue", pch="+"))
+
+# This predicts the response at a finer grid:
+newenzyme = data.frame(conc = with(enzyme, seq(0, max(conc),len=200)))
+with(newenzyme, lines(conc, predict(fit, newenzyme, type="response"),
+ col="red"))
}
summary(fit)
}
diff --git a/man/mix2exp.Rd b/man/mix2exp.Rd
index 626c9aa..67431de 100644
--- a/man/mix2exp.Rd
+++ b/man/mix2exp.Rd
@@ -135,7 +135,7 @@ round(rbind('Estimated'=Coef(fit),
'Truth'=c(phi, lambda1, lambda2)), dig=2)
\dontrun{# Plot the results
-hist(y, prob=TRUE, main="red=estimate, blue=truth")
+hist(y, prob=TRUE, main="Red=estimate, blue=truth")
abline(v=1/Coef(fit)[c(2,3)], lty=2, col="red", lwd=2)
abline(v=1/c(lambda1, lambda2), lty=2, col="blue", lwd=2)
}
diff --git a/man/mix2normal1.Rd b/man/mix2normal1.Rd
index c1be543..10cd139 100644
--- a/man/mix2normal1.Rd
+++ b/man/mix2normal1.Rd
@@ -11,7 +11,7 @@
mix2normal1(lphi="logit", lmu="identity", lsd="loge",
ephi=list(), emu1=list(), emu2=list(), esd1=list(), esd2=list(),
iphi=0.5, imu1=NULL, imu2=NULL, isd1=NULL, isd2=NULL,
- qmu=c(0.2, 0.8), ESD=TRUE, nsimEIM=100, zero=1)
+ qmu=c(0.2, 0.8), equalsd=TRUE, nsimEIM=100, zero=1)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -33,7 +33,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
\item{ephi, emu1, emu2, esd1, esd2}{
List. Extra argument for each of the links.
See \code{earg} in \code{\link{Links}} for general information.
- If \code{ESD=TRUE} then \code{esd1} must equal \code{esd2}.
+ If \code{equalsd=TRUE} then \code{esd1} must equal \code{esd2}.
}
\item{iphi}{
@@ -63,7 +63,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
\code{\link[stats]{quantile}}.
}
- \item{ESD}{
+ \item{equalsd}{
Logical indicating whether the two standard deviations should be
constrained to be equal. If \code{TRUE} then the appropriate
constraint matrices will be used.
@@ -86,7 +86,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
}
}
\details{
- The probability function can be loosely written as
+ The probability density function can be loosely written as
\deqn{f(y) = \phi \, N(\mu_1,\sigma_1) + (1-\phi) \, N(\mu_2, \sigma_2)}{%
f(y) = phi * N(mu1, sd1) + (1-phi) * N(mu2, sd2)}
where \eqn{\phi}{phi} is the probability an observation belongs
@@ -100,7 +100,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
By default, the five linear/additive predictors are
\eqn{(logit(\phi), \mu_1, \log(\sigma_1), \mu_2, \log(\sigma_2))^T}{(logit(phi),
mu1, log(sd1), mu2, log(sd2))^T}.
- If \code{ESD=TRUE} then \eqn{\sigma_1 = \sigma_2}{sd1=sd2} is enforced.
+ If \code{equalsd=TRUE} then \eqn{\sigma_1 = \sigma_2}{sd1=sd2} is enforced.
}
\value{
@@ -156,7 +156,7 @@ London: Chapman & Hall.
distributions are not well separated.
The default control argument \code{trace=TRUE} is to encourage
monitoring convergence.
- Having \code{ESD=TRUE} often makes the overall optimization problem
+ Having \code{equalsd=TRUE} often makes the overall optimization problem
easier.
}
@@ -176,7 +176,7 @@ sd1 = sd2 = exp(3)
(phi = logit(-1, inverse=TRUE))
y = ifelse(runif(n) < phi, rnorm(n, mu1, sd1), rnorm(n, mu2, sd2))
-fit = vglm(y ~ 1, mix2normal1(ESD=TRUE))
+fit = vglm(y ~ 1, mix2normal1(equalsd=TRUE))
# Compare the results
cf = coef(fit)
@@ -186,7 +186,7 @@ round(rbind('Estimated'=c(logit(cf[1], inv=TRUE),
\dontrun{# Plot the results
xx = seq(min(y), max(y), len=200)
plot(xx, (1-phi)*dnorm(xx, mu2, sd2), type="l", xlab="y",
- main="Red=estimate, blue=truth", col="blue")
+ main="Red=estimate, blue=truth", col="blue", ylab="Density")
phi.est = logit(coef(fit)[1], inverse=TRUE)
sd.est = exp(coef(fit)[3])
lines(xx, phi*dnorm(xx, mu1, sd1), col="blue")
diff --git a/man/mix2poisson.Rd b/man/mix2poisson.Rd
index 473f2f3..7c4d95c 100644
--- a/man/mix2poisson.Rd
+++ b/man/mix2poisson.Rd
@@ -139,7 +139,8 @@ round(rbind('Estimated'=Coef(fit), 'Truth'=c(phi, mu1, mu2)), dig=2)
\dontrun{# Plot the results
ty = table(y)
-plot(names(ty), ty, type="h", main="Red=estimate, blue=truth")
+plot(names(ty), ty, type="h", main="Red=estimate, blue=truth",
+ ylab="Frequency", xlab="y")
abline(v=Coef(fit)[-1], lty=2, col="red", lwd=2)
abline(v=c(mu1, mu2), lty=2, col="blue", lwd=2)
}
diff --git a/man/model.matrixvlm.Rd b/man/model.matrixvlm.Rd
index ed4c748..8e5703c 100644
--- a/man/model.matrixvlm.Rd
+++ b/man/model.matrixvlm.Rd
@@ -2,13 +2,19 @@
\alias{model.matrixvlm}
\title{Construct the Design Matrix of a VLM Object}
\usage{
-model.matrixvlm(object, type=c("vlm","lm"), \dots)
+model.matrixvlm(object, type=c("vlm","lm","lm2"), \dots)
}
\arguments{
\item{object}{an object of a class that inherits from the
\emph{vector linear model} (VLM).
}
\item{type}{Type of design matrix returned. The first is the default.
+ The value \code{"vlm"} is the VLM model matrix corresponding
+ to the \code{formula} argument.
+ The value \code{"lm"} is the LM model matrix corresponding
+ to the \code{formula} argument.
+ The value \code{"lm2"} is the second (LM) model matrix corresponding
+ to the \code{form2} argument.
}
\item{\dots}{further arguments passed to or from other methods.
These include \code{data} (which
diff --git a/man/multinomial.Rd b/man/multinomial.Rd
index 0bfaa07..a14b703 100644
--- a/man/multinomial.Rd
+++ b/man/multinomial.Rd
@@ -6,7 +6,8 @@
Fits a multinomial logit model to an unordered factor response.
}
\usage{
-multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
+multinomial(zero = NULL, parallel = FALSE, nointercept = NULL,
+ refLevel = "last")
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -32,9 +33,22 @@ multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
The values must be from the set \{1,2,\ldots,\eqn{M}\}.
}
+ \item{refLevel}{
+ Either a single positive integer or a value of a factor.
+ If an integer then it specifies which
+ column of the response matrix is the reference or baseline level.
+ The default is the last one (the \eqn{(M+1)}th one).
+ If used, this argument will be often assigned the value \code{1}.
+ If inputted as a value of a factor then beware of missing values
+ of certain levels of the factor
+ (\code{drop.unused.levels=TRUE} or
+ \code{drop.unused.levels=FALSE}).
+ See the example below.
+
+ }
}
\details{
- The model can be written
+ The default model can be written
\deqn{\eta_j = \log(P[Y=j]/ P[Y=M+1])}{%
eta_j = log(P[Y=j]/ P[Y=M+1])}
where \eqn{\eta_j}{eta_j} is the \eqn{j}th linear/additive predictor.
@@ -42,6 +56,8 @@ multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
definition. That is, the last level of the factor, or last column of
the response matrix, is taken as the reference level or baseline---this
is for identifiability of the parameters.
+ The reference or baseline level can be chosen by using the
+ \code{refLevel} argument.
In almost all the literature, the constraint matrices associated
with this family of models are known. For example, setting
@@ -59,6 +75,7 @@ multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
The object is used by modelling functions such as \code{\link{vglm}},
\code{\link{rrvglm}}
and \code{\link{vgam}}.
+
}
\references{
Yee, T. W. and Hastie, T. J. (2003)
@@ -156,6 +173,7 @@ contains further information and examples.
\code{\link{rrvglm}},
\code{\link[stats:Multinom]{Multinomial}},
\code{\link[base]{iris}}.
+
}
% \code{\link[base:Multinom]{rmultinom}}
@@ -177,7 +195,12 @@ weights(fit, type="prior", matrix=FALSE) # The better method
fit at y # Sample proportions
constraints(fit) # Constraint matrices
-# Example 2b: Different input to Example 2a but same result
+# Example 2b: Different reference level used as the baseline
+fit2 = vglm(y ~ 1, multinomial(refLevel=2))
+coef(fit2, matrix=TRUE)
+coef(fit , matrix=TRUE) # Easy to reconcile this output with fit2
+
+# Example 2c: Different input to Example 2a but same result
w = apply(y, 1, sum) # Prior weights
yprop = y / w # Sample proportions
fitprop = vglm(yprop ~ 1, multinomial, weights=w)
@@ -186,19 +209,29 @@ weights(fitprop, type="prior", matrix=FALSE)
fitprop at y # Same as the input
-# Example 3: Fit a rank-1 stereotype model
+# Example 3: The response is a factor.
+nn = 10
+yfactor = gl(3, nn, labels = c("Control", "Treatment1", "Treatment2"))
+x = runif(3 * nn)
+fit3a = vglm(yfactor ~ x, multinomial(refLevel=yfactor[12]))
+fit3b = vglm(yfactor ~ x, multinomial(refLevel=2))
+coef(fit3a, matrix=TRUE) # "Treatment1" is the reference level
+coef(fit3b, matrix=TRUE) # "Treatment1" is the reference level
+
+
+# Example 4: Fit a rank-1 stereotype model
data(car.all)
-fit = rrvglm(Country ~ Width + Height + HP, multinomial, car.all, Rank=1)
-coef(fit) # Contains the C matrix
-constraints(fit)$HP # The A matrix
-coef(fit, matrix=TRUE) # The B matrix
-Coef(fit)@C # The C matrix
-ccoef(fit) # Better to get the C matrix this way
-Coef(fit)@A # The A matrix
-svd(coef(fit, matrix=TRUE)[-1,])$d # This has rank 1; = C %*% t(A)
+fit4 = rrvglm(Country ~ Width + Height + HP, multinomial, car.all, Rank=1)
+coef(fit4) # Contains the C matrix
+constraints(fit4)$HP # The A matrix
+coef(fit4, matrix=TRUE) # The B matrix
+Coef(fit4)@C # The C matrix
+ccoef(fit4) # Better to get the C matrix this way
+Coef(fit4)@A # The A matrix
+svd(coef(fit4, matrix=TRUE)[-1,])$d # This has rank 1; = C %*% t(A)
-# Example 4: The use of the xij argument (conditional logit model)
+# Example 5: The use of the xij argument (conditional logit model)
set.seed(111)
n = 100 # Number of people who travel to work
M = 3 # There are M+1 models of transport
diff --git a/man/negbinomial.Rd b/man/negbinomial.Rd
index 7f9764b..8a44eba 100644
--- a/man/negbinomial.Rd
+++ b/man/negbinomial.Rd
@@ -9,7 +9,8 @@
\usage{
negbinomial(lmu = "loge", lk = "loge",
emu =list(), ek=list(),
- ik = NULL, cutoff = 0.995, Maxiter=5000,
+ ik = NULL, nsimEIM=100,
+ cutoff = 0.995, Maxiter=5000,
deviance.arg = FALSE, method.init=1,
shrinkage.init=0.95, zero = -2)
}
@@ -36,11 +37,20 @@ negbinomial(lmu = "loge", lk = "loge",
the \code{iKvector} argument of \code{\link{qrrvglm.control}} instead.
}
+ \item{nsimEIM}{
+ This argument is used
+ for computing the diagonal element of the
+ \emph{expected information matrix} (EIM) corresponding to \eqn{k}.
+ See \code{\link{CommonVGAMffArguments}} for more information
+ and the note below.
+
+ }
\item{cutoff}{
+ Used in the finite series approximation.
A numeric which is close to 1 but never exactly 1.
Used to specify how many terms of the infinite series
- for computing the second diagonal element of the expected information
- matrix are actually used.
+ for computing the second diagonal element of the
+ EIM are actually used.
The sum of the probabilites are added until they reach this value or more
(but no more than \code{Maxiter} terms allowed).
It is like specifying \code{p} in an imaginary function
@@ -48,8 +58,9 @@ negbinomial(lmu = "loge", lk = "loge",
}
\item{Maxiter}{
+ Used in the finite series approximation.
Integer. The maximum number of terms allowed when computing
- the second diagonal element of the expected information matrix.
+ the second diagonal element of the EIM.
In theory, the value involves an infinite series.
If this argument is too small then the value may be inaccurate.
@@ -78,6 +89,7 @@ negbinomial(lmu = "loge", lk = "loge",
a value of 0 means the individual response values are used,
and a value of 1 means the median or mean is used.
This argument is used in conjunction with \code{method.init}.
+ If convergence failure occurs try setting this argument to 1.
}
\item{zero}{
@@ -91,6 +103,7 @@ negbinomial(lmu = "loge", lk = "loge",
are intercept-only.
}
+
}
\details{
The negative binomial distribution can be motivated in several ways,
@@ -122,12 +135,13 @@ negbinomial(lmu = "loge", lk = "loge",
MASS library). This \pkg{VGAM} family function \code{negbinomial} treats
both parameters on the same footing, and estimates them both by full
maximum likelihood estimation.
+ Simulated Fisher scoring is employed as the default
+ (see the \code{nsimEIM} argument).
- The parameters \eqn{\mu}{mu} and \eqn{k} are independent (diagonal
- expected information matrix), and the
- confidence region for \eqn{k} is extremely skewed so that its standard
- error is often of no practical use. The parameter \eqn{1/k} has been
- used as a measure of aggregation.
+ The parameters \eqn{\mu}{mu} and \eqn{k} are independent (diagonal EIM),
+ and the confidence region for \eqn{k} is extremely skewed so that its
+ standard error is often of no practical use. The parameter \eqn{1/k}
+ has been used as a measure of aggregation.
This \pkg{VGAM} function handles \emph{multivariate} responses, so
that a matrix can be used as the response. The number of columns is the
@@ -163,6 +177,10 @@ Negative binomial and mixed Poisson regression.
\emph{The Canadian Journal of Statistics}
\bold{15}, 209--225.
+Hilbe, J. M. (2007)
+\emph{Negative Binomial Regression}.
+Cambridge: Cambridge University Press.
+
Bliss, C. and Fisher, R. A. (1953)
Fitting the negative binomial distribution to biological data.
\emph{Biometrics}
@@ -175,6 +193,32 @@ Fitting the negative binomial distribution to biological data.
% negative binomial distribution. Currently, none of these others work
% very well.
+ Suppose the response is called \code{ymat}.
+ The diagonal element of the \emph{expected information matrix}
+ (EIM) for parameter \eqn{k}
+ involves an infinite series; consequently simulated Fisher scoring
+ (see \code{nsimEIM}) is the default. This algorithm should definitely be
+ used if \code{max(ymat)} is large, e.g., \code{max(ymat) > 300} or there
+ are any outliers in \code{ymat}.
+ A second algorithm involving a finite series approximation can be
+ invoked by setting \code{nsimEIM = NULL}.
+ Then the arguments
+ \code{Maxiter} and
+ \code{cutoff} are pertinent.
+
+ Regardless of the algorithm used,
+ convergence problems may occur, especially when the response has large
+ outliers or is large in magnitude.
+ If convergence failure occurs, try using arguments
+ (in recommended decreasing order)
+ \code{nsimEIM},
+ \code{shrinkage.init},
+ \code{method.init},
+ \code{Maxiter},
+ \code{cutoff},
+ \code{ik},
+ \code{zero}.
+
This function can be used by the fast algorithm in
\code{\link{cqo}}, however, setting \code{EqualTolerances=TRUE} and
\code{ITolerances=FALSE} is recommended.
@@ -208,20 +252,27 @@ Fitting the negative binomial distribution to biological data.
\code{\link{nbolf}}.
}
\examples{
-y = 0:7 # Example 1: apple tree data
+# Example 1: apple tree data
+y = 0:7
w = c(70, 38, 17, 10, 9, 3, 2, 1)
fit = vglm(y ~ 1, negbinomial, weights=w)
summary(fit)
coef(fit, matrix=TRUE)
Coef(fit)
-\dontrun{
-x = runif(n <- 500) # Example 2: simulated data with multivariate response
+# Example 2: simulated data with multivariate response
+x = runif(n <- 500)
y1 = rnbinom(n, mu=exp(3+x), size=exp(1)) # k is size
y2 = rnbinom(n, mu=exp(2-x), size=exp(0))
fit = vglm(cbind(y1,y2) ~ x, negbinomial, trace=TRUE)
coef(fit, matrix=TRUE)
-}
+
+# Example 3: large counts so definitely use the nsimEIM argument
+x = runif(n <- 500)
+y = rnbinom(n, mu=exp(12+x), size=exp(1)) # k is size
+range(y) # Large counts
+fit = vglm(y ~ x, negbinomial(nsimEIM=100), trace=TRUE)
+coef(fit, matrix=TRUE)
}
\keyword{models}
\keyword{regression}
diff --git a/man/normal1.Rd b/man/normal1.Rd
index af7ac28..196e16b 100644
--- a/man/normal1.Rd
+++ b/man/normal1.Rd
@@ -73,7 +73,7 @@ New York: Wiley-Interscience, Third edition.
\code{\link{skewnormal1}},
\code{\link{dcnormal1}},
\code{\link{studentt}},
- \code{\link[stats]{dnorm}}.
+ \code{\link[stats:Normal]{dnorm}}.
}
\examples{
diff --git a/man/notdocumentedyet.Rd b/man/notdocumentedyet.Rd
index fc90ea7..af8e6e9 100644
--- a/man/notdocumentedyet.Rd
+++ b/man/notdocumentedyet.Rd
@@ -2,9 +2,11 @@
\alias{notdocumentedyet}
\alias{A1A2A3}
\alias{AAaa.nohw}
-%\alias{AIC.qrrgvlm}
+%\alias{AIC}
+%\alias{AIC.qrrvglm}
%\alias{AIC.rrvglm}
%\alias{AIC.vgam}
+%\alias{AIC.vglm}
%\alias{AIC.vlm}
% \alias{Build.terms}
% \alias{Build.terms.vlm}
@@ -31,6 +33,7 @@
\alias{add1.vgam}
\alias{add1.vglm}
% \alias{adjust.Dmat.expression}
+\alias{alaplace1.control}
% \alias{alias.vgam}
% \alias{alias.vglm}
\alias{anova.vgam}
diff --git a/man/nzc.Rd b/man/nzc.Rd
index a062155..a1165f5 100644
--- a/man/nzc.Rd
+++ b/man/nzc.Rd
@@ -30,18 +30,15 @@
\examples{
\dontrun{
data(nzc)
-attach(nzc)
-plot(year, female/(male+female), type="b", ylab="Proportion",
- main="Proportion of Chinese that are female",
- col="blue", las=1)
+with(nzc, plot(year, female/(male+female), type="b", ylab="Proportion",
+ main="Proportion of NZ Chinese that are female",
+ col="blue", las=1))
abline(h=0.5, lty="dashed")
-plot(year, 100*(male+female)/nz, type="b", ylab="Percent",
- ylim=c(0, max(100*(male+female)/nz)), col="blue",
- main="Percent of New Zealanders that are Chinese", las=1)
+with(nzc, plot(year, 100*(male+female)/nz, type="b", ylab="Percent",
+ ylim=c(0, max(100*(male+female)/nz)), col="blue", las=1,
+ main="Percent of NZers that are Chinese"))
abline(h=0, lty="dashed")
-
-detach(nzc)
}
}
\keyword{datasets}
diff --git a/man/persp.qrrvglm.Rd b/man/persp.qrrvglm.Rd
index 166dae5..7c6f30d 100644
--- a/man/persp.qrrvglm.Rd
+++ b/man/persp.qrrvglm.Rd
@@ -16,7 +16,9 @@ persp.qrrvglm(x, varlvI = FALSE, reference = NULL, plot.it = TRUE,
ylab = if(Rank==1) "Expected Value" else "Latent Variable 2",
zlab = "Expected value", labelSpecies = FALSE,
stretch = 1.05, main="", ticktype = "detailed",
- col = if(Rank==1) par()$col else "white", add1 = FALSE, ...)
+ col = if(Rank==1) par()$col else "white",
+ llty=par()$lty, llwd=par()$lwd,
+ add1 = FALSE, ...)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -97,6 +99,14 @@ persp.qrrvglm(x, varlvI = FALSE, reference = NULL, plot.it = TRUE,
See \code{\link[graphics]{persp}} for more information.
}
+ \item{llty}{ Line type.
+ Rank-1 models only.
+ See the \code{lty} argument of \code{\link[graphics]{par}}.
+ }
+ \item{llwd}{ Line width.
+ Rank-1 models only.
+ See the \code{lwd} argument of \code{\link[graphics]{par}}.
+ }
\item{add1}{ Logical. Add to an existing plot?
Used only for rank-1 models.
diff --git a/man/plotvgam.control.Rd b/man/plotvgam.control.Rd
index ffbb1d7..42999cf 100644
--- a/man/plotvgam.control.Rd
+++ b/man/plotvgam.control.Rd
@@ -14,7 +14,7 @@ plotvgam.control(which.cf = NULL,
lcol = par()$col, rcol = par()$col,
scol = par()$col, llwd = par()$lwd, slwd = par()$lwd,
add.arg = FALSE, one.at.a.time = FALSE,
- .include.dots = TRUE, ...)
+ .include.dots = TRUE, noxmean= FALSE, ...)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -44,12 +44,21 @@ plotvgam.control(which.cf = NULL,
Fed into \code{par(lwd)}. }
\item{slwd}{ Line width of the standard error bands.
Fed into \code{par(lwd)}. }
- \item{add.arg}{ Logical. If \code{TRUE}, the plot will be added
+ \item{add.arg}{ Logical. If \code{TRUE} then the plot will be added
to an existing plot, otherwise a new plot will be made. }
- \item{one.at.a.time}{ Logical. If \code{TRUE}, the plots are done
+ \item{one.at.a.time}{ Logical. If \code{TRUE} then the plots are done
one at a time, with the user having to hit the return key
between the plots. }
\item{.include.dots}{ Not to be used by the user. }
+ \item{noxmean}{
+ Logical. If \code{TRUE} then the point at the mean of \eqn{x},
+ which is added when
+ standard errors are specified and
+ it thinks the function is linear,
+ is not added.
+ One might use this argument if \code{ylab} is specified.
+
+ }
\item{\dots}{ Other arguments that may be fed into \code{par()}. }
In the above, \eqn{M} is the number of linear/additive predictors.
}
diff --git a/man/poissonff.Rd b/man/poissonff.Rd
index 9208ccc..89f24c3 100644
--- a/man/poissonff.Rd
+++ b/man/poissonff.Rd
@@ -10,8 +10,8 @@
}
\usage{
-poissonff(link = "loge", earg=list(), dispersion = 1,
- onedpar = FALSE, parallel = FALSE, zero = NULL)
+poissonff(link = "loge", earg=list(), dispersion = 1, onedpar = FALSE,
+ imu=NULL, method.init=1, parallel = FALSE, zero = NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -46,6 +46,10 @@ poissonff(link = "loge", earg=list(), dispersion = 1,
A logical or formula. Used only if the response is a matrix.
}
+ \item{imu, method.init}{
+ See \code{\link{CommonVGAMffArguments}} for more information.
+
+ }
\item{zero}{
An integer-valued vector specifying which linear/additive predictors
are modelled as intercepts only. The values must be from the set
@@ -135,8 +139,13 @@ poissonff(link = "loge", earg=list(), dispersion = 1,
\examples{
poissonff()
-n = 100
-x2 = rnorm(n)
+x = rnorm(n <- 100)
+y = rpois(n, exp(1+x))
+(fit = vglm(y ~ x, family=poissonff))
+coef(fit, matrix=TRUE)
+
+
+x2 = rnorm(n <- 100)
x3 = rnorm(n)
x4 = rnorm(n)
lv1 = 0 + x3 - 2*x4
diff --git a/man/posbinomUC.Rd b/man/posbinomUC.Rd
index e6a0846..6af3e1f 100644
--- a/man/posbinomUC.Rd
+++ b/man/posbinomUC.Rd
@@ -54,9 +54,12 @@ rposbinom(n, size, prob)
\author{ T. W. Yee }
\note{
- For \code{rposbinom}, the arguments of the function are fed into
+ For \code{dposbinom()}, if arguments \code{size} or \code{prob}
+ equal 0 then a \code{NaN} is returned.
+
+ For \code{rposbinom()}, the arguments of the function are fed into
\code{\link[stats:Binomial]{rbinom}} until \eqn{n} positive values
- are obtained. This may take a long time if \code{prob} has values
+ are obtained. This may take a long time if \code{prob} has values
close to 0.
The family function \code{\link{posbinomial}} estimates the parameters
diff --git a/man/posnegbinUC.Rd b/man/posnegbinUC.Rd
new file mode 100644
index 0000000..1179d33
--- /dev/null
+++ b/man/posnegbinUC.Rd
@@ -0,0 +1,118 @@
+\name{Posnegbin}
+\alias{Posnegbin}
+\alias{dposnegbin}
+\alias{pposnegbin}
+\alias{qposnegbin}
+\alias{rposnegbin}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Positive-Negative Binomial Distribution }
+\description{
+ Density, distribution function, quantile function and random generation
+ for the positive-negative binomial distribution.
+
+}
+\usage{
+dposnegbin(x, size, prob=NULL, munb=NULL, log=FALSE)
+pposnegbin(q, size, prob=NULL, munb=NULL)
+qposnegbin(p, size, prob=NULL, munb=NULL)
+rposnegbin(n, size, prob=NULL, munb=NULL)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{x, q}{vector of quantiles.}
+ \item{p}{vector of probabilities.}
+ \item{n}{
+ number of random values to return.
+
+ }
+ \item{size, prob, munb, log}{
+ Same arguments as that of an ordinary negative binomial distribution
+ (see \code{\link[stats:NegBinomial]{dnbinom}}).
+ Some arguments have been renamed slightly.
+
+% This is called \eqn{\theta}{theta} in the \code{\link[MASS]{rnegbin}}
+% function in the \code{MASS} library.
+
+ Short vectors are recycled.
+ The parameter \code{1/size} is known as a dispersion parameter;
+ as \code{size} approaches infinity, the negative binomial distribution
+ approaches a Poisson distribution.
+
+ }
+}
+\details{
+ The positive-negative binomial distribution is a negative binomial
+ distribution but with the probability of a zero being zero.
+ The other probabilities are scaled to add to unity.
+ The mean therefore is
+ \deqn{\mu / (1-p(0))}{%
+ munb / (1-p(0))}
+ where \eqn{\mu}{munb} the mean of an ordinary negative binomial distribution.
+ The arguments of
+ \code{rposnegbin()}
+ are fed into
+ \code{\link[stats:NegBinomial]{rnbinom}} until \eqn{n} positive values
+ are obtained.
+
+}
+\value{
+ \code{dposnegbin} gives the density,
+ \code{pposnegbin} gives the distribution function,
+ \code{qposnegbin} gives the quantile function, and
+ \code{rposnegbin} generates \eqn{n} random deviates.
+
+}
+\references{
+Welsh, A. H., Cunningham, R. B., Donnelly, C. F. and Lindenmayer,
+D. B. (1996)
+Modelling the abundances of rare species: statistical models
+for counts with extra zeros.
+\emph{Ecological Modelling},
+\bold{88},
+297--308.
+
+}
+\author{ T. W. Yee }
+\note{
+ The running time
+ of \code{rposnegbin()}
+ is slow when \code{munb} is very close to zero.
+
+}
+
+\seealso{
+ \code{\link{posnegbinomial}},
+ \code{\link[stats:NegBinomial]{rnbinom}},
+ \code{\link{zanegbinomial}}.
+
+% \code{\link[MASS]{rnegbin}},
+
+}
+\examples{
+munb = 5; size = 4; n = 1000
+table(y <- rposnegbin(n, munb=munb, size=size))
+mean(y) # sample mean
+munb / (1 - (size/(size+munb))^size) # population mean
+munb / pnbinom(0, mu=munb, size=size, lower.tail=FALSE) # same as before
+
+x <- (-1):17
+(ii = dposnegbin(x, munb=munb, size=size))
+max(abs(cumsum(ii) - pposnegbin(x, munb=munb, size=size))) # Should be 0
+
+\dontrun{
+x = 0:10
+barplot(rbind(dposnegbin(x, munb=munb, size=size), dnbinom(x, mu=munb, size=size)),
+ beside = TRUE, col = c("blue","green"),
+ main=paste("dposnegbin(munb=", munb, ", size=", size, ") (blue) vs",
+ " dnbinom(mu=", munb, ", size=", size, ") (green)", sep=""),
+ names.arg = as.character(x))
+}
+
+# Another test for pposnegbin()
+nn = 5000
+mytab = cumsum(table(rposnegbin(nn, munb=munb, size=size))) / nn
+myans = pposnegbin(sort(as.numeric(names(mytab))), munb=munb, size=size)
+max(abs(mytab - myans)) # Should be 0
+}
+\keyword{distribution}
+
diff --git a/man/posnegbinomial.Rd b/man/posnegbinomial.Rd
index c185169..221f1df 100644
--- a/man/posnegbinomial.Rd
+++ b/man/posnegbinomial.Rd
@@ -9,8 +9,8 @@
}
\usage{
posnegbinomial(lmunb = "loge", lk = "loge",
- emunb =list(), ek = list(), ik = NULL,
- zero = -2, cutoff = 0.995, method.init=1)
+ emunb =list(), ek = list(), ik = NULL, zero = -2,
+ cutoff = 0.995, shrinkage.init=0.95, method.init=1)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -61,7 +61,7 @@ posnegbinomial(lmunb = "loge", lk = "loge",
\code{qnegbin(p)}.
}
- \item{method.init}{
+ \item{shrinkage.init, method.init}{
See \code{\link{negbinomial}}.
}
@@ -128,35 +128,26 @@ Generalized additive modelling and zero inflated count data.
}
\examples{
-\dontrun{
x = runif(nn <- 2000)
-y1 = rnbinom(nn, mu=exp(0+2*x), size=exp(1)) # k is size in rnbinom()
-y2 = rnbinom(nn, mu=exp(1+2*x), size=exp(3))
-fit = vglm(cbind(y1,y2) ~ 1, posnegbinomial, subset=(y1>0)&(y2>1),
- trace=TRUE)
+y1 = rposnegbin(nn, munb=exp(0+2*x), size=exp(1))
+y2 = rposnegbin(nn, munb=exp(1+2*x), size=exp(3))
+fit = vglm(cbind(y1,y2) ~ x, posnegbinomial, trace=TRUE)
coef(fit, matrix=TRUE)
dim(fit at y)
-fitted(fit)[1:5,]
-predict(fit)[1:5,]
# Another artificial data example
-munb = exp(2); k = exp(3); n = 1000
-y = rposnegbin(n, munb=munb, k=k)
+munb = exp(2); size = k = exp(3); nn = 1000
+y = rposnegbin(nn, munb=munb, size=size)
table(y)
fit = vglm(y ~ 1, posnegbinomial, trace=TRUE)
coef(fit, matrix=TRUE)
mean(y) # Sample mean
-munb / (1 - (k/(k+munb))^k) # Population mean
-fitted(fit)[1:5,]
-predict(fit)[1:5,]
-}
+munb / (1 - (size/(size+munb))^size) # Population mean
+fitted(fit)[1:3,]
+predict(fit)[1:3,]
}
\keyword{models}
\keyword{regression}
-%library(MASS)
-%detach() # detach MASS
-%y1 = rnegbin(nn, mu=exp(0+2*x), theta=exp(1)) # k is theta in rnegbin()
-%y2 = rnegbin(nn, mu=exp(1+2*x), theta=exp(3))
diff --git a/man/posnormUC.Rd b/man/posnormUC.Rd
index ca5f1a3..fea7122 100644
--- a/man/posnormUC.Rd
+++ b/man/posnormUC.Rd
@@ -11,7 +11,7 @@
}
\usage{
-dposnorm(x, mean=0, sd=1)
+dposnorm(x, mean=0, sd=1, log=FALSE)
pposnorm(q, mean=0, sd=1)
qposnorm(p, mean=0, sd=1)
rposnorm(n, mean=0, sd=1)
@@ -21,7 +21,7 @@ rposnorm(n, mean=0, sd=1)
\item{p}{vector of probabilities.}
\item{n}{number of observations.
Must be a positive integer of length 1.}
- \item{mean, sd}{ see \code{\link[stats]{rnorm}}. }
+ \item{mean, sd, log}{ see \code{\link[stats:Normal]{rnorm}}. }
}
\value{
\code{dposnorm} gives the density,
@@ -34,12 +34,14 @@ rposnorm(n, mean=0, sd=1)
See \code{\link{posnormal1}}, the \pkg{VGAM} family function
for estimating the parameters,
for the formula of the probability density function and other details.
+
}
-\note{
- \code{rposnorm()} may run very slowly if the mean is very negative.
-}
+%\note{
+
+%}
\seealso{
\code{\link{posnormal1}}.
+
}
\examples{
\dontrun{
@@ -56,7 +58,7 @@ Q = qposnorm(probs, m=m)
lines(Q, dposnorm(Q, m=m), col="purple", lty=3, type="h")
lines(Q, pposnorm(Q, m=m), col="purple", lty=3, type="h")
abline(h=probs, col="purple", lty=3)
-pposnorm(Q, m=m) - probs # Should be all 0
+max(abs(pposnorm(Q, m=m) - probs)) # Should be 0
}
}
\keyword{distribution}
diff --git a/man/posnormal1.Rd b/man/posnormal1.Rd
index 23d364d..9879c63 100644
--- a/man/posnormal1.Rd
+++ b/man/posnormal1.Rd
@@ -8,7 +8,7 @@
\usage{
posnormal1(lmean="identity", lsd="loge",
emean=list(), esd=list(),
- imean=NULL, isd=NULL, zero=NULL)
+ imean=NULL, isd=NULL, nsimEIM = 100, zero=NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -29,6 +29,10 @@ posnormal1(lmean="identity", lsd="loge",
A \code{NULL} means a value is computed internally.
}
+ \item{nsimEIM}{
+ See \code{\link{CommonVGAMffArguments}} for more information.
+
+ }
\item{zero}{
An integer-valued vector specifying which
linear/additive predictors are modelled as intercepts only.
@@ -51,13 +55,13 @@ posnormal1(lmean="identity", lsd="loge",
f(y) = (1/(sqrt(2*pi)*sigma)) * exp( -0.5 * (y-mu)^2/ sigma^2) /
[1-Phi(-mu/ sigma)] }
where \eqn{\Phi()}{Phi} is the cumulative distribution function of a
- standard normal (\code{\link[stats]{pnorm}}).
+ standard normal (\code{\link[stats:Normal]{pnorm}}).
Equivalently, this is
\deqn{f(y) = \frac{1}{\sigma} \frac{\phi((y-\mu) / \sigma)}{
1-\Phi(-\mu/ \sigma)}.}{%
f(y) = (1/sigma) * dnorm((y-mu)/sigma) / [1-pnorm(-mu/ sigma)].}
where \eqn{\phi()}{dnorm()} is the probability density function of a
- standard normal distribution (\code{\link[stats]{dnorm}}).
+ standard normal distribution (\code{\link[stats:Normal]{dnorm}}).
The mean of \eqn{Y} is
\deqn{E(Y) = \mu + \sigma \frac{\phi(-\mu/ \sigma)}{
diff --git a/man/pospoisUC.Rd b/man/pospoisUC.Rd
index 804f864..62f3c7d 100644
--- a/man/pospoisUC.Rd
+++ b/man/pospoisUC.Rd
@@ -12,7 +12,7 @@
}
\usage{
-dpospois(x, lambda)
+dpospois(x, lambda, log=FALSE)
ppospois(q, lambda)
qpospois(p, lambda)
rpospois(n, lambda)
@@ -24,6 +24,8 @@ rpospois(n, lambda)
\item{n}{number of observations. Must be a single positive integer. }
\item{lambda}{ vector of positive means (of an ordinary Poisson distribution).
Short vectors are recycled. }
+ \item{log}{ logical.
+ }
}
\details{
The positive-Poisson distribution is a Poisson distribution but with
diff --git a/man/pospoisson.Rd b/man/pospoisson.Rd
index daae29d..fb3aa47 100644
--- a/man/pospoisson.Rd
+++ b/man/pospoisson.Rd
@@ -33,7 +33,7 @@ pospoisson(link = "loge", earg=list(),
}
\item{method.init}{
- An integer with value \code{1} or \code{2} which
+ An integer with value \code{1} or \code{2} or \code{3} which
specifies the initialization method for \eqn{\lambda}{lambda}.
If failure to converge occurs try another value
and/or else specify a value for \code{ilambda}.
diff --git a/man/riceUC.Rd b/man/riceUC.Rd
index 3993c48..c702a2e 100644
--- a/man/riceUC.Rd
+++ b/man/riceUC.Rd
@@ -9,7 +9,7 @@
Density
% distribution function, quantile function
and random generation for the
- Rice distribution.
+ Rician distribution.
}
\usage{
diff --git a/man/riceff.Rd b/man/riceff.Rd
index 177a823..b861b26 100644
--- a/man/riceff.Rd
+++ b/man/riceff.Rd
@@ -38,7 +38,7 @@ riceff(lvee="loge", lsigma="loge",
}
}
\details{
- The Rice distribution has density function
+ The Rician distribution has density function
\deqn{f(y;v,\sigma) =
\frac{ y }{\sigma^2} \, \exp(-(y^2+v^2) / (2\sigma^2)) \, I_0(y v / \sigma^2)
}{%
@@ -82,7 +82,7 @@ Mathematical Analysis of Random Noise.
\seealso{
\code{\link{drice}},
\code{\link{rayleigh}},
- \code{\link[base]{besselI}}.
+ \code{\link[base:Bessel]{besselI}}.
}
\examples{
diff --git a/man/rposnegbin.Rd b/man/rposnegbin.Rd
deleted file mode 100644
index 3ff2fa8..0000000
--- a/man/rposnegbin.Rd
+++ /dev/null
@@ -1,85 +0,0 @@
-\name{rposnegbin}
-\alias{rposnegbin}
-%- Also NEED an '\alias' for EACH other topic documented here.
-\title{ Positive-negative binomial distribution random variates }
-\description{
- Generate random variates from a positive-negative binomial distribution.
-}
-\usage{
-rposnegbin(n, munb, k)
-}
-%- maybe also 'usage' for other objects documented here.
-\arguments{
- \item{n}{
- number of random values to return.
-
- }
- \item{munb}{
- vector of positive means (of an ordinary negative binomial distribution).
-
- }
- \item{k}{
- vector of positive index parameters (of an ordinary negative binomial distribution).
- This is called the \code{size} argument in
- \code{\link[stats:NegBinomial]{rnbinom}}.
-
-% This is called \eqn{\theta}{theta} in the \code{\link[MASS]{rnegbin}}
-% function in the \code{MASS} library.
-
- Short vectors are recycled.
- The parameter \code{1/k} is known as a dispersion parameter;
- as \code{k} approaches infinity, the negative binomial distribution
- approaches a Poisson distribution.
-
- }
-}
-\details{
- The positive-negative binomial distribution is a negative binomial
- distribution but with
- the probability of a zero being zero. The other probabilities are scaled
- to add to unity.
- The mean therefore is
- \deqn{\mu / (1-p(0))}{%
- munb / (1-p(0))}
- where \eqn{\mu}{munb} the mean of an ordinary negative binomial distribution.
- The arguments of the function are fed into
- \code{\link[stats:NegBinomial]{rnbinom}} until \eqn{n} positive values
- are obtained.
-
-}
-\value{
- \eqn{n} random deviates are returned.
-
-}
-\references{
-Welsh, A. H., Cunningham, R. B., Donnelly, C. F. and Lindenmayer,
-D. B. (1996)
-Modelling the abundances of rare species: statistical models
-for counts with extra zeros.
-\emph{Ecological Modelling},
-\bold{88},
-297--308.
-
-}
-\author{ T. W. Yee }
-\note{
-The running time is slow when \code{munb} is very close to zero.
-
-}
-
-\seealso{
-% \code{\link[MASS]{rnegbin}},
- \code{\link[stats:NegBinomial]{rnbinom}},
- \code{\link{posnegbinomial}},
- \code{\link{zanegbinomial}}.
-
-}
-\examples{
-munb = 2; k = 4; n = 1000
-y = rposnegbin(n, munb=munb, k=k)
-table(y)
-mean(y) # sample mean
-munb / (1 - (k/(k+munb))^k) # population mean
-}
-\keyword{distribution}
-
diff --git a/man/rrvglm-class.Rd b/man/rrvglm-class.Rd
index b1deb1c..3fbfea0 100644
--- a/man/rrvglm-class.Rd
+++ b/man/rrvglm-class.Rd
@@ -185,6 +185,18 @@ Objects can be created by calls to \code{\link{rrvglm}}.
from class \code{ "vlm"}.
The response, in matrix form.
}
+ \item{\code{Xm2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+ \item{\code{Ym2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+ \item{\code{callXm2}:}{
+ Object of class \code{"call"}, from class \code{ "vlm"}.
+ The matched call for argument \code{form2}.
+ }
}
}
diff --git a/man/rrvglm.Rd b/man/rrvglm.Rd
index 6efe39e..d6cf0b3 100644
--- a/man/rrvglm.Rd
+++ b/man/rrvglm.Rd
@@ -267,10 +267,8 @@ Regression and ordered categorical variables.
\examples{
data(car.all)
-attach(car.all)
-index = Country == "Germany" | Country == "USA" |
- Country == "Japan" | Country == "Korea"
-detach(car.all)
+index = with(car.all, Country == "Germany" | Country == "USA" |
+ Country == "Japan" | Country == "Korea")
scar = car.all[index, ] # standardized car data
fcols = c(13,14,18:20,22:26,29:31,33,34,36) # These are factors
scar[,-fcols] = scale(scar[,-fcols]) # Standardize all numerical vars
diff --git a/man/rrvglm.control.Rd b/man/rrvglm.control.Rd
index 5b4f10e..dcd2564 100644
--- a/man/rrvglm.control.Rd
+++ b/man/rrvglm.control.Rd
@@ -19,33 +19,39 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
}
%- maybe also `usage' for other objects documented here.
\arguments{
- \item{Rank}{ The numerical rank \eqn{R} of the model.
+ \item{Rank}{
+ The numerical rank \eqn{R} of the model.
Must be an element from the set \{1,2,\ldots,min(\eqn{M},\emph{p2})\}.
Here, the vector of explanatory variables \bold{x} is partitioned into
(\bold{x1},\bold{x2}), which is of dimension \emph{p1}+\emph{p2}.
The variables making up \bold{x1} are given by the terms in
\code{Norrr} argument, and the rest of the terms comprise \bold{x2}.
- }
- \item{Algorithm}{ Character string indicating what algorithm is
+
+ }
+ \item{Algorithm}{
+ Character string indicating what algorithm is
to be used. The default is the first one.
}
- \item{Corner}{ Logical indicating whether corner constraints are
+ \item{Corner}{
+ Logical indicating whether corner constraints are
to be used. This is one method for ensuring a unique solution.
If \code{TRUE}, \code{Index.corner} specifies the \eqn{R} rows
of the constraint matrices that are use as the corner constraints,
i.e., they hold an order-\eqn{R} identity matrix.
}
-\item{Uncor}{ Logical indicating whether uncorrelated
- latent variables are to be used. This is another normalization that
- forces the variance-covariance matrix of the latent variables to be
- \code{diag(Rank)}, i.e., unit variance and uncorrelated. This constraint
- does not lead to a unique solution because it can be rotated.
+\item{Uncor}{
+ Logical indicating whether uncorrelated latent variables are to be used.
+ This is normalization forces the variance-covariance
+ matrix of the latent variables to be \code{diag(Rank)}, i.e., unit
+ variance and uncorrelated. This constraint does not lead to a unique
+ solution because it can be rotated.
}
\item{Wmat}{ Yet to be done. }
- \item{Svd.arg}{ Logical indicating whether a singular value decomposition
+ \item{Svd.arg}{
+ Logical indicating whether a singular value decomposition
of the outer product is to computed. This is another normalization
which ensures uniqueness. See the argument \code{Alpha} below.
@@ -66,17 +72,21 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
\eqn{D^{1-\alpha} V^T}{D^(1-Alpha) \%*\% t(V)} respectively.
A value of 0.5 is `symmetrical'.
This argument is used only when \code{Svd.arg=TRUE}.
+
}
- \item{Bestof}{ Integer. The best of \code{Bestof} models fitted is
+ \item{Bestof}{
+ Integer. The best of \code{Bestof} models fitted is
returned. This argument helps guard against local solutions by
(hopefully) finding the global solution from many fits. The
argument works only when the function generates its own initial value
for \bold{C},
i.e., when \bold{C} is \emph{not} passed in as initial values.
+
}
\item{Cinit}{
Initial \bold{C} matrix which may speed up convergence.
It must be of the correct dimension.
+
}
\item{Etamat.colmax}{
Positive integer, no smaller than \code{Rank}. Controls the amount
@@ -96,7 +106,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
Integer vector specifying which rows
of the constraint matrices are to be all zeros.
}
- \item{SD.Cinit}{ Standard deviation of the initial values for the elements
+ \item{SD.Cinit}{
+ Standard deviation of the initial values for the elements
of \bold{C}.
These are normally distributed with mean zero.
This argument is used only if \code{Use.Init.Poisson.QO = FALSE}.
@@ -110,7 +121,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
\eqn{\bold{B}_2}{\bold{B}2} matrix.
}
- \item{trace}{ Logical indicating if output should be produced for
+ \item{trace}{
+ Logical indicating if output should be produced for
each iteration.
% Useful when \code{Quadratic=TRUE} because QRR-VGLMs are
@@ -126,7 +138,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
realistic for RR-VGLMs compared to QRR-VGLMs.
}
- \item{checkwz}{ logical indicating whether the diagonal elements of
+ \item{checkwz}{
+ logical indicating whether the diagonal elements of
the working weight matrices should be checked whether they are
sufficiently positive, i.e., greater than \code{wzepsilon}. If not,
any values less than \code{wzepsilon} are replaced with this value.
@@ -137,7 +150,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
weight matrices are sufficiently positive.
}
- \item{\dots}{ Variables in \dots are passed into
+ \item{\dots}{
+ Variables in \dots are passed into
\code{\link{vglm.control}}. If the derivative algorithm is used, then
\dots are also passed into \code{\link{rrvglm.optim.control}}.
}
diff --git a/man/ruge.Rd b/man/ruge.Rd
index 7df9d2e..3b224ee 100644
--- a/man/ruge.Rd
+++ b/man/ruge.Rd
@@ -33,10 +33,9 @@
%}
\examples{
data(ruge)
-attach(ruge)
-lambdahat = weighted.mean(number, w=counts)
-(N = sum(counts))
-cbind(number, counts, fitted=round(N * dpois(number, lam=lambdahat)))
-detach(ruge)
+lambdahat = with(ruge, weighted.mean(number, w=counts))
+(N = with(ruge, sum(counts)))
+with(ruge, cbind(number, counts,
+ fitted=round(N * dpois(number, lam=lambdahat))))
}
\keyword{datasets}
diff --git a/man/s.Rd b/man/s.Rd
index a930beb..9c92911 100644
--- a/man/s.Rd
+++ b/man/s.Rd
@@ -20,6 +20,10 @@ s(x, df = 4, spar = 0, ...)
\item{x}{
covariate (abscissae) to be smoothed.
+ Note that \code{x} must be a single variable
+ and not a function of a variable.
+ For example, \code{s(x)} is fine but \code{s(log(x))} will fail.
+ In this case, let \code{logx <- log(x)}, say, and use \code{s(logx)}.
}
\item{df}{
@@ -65,11 +69,6 @@ Vector generalized additive models.
}
\author{ Thomas W. Yee }
\note{
- The \code{x} argument of \code{s()} must be a single variable
- and not a function of a variable.
- For example, \code{s(x)} is fine but \code{s(log(x))} will fail.
- In this case, let \code{logx <- log(x)}, say, and use
- \code{s(logx)}.
The vector cubic smoothing spline which \code{s()} represents is
computationally demanding for large \eqn{M}. The cost is approximately
diff --git a/man/skellam.Rd b/man/skellam.Rd
index 72c191c..ae16fbf 100644
--- a/man/skellam.Rd
+++ b/man/skellam.Rd
@@ -8,10 +8,8 @@
}
\usage{
-skellam(lmu1="loge", lmu2="loge",
- emu1=list(), emu2=list(),
- imu1=NULL, imu2=NULL,
- nsimEIM=100, parallel=FALSE, zero=NULL)
+skellam(lmu1="loge", lmu2="loge", emu1=list(), emu2=list(),
+ imu1=NULL, imu2=NULL, nsimEIM=100, parallel=FALSE, zero=NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -68,6 +66,13 @@ f(y;mu1,mu2) =
and \code{\link{vgam}}.
}
+\section{Warning }{
+ This \pkg{VGAM} family function seems fragile and very sensitive to
+ the initial values.
+ Use very cautiously!!
+
+}
+
\references{
Skellam, J. G. (1946)
The frequency distribution of the difference between
@@ -85,6 +90,7 @@ two Poisson variates belonging to different populations.
\seealso{
\code{\link{dskellam}},
+ \code{\link[stats:Poisson]{dpois}},
\code{\link{poissonff}}.
}
diff --git a/man/skellamUC.Rd b/man/skellamUC.Rd
index 4220b2c..fc3770d 100644
--- a/man/skellamUC.Rd
+++ b/man/skellamUC.Rd
@@ -47,7 +47,8 @@ rskellam(n, mu1, mu2)
}
\seealso{
- \code{\link{skellam}}.
+ \code{\link{skellam}},
+ \code{\link[stats:Poisson]{dpois}}.
}
\examples{
diff --git a/man/tikuv.Rd b/man/tikuv.Rd
index 937371e..cd7ce18 100644
--- a/man/tikuv.Rd
+++ b/man/tikuv.Rd
@@ -91,7 +91,8 @@ tikuv(d, lmean="identity", lsigma="loge",
A normal distribution arises as the limit as \eqn{d} approaches
\eqn{-\infty}{-Inf}, i.e., as \eqn{h} approaches \eqn{\infty}{Inf}.
Fisher scoring is implemented.
- After fitting the value of \code{d} is stored as \code{@misc\$d}.
+ After fitting the value of \code{d} is stored in \code{@misc} with
+ component name \code{d}.
}
diff --git a/man/trplot.qrrvglm.Rd b/man/trplot.qrrvglm.Rd
index 4f0f553..9e9db45 100644
--- a/man/trplot.qrrvglm.Rd
+++ b/man/trplot.qrrvglm.Rd
@@ -13,7 +13,7 @@ It is only applicable for rank-1 models with argument
trplot.qrrvglm(object, whichSpecies = NULL,
add=FALSE, plot.it=TRUE,
label.sites = FALSE,
- sitenames = dimnames(object at y)[[1]],
+ sitenames = rownames(object at y),
axes.equal = TRUE, cex = par()$cex,
col = 1:(nos * (nos - 1)/2), log = "",
lty = rep(par()$lty, len = nos * (nos - 1)/2),
@@ -157,8 +157,8 @@ p1 = cqo(cbind(Alopacce, Alopcune, Alopfabr, Arctlute, Arctperi, Auloalbi,
trplot(p1, whichSpecies=1:3, log="xy", type="b", lty=1,
main="Trajectory plot of three hunting spiders species",
col=c("blue","red","green"), lwd=2, label=TRUE) -> ii
-legend(0.00005, 0.3, paste(ii$species[,1], ii$species[,2], sep=" and "),
- lwd=2, lty=1, col=c("blue","red","green"))
+legend(0.00005, 0.3, lwd=2, lty=1, col=c("blue","red","green"),
+ with(ii, paste(species.names[,1], species.names[,2], sep=" and ")))
abline(a=0, b=1, lty="dashed") # Useful reference line
}
}
diff --git a/man/undocumented-methods.Rd b/man/undocumented-methods.Rd
index 6138e4b..71ca6f3 100644
--- a/man/undocumented-methods.Rd
+++ b/man/undocumented-methods.Rd
@@ -5,6 +5,11 @@
%
%
%
+\alias{AIC,vlm-method}
+\alias{AIC,vglm-method}
+\alias{AIC,vgam-method}
+\alias{AIC,rrvglm-method}
+\alias{AIC,qrrvglm-method}
\alias{attrassign,lm-method}
\alias{calibrate,qrrvglm-method}
\alias{calibrate,cao-method}
@@ -70,6 +75,8 @@
\alias{is.bell,Coef.qrrvglm-method}
\alias{logLik,vlm-method}
\alias{logLik,summary.vglm-method}
+\alias{logLik,vglm-method}
+\alias{logLik,vgam-method}
\alias{lvplot,cao-method}
\alias{lvplot,qrrvglm-method}
\alias{lvplot,rrvglm-method}
diff --git a/man/uqo.Rd b/man/uqo.Rd
index 4dcc811..82f4d7c 100644
--- a/man/uqo.Rd
+++ b/man/uqo.Rd
@@ -243,7 +243,7 @@ nos = ncol(up1 at y) # Number of species
clr = (1:(nos+1))[-7] # to omit yellow
lvplot(up1, las=1, y=TRUE, pch=1:nos, scol=clr, lcol=clr,
pcol=clr, llty=1:nos, llwd=2)
-legend(x=2, y=135, dimnames(up1 at y)[[2]], col=clr, lty=1:nos,
+legend(x=2, y=135, colnames(up1 at y), col=clr, lty=1:nos,
lwd=2, merge=FALSE, ncol=1, x.inter=4.0, bty="l", cex=0.9)
# Compare the site scores between the two models
diff --git a/man/vgam-class.Rd b/man/vgam-class.Rd
index 86be796..784edc1 100644
--- a/man/vgam-class.Rd
+++ b/man/vgam-class.Rd
@@ -163,13 +163,24 @@ The levels of the factors, if any, used in fitting.
from class \code{ "vlm"}.
The response, in matrix form.
}
- }
+ \item{\code{Xm2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+ \item{\code{Ym2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+ \item{\code{callXm2}:}{
+ Object of class \code{"call"}, from class \code{ "vlm"}.
+ The matched call for argument \code{form2}.
+ }
+ }
}
-
\section{Extends}{
Class \code{"vglm"}, directly.
-Class \code{"vlm"}, by class "vglm".
+Class \code{"vlm"}, by class \code{"vglm"}.
}
\section{Methods}{
\describe{
@@ -179,7 +190,6 @@ Useful for quantile regression and extreme value data models.}
\item{deplot}{\code{signature(object = "vglm")}:
density plot.
Useful for quantile regression models.}
- }
\item{deviance}{\code{signature(object = "vglm")}:
deviance of the model (where applicable). }
\item{plot}{\code{signature(x = "vglm")}:
@@ -200,6 +210,7 @@ Useful for extreme value data models.}
\item{summary}{\code{signature(object = "vglm")}:
a more detailed summary of the object. }
}
+}
\references{
Yee, T. W. and Wild, C. J. (1996)
@@ -214,6 +225,7 @@ Vector generalized additive models.
VGAMs have all the slots that \code{\link{vglm}} objects
have (\code{\link{vglm-class}}), plus the first few slots
described in the section above.
+
}
%~Make other sections like WARNING with \section{WARNING }{....} ~
@@ -224,6 +236,7 @@ Vector generalized additive models.
\code{\link[VGAM]{s}},
\code{\link{vglm-class}},
\code{\link{vglmff-class}}.
+
}
\examples{
diff --git a/man/vgam.Rd b/man/vgam.Rd
index 41ea376..7013e1d 100644
--- a/man/vgam.Rd
+++ b/man/vgam.Rd
@@ -210,6 +210,10 @@ Vector generalized additive models.
\emph{Journal of the Royal Statistical Society, Series B, Methodological},
\bold{58}, 481--493.
+Yee, T. W. (2008)
+The \code{VGAM} Package.
+\emph{R News}, \bold{8}, 28--39.
+
Documentation accompanying the \pkg{VGAM} package at
\url{http://www.stat.auckland.ac.nz/~yee}
contains further information and examples.
@@ -280,13 +284,12 @@ fit2 = vgam(cbind(agaaus, kniexc) ~ s(altitude, df=c(2,3)),
coef(fit2, mat=TRUE) # Not really interpretable
\dontrun{
plot(fit2, se=TRUE, overlay=TRUE, lcol=1:2, scol=1:2)
-attach(hunua)
-o = order(altitude)
-matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2, las=1,
- xlab="Altitude (m)", ylab="Probability of presence",
- main="Two plant species' response curves", ylim=c(0,.8))
-rug(altitude)
-detach(hunua)
+
+o = with(hunua, order(altitude))
+with(hunua, matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2,
+ xlab="Altitude (m)", ylab="Probability of presence", las=1,
+ main="Two plant species' response curves", ylim=c(0,.8)))
+with(hunua, rug(altitude))
}
}
\keyword{models}
diff --git a/man/vglm-class.Rd b/man/vglm-class.Rd
index 3d13f37..7e54b39 100644
--- a/man/vglm-class.Rd
+++ b/man/vglm-class.Rd
@@ -151,6 +151,18 @@ The levels of the factors, if any, used in fitting.
from class \code{ "vlm"}.
The response, in matrix form.
}
+ \item{\code{Xm2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+ \item{\code{Ym2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+ \item{\code{callXm2}:}{
+ Object of class \code{"call"}, from class \code{ "vlm"}.
+ The matched call for argument \code{form2}.
+ }
}
}
\section{Extends}{
diff --git a/man/vglm.Rd b/man/vglm.Rd
index ae8333b..39a8de1 100644
--- a/man/vglm.Rd
+++ b/man/vglm.Rd
@@ -14,7 +14,7 @@ vglm(formula, family, data = list(), weights = NULL, subset = NULL,
coefstart = NULL, control = vglm.control(...), offset = NULL,
method = "vglm.fit", model = FALSE, x.arg = TRUE, y.arg = TRUE,
contrasts = NULL, constraints = NULL, extra = list(),
- qr.arg = FALSE, smart = TRUE, ...)
+ form2 = NULL, qr.arg = FALSE, smart = TRUE, ...)
}
%- maybe also `usage' for other objects documented here.
\arguments{
@@ -136,6 +136,14 @@ vglm(formula, family, data = list(), weights = NULL, subset = NULL,
the \pkg{VGAM} family function.
}
+ \item{form2}{
+ The second (optional) formula.
+ Some \pkg{VGAM} family functions such as \code{\link{micmen}})
+ use this argument to onput the regressor variable.
+ If given, the slots \code{@Xm2} and \code{@Ym2} may be assigned.
+ Warning: smart prediction is not used for this argument.
+
+ }
\item{qr.arg}{
logical value indicating whether
the slot \code{qr}, which returns the QR decomposition of the
@@ -246,6 +254,10 @@ Vector generalized additive models.
\emph{Journal of the Royal Statistical Society, Series B, Methodological},
\bold{58}, 481--493.
+Yee, T. W. (2008)
+The \code{VGAM} Package.
+\emph{R News}, \bold{8}, 28--39.
+
Documentation accompanying the \pkg{VGAM} package at
\url{http://www.stat.auckland.ac.nz/~yee}
contains further information and examples.
@@ -306,6 +318,7 @@ Vector generalized additive models.
\code{coef.vlm},
\code{\link{predict.vglm}},
\code{summary.vglm},
+ \code{AIC.vglm},
etc.
}
diff --git a/man/vonmises.Rd b/man/vonmises.Rd
index 305545e..c7060cc 100644
--- a/man/vonmises.Rd
+++ b/man/vonmises.Rd
@@ -8,10 +8,9 @@
}
\usage{
vonmises(llocation="elogit", lscale="loge",
- elocation=if(llocation=="elogit") list(min=0, max=2*pi) else list(),
- escale=list(),
- ilocation=NULL, iscale=NULL,
- method.init=1, zero=NULL)
+ elocation=if(llocation=="elogit") list(min=0, max=2*pi)
+ else list(), escale=list(), ilocation=NULL,
+ iscale=NULL, method.init=1, zero=NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -64,8 +63,9 @@ vonmises(llocation="elogit", lscale="loge",
}
\details{
- The (two-parameter) von Mises distribution
- has a density that can be written as
+ The (two-parameter) von Mises
+ is the most commonly used distribution in practice for circular data.
+ It has a density that can be written as
\deqn{f(y;a,k) = \frac{\exp[k\cos(y-a)]}{
2\pi I_0(k)}}{%
f(y;a,k) = exp[k*cos(y-a)] / (2*pi*I0(k))}
diff --git a/man/vsmooth.spline.Rd b/man/vsmooth.spline.Rd
index 86b10b5..500a428 100644
--- a/man/vsmooth.spline.Rd
+++ b/man/vsmooth.spline.Rd
@@ -170,14 +170,14 @@ plot(fit2, lcol=mycols, pcol=mycols, las=1)
}
p = predict(fit, x=fit at x, deriv=0)
-max(abs(fit at y - p$y)) # Should be zero
+max(abs(fit at y - with(p, y))) # Should be zero
par(mfrow=c(3,1))
ux = seq(1, 8, len=100)
for(d in 1:3) {
p = predict(fit, x=ux, deriv=d)
\dontrun{
- matplot(p$x, p$y, type="l", main=paste("deriv =", d), lwd=2)
+ with(p, matplot(x, y, type="l", main=paste("deriv =", d), lwd=2))
}
}
}
diff --git a/man/wffc.P2star.Rd b/man/wffc.P2star.Rd
new file mode 100644
index 0000000..767d69b
--- /dev/null
+++ b/man/wffc.P2star.Rd
@@ -0,0 +1,71 @@
+\name{wffc.points}
+\alias{wffc.P1}
+\alias{wffc.P1star}
+\alias{wffc.P2}
+\alias{wffc.P2star}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Point System for the 2008 World Fly Fishing Championships }
+\description{
+ Point system for the 2008 World Fly Fishing Championships:
+ current and proposed.
+
+}
+\usage{
+wffc.P1(length, min.eligible = 0.18)
+wffc.P1star(length, min.eligible = 0.18)
+wffc.P2(length, min.eligible = 0.18)
+wffc.P2star(length, min.eligible = 0.18)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{length}{ Length of the fish, in metres. Numeric vector. }
+ \item{min.eligible}{ Currently the regulations stipulate that the
+ smallest eligible fish is 180 mm. }
+}
+\details{
+ The official website contains a document with the official rules and
+ regulations of the competition.
+ The function \code{wffc.P1()} implements the current WFFC point system.
+ \code{wffc.P1star()} is a `continuous' version of it.
+
+ The function \code{wffc.P2()} is a new proposal which rewards catching bigger
+ fish.
+ \code{wffc.P2star()} is a `continuous' version of it.
+}
+\value{
+ A vector with the number of points.
+
+}
+
+\references{
+ \url{http://www.2008worldflyfishingchamps.com}
+ is the official website.
+
+ Yee, T. W. (2008)
+ Vector generalized linear and additive models, with
+ applications to the 2008 World Fly Fishing Championships.
+ In preparation.
+
+}
+
+\author{ T. W. Yee. }
+\note{
+ \code{wffc.P2} and \code{wffc.P2star} may change in the future.
+
+}
+\seealso{ \code{\link{wffc}}. }
+\examples{
+\dontrun{
+fishlength = seq(0.0, 0.72, by=0.001)
+plot(fishlength, wffc.P2star(fishlength), type="l", col="blue",
+ las=1, lty="dashed", lwd=2, las=1,
+ xlab="Fish length (m)", ylab="Competition points",
+ main="Current (red) and proposed (blue) WFFC point system")
+lines(fishlength, wffc.P1star(fishlength), type="l", col="red", lwd=2)
+abline(v=(1:4)*0.18, lty="dotted")
+abline(h=(1:9)*wffc.P1star(0.18), lty="dotted")
+}
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ models }
diff --git a/man/wffc.Rd b/man/wffc.Rd
new file mode 100644
index 0000000..7b98271
--- /dev/null
+++ b/man/wffc.Rd
@@ -0,0 +1,184 @@
+\name{wffc}
+\alias{wffc}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships }
+\description{
+ Capture records of the 2008 FIPS-MOUCHE
+ World Fly Fishing Championships held in Rotorua, New Zealand during
+ 22--30 March 2008.
+
+}
+\usage{data(wffc)}
+\format{
+ A data frame with 4267 observations on the following 8 variables.
+ Each row is a recorded capture.
+ \describe{
+ \item{\code{length}}{a numeric vector; length of fish in mm.}
+ \item{\code{water}}{a factor with levels \code{Waihou},
+ \code{Waimakariri}, \code{Whanganui}, \code{Otamangakau}, \code{Rotoaira}.
+ These are known as Sectors IV, V, I, II, III respectively, and
+ are also represented by the variable \code{sector}.
+ }
+ \item{\code{session}}{a numeric vector; a value from the set 1,2,\ldots,6.
+ These are time ordered, and there were two sessions per competition day.}
+ \item{\code{sector}}{a numeric vector; a value from the set 1,2,\ldots,5.}
+ \item{\code{beatboat}}{a numeric vector; beat or boat number,
+ a value from the set 1,2,\ldots,19.}
+ \item{\code{comid}}{a numeric vector; the competitor's ID number. Uniquely
+ identifies each competitor.
+ These ID numbers actually correspond to their rankings
+ in the individual level. }
+ \item{\code{iname}}{a character vector; the individual competitor's name. }
+ \item{\code{country}}{a character vector;
+ what country the competitors represented.
+The countries represented were
+Australia (AUS),
+Canada (CAN),
+Croatia (CRO),
+Czech Republic (CZE),
+England (ENG),
+Finland (FIN),
+France (FRA),
+Holland (NED),
+Ireland (IRE),
+Italy (ITA),
+Japan (JPN),
+Malta (MAL),
+New Zealand (NZL),
+Poland (POL),
+Portugal (POR),
+South Africa (RSA),
+Slovakia (SVK),
+USA (USA),
+Wales (WAL).
+ }
+ }
+}
+\details{
+ Details may be obtained at the official website and Yee (2008).
+ Here is a brief summary.
+ The three competition days were 28--30 March.
+ Each session was fixed at 9.00am--12.00pm and 2.30--5.30pm daily.
+ One of the sessions was a rest session.
+ Each of 19 teams had 5 members, called A, B, C, D and E
+ (there was a composite team, actually).
+ The scoring system allocated 100 points to each eligible fish
+ (minimum length was 18 cm)
+ and 20 points for each cm of its length
+ (rounded up to the nearest centimeter).
+ Thus a 181mm or 190mm fish was worth 480 points.
+ Each river was divided into 19 contiguous downstream beats labelled
+ 1,2,\ldots,19.
+ Each lake was fished by 9 boats, each with two competitors
+ except for one boat which only had one.
+ Each competitor was randomly assigned to a beat/boat.
+
+Competitors were ranked according to their placings at each sector-session
+combination, and then these placings were summed. Those with the minimum
+total placings were the winners, thus it was not necessarily those who had
+the maximum points who won. For example, in Session 1 at the Waihou River,
+each of the 19 competitors was ranked 1 (best) to 19 (worst) according
+to the point system. This is the ``placing'' for that session. These
+placings were added up over the 5 sessions to give the ``total placings''.
+
+All sectors have naturally wild Rainbow trout (\emph{Oncorhynchus mykiss})
+while Lake Otamangakau and the Whanganui River also holds Brown trout
+(\emph{Salmo trutta}). Only these two species were targetted.
+The species was not recorded electronically, however a post-analysis
+of the paper score sheets from the two lakes showed that, approximately,
+less than 5 percent were Brown trout.
+It may be safely assumed that all the Waihou and Waimakariri
+fish were Rainbow trout.
+The gender of the fish were also not recorded electronically, and
+anyway, distinguishing between male and female was very difficult
+for small fish.
+
+Although species and gender data were supposed to have been
+collected at the time of capture the quality of these variables
+is rather poor and furthermore they were not recorded electronically.
+
+% 11 out of (11 + 210) were brown trout, in Otamangakau.
+% 52 were NAs.
+%
+% 3 out of ( 3 + 179) were brown trout, in Rotoaira.
+% 19 were NAs.
+
+ Note that some fish may have been caught more than once, hence
+ these data do not represent individual fish but rather recorded captures.
+
+}
+
+\seealso{
+ \code{\link{wffc.indiv}},
+ \code{\link{wffc.teams}},
+ \code{\link{wffc.nc}},
+ \code{\link{wffc.P1}}.
+
+}
+\source{
+ This data frame was adapted from the WFFC's spreadsheet.
+ Special thanks goes to
+ Paul Dewar,
+ Jill Mandeno,
+ Ilkka Pirinen,
+ and the other members of the Organising Committee of the 28th FIPS-Mouche
+ World Fly Fishing Championships for access to the data.
+ The assistance and feedback of Colin Shepherd is gratefully
+ acknowledged.
+
+}
+\references{
+ \url{http://www.2008worldflyfishingchamps.com}
+ is the official website.
+
+ Yee, T. W. (2008)
+ Vector generalized linear and additive models, with
+ applications to the 2008 World Fly Fishing Championships.
+ In preparation.
+
+}
+\examples{
+data(wffc)
+summary(wffc)
+with(wffc, table(water,session))
+
+# Obtain some simple plots
+waihou = with(wffc, wffc[water=="Waihou",])
+waimak = with(wffc, wffc[water=="Waimakariri",])
+whang = with(wffc, wffc[water=="Whanganui",])
+otam = with(wffc, wffc[water=="Otamangakau",])
+roto = with(wffc, wffc[water=="Rotoaira",])
+minlength = min(wffc[,"length"])
+maxlength = max(wffc[,"length"])
+nwater = c("Waihou"=nrow(waihou), "Waimakariri"=nrow(waimak),
+ "Whanganui"=nrow(whang), "Otamangakau"=nrow(otam),
+ "Rotoaira"=nrow(roto))
+\dontrun{
+par(mfrow=c(2,3), las=1)
+# Overall distribution of length
+with(wffc, boxplot(length/10 ~ water, ylim=c(minlength, maxlength)/10,
+ border="blue", main="Length (cm)"))
+
+# Overall distribution of LOG length
+with(wffc, boxplot(length/10 ~ water, ylim=c(minlength, maxlength)/10,
+ border="blue", log="y",
+ main="Length (cm) on a log scale"))
+
+# Overall distribution of number of captures
+pie(nwater, border="blue", main="Proportion of captures",
+ labels=names(nwater), density=10, col=1:length(nwater),
+ angle=85+30* 1:length(nwater))
+
+# Overall distribution of number of captures
+with(wffc, barplot(nwater, main="Number of captures", cex.names=0.5))
+
+# Overall distribution of proportion of number of captures
+with(wffc, barplot(nwater / sum(nwater), cex.names=0.5,
+ main="Proportion of captures"))
+# An interesting lake
+with(roto, hist(length/10, xlab="Fish lengths (cm)", breaks=seq(18, 70, by=3),
+ prob=TRUE, ylim=c(0, 0.08), border="blue", ylab="",
+ main="Lake Rotoaira", lwd=2))
+}
+}
+\keyword{datasets}
diff --git a/man/wffc.indiv.Rd b/man/wffc.indiv.Rd
new file mode 100644
index 0000000..d33cee8
--- /dev/null
+++ b/man/wffc.indiv.Rd
@@ -0,0 +1,49 @@
+\name{wffc.indiv}
+\alias{wffc.indiv}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships (Individual results) }
+\description{
+ Individual competitors' results of the 2008 FIPS-MOUCHE
+ World Fly Fishing Championships held in Rotorua, New Zealand during
+ 22--30 March 2008.
+
+}
+\usage{data(wffc.indiv)}
+\format{
+ A data frame with 99 observations on the following 8 variables.
+ Some of these variable are described in \code{\link{wffc}}.
+ \describe{
+ \item{\code{totalPlacings}}{a numeric vector; these are the summed
+ placings over the 5 sessions.}
+ \item{\code{points}}{a numeric vector.}
+ \item{\code{noofcaptures}}{a numeric vector.}
+ \item{\code{longest}}{a numeric vector.}
+ \item{\code{individual}}{a numeric vector; did the competitor
+ fish in a team or as an individual?
+ (one team was made of composite countries due to low numbers).}
+ \item{\code{country}}{a character vector.}
+ \item{\code{iname}}{a character vector.}
+ \item{\code{comid}}{a numeric vector.}
+ }
+}
+\details{
+ This data frame gives the individual results of the competition.
+ See also \code{\link{wffc}} and \code{\link{wffc.teams}} for more
+ details and links.
+
+}
+\source{
+ \url{http://www.2008worldflyfishingchamps.com/}.
+}
+\references{
+ Yee, T. W. (2008)
+ Vector generalized linear and additive models, with
+ applications to the 2008 World Fly Fishing Championships.
+ In preparation.
+
+}
+\examples{
+data(wffc.indiv)
+summary(wffc.indiv)
+}
+\keyword{datasets}
diff --git a/man/wffc.nc.Rd b/man/wffc.nc.Rd
new file mode 100644
index 0000000..a4619aa
--- /dev/null
+++ b/man/wffc.nc.Rd
@@ -0,0 +1,52 @@
+\name{wffc.nc}
+\alias{wffc.nc}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships (Number of captures) }
+\description{
+ Number of captures in the 2008 FIPS-MOUCHE
+ World Fly Fishing Championships held in Rotorua, New Zealand during
+ 22--30 March 2008.
+
+}
+\usage{data(wffc.nc)}
+\format{
+ A data frame with 475 observations on the following 7 variables.
+ Most of these variable are described in \code{\link{wffc}}.
+ Each row is sorted by sector, session and beat.
+ \describe{
+ \item{\code{sector}}{a numeric vector.}
+ \item{\code{session}}{a numeric vector.}
+ \item{\code{beatboat}}{a numeric vector.}
+ \item{\code{numbers}}{a numeric vector.}
+ \item{\code{comid}}{a numeric vector.}
+ \item{\code{iname}}{a character vector.}
+ \item{\code{country}}{a character vector.}
+ }
+}
+\details{
+ This data frame was obtained by processing \code{\link{wffc}}.
+ The key variable is \code{numbers}, which is
+ sector-session-beat specific.
+
+ Note that some fish may have been caught more than once, hence
+ these data do not represent individual fish.
+
+}
+\source{
+ \url{http://www.2008worldflyfishingchamps.com/}.
+}
+\references{
+ Yee, T. W. (2008)
+ Vector generalized linear and additive models, with
+ applications to the 2008 World Fly Fishing Championships.
+ In preparation.
+
+}
+
+\seealso{ \code{\link{DeLury}}. }
+
+\examples{
+data(wffc.nc)
+with(wffc.nc, table(sector, session))
+}
+\keyword{datasets}
diff --git a/man/wffc.teams.Rd b/man/wffc.teams.Rd
new file mode 100644
index 0000000..5c40f8e
--- /dev/null
+++ b/man/wffc.teams.Rd
@@ -0,0 +1,44 @@
+\name{wffc.teams}
+\alias{wffc.teams}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships (Team results) }
+\description{
+ Team results of the 2008 FIPS-MOUCHE
+ World Fly Fishing Championships held in Rotorua, New Zealand during
+ 22--30 March 2008.
+
+}
+\usage{data(wffc.teams)}
+\format{
+ A data frame with 18 observations on the following 5 variables.
+ Some of these variable are described in \code{\link{wffc}}.
+ \describe{
+ \item{\code{country}}{a character vector.}
+ \item{\code{totalPlacings}}{a numeric vector; these are the summed
+ placings over the 5 sessions and 5 team members. }
+ \item{\code{points}}{a numeric vector; see \code{\link{wffc}}.}
+ \item{\code{noofcaptures}}{a numeric vector.}
+ \item{\code{longestfish}}{a numeric vector.}
+ }
+}
+\details{
+ This data frame gives the team results of the competition.
+ See also \code{\link{wffc}} and \code{\link{wffc.indiv}} for more
+ details and links.
+
+}
+\source{
+ \url{http://www.2008worldflyfishingchamps.com/}.
+}
+\references{
+ Yee, T. W. (2008)
+ Vector generalized linear and additive models, with
+ applications to the 2008 World Fly Fishing Championships.
+ In preparation.
+
+}
+\examples{
+data(wffc.teams)
+wffc.teams
+}
+\keyword{datasets}
diff --git a/man/zanegbinUC.Rd b/man/zanegbinUC.Rd
new file mode 100644
index 0000000..cdd6baa
--- /dev/null
+++ b/man/zanegbinUC.Rd
@@ -0,0 +1,79 @@
+\name{Zanegbin}
+\alias{Zanegbin}
+\alias{dzanegbin}
+\alias{pzanegbin}
+\alias{qzanegbin}
+\alias{rzanegbin}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Zero-Altered Negative Binomial Distribution }
+\description{
+ Density, distribution function, quantile function and random generation
+ for the zero-altered negative binomial distribution with parameter \code{p0}.
+
+}
+\usage{
+dzanegbin(x, p0, size, prob=NULL, munb=NULL, log = FALSE)
+pzanegbin(q, p0, size, prob=NULL, munb=NULL)
+qzanegbin(p, p0, size, prob=NULL, munb=NULL)
+rzanegbin(n, p0, size, prob=NULL, munb=NULL)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{x, q}{vector of quantiles.}
+ \item{p}{vector of probabilities.}
+ \item{n}{number of observations. Must be a single positive integer. }
+ \item{size, prob, munb, log}{
+ Parameters from the ordinary negative binomial distribution
+ (see \code{\link[stats:NegBinomial]{dnbinom}}).
+ Some arguments have been renamed slightly.
+
+ }
+ \item{p0}{
+ Probability of zero, called \eqn{p0}.
+ The default value of \code{p0=0} corresponds
+ to the response having a positive negative binomial distribution.
+
+ }
+}
+\details{
+ The probability function of \eqn{Y} is 0 with probability \code{p0},
+ else a positive \eqn{negative binomial(\mu_{nb}, size)}{negative binomial(munb, size)}
+ distribution.
+
+}
+\value{
+ \code{dzanegbin} gives the density and
+ \code{rzanegbin} generates random deviates.
+}
+%\references{ }
+\author{ Thomas W. Yee }
+\note{
+ The argument \code{p0} is recycled to the required length, and
+ must have values which lie in the interval [0,1].
+
+}
+
+\seealso{
+ \code{\link{zanegbinomial}},
+ \code{\link{rposnegbin}}.
+
+}
+\examples{
+munb = 3
+size = 4
+p0 = 0.3
+x = (-1):7
+(i = dzanegbin(x, p0=p0, munb=munb, size=size))
+table(rzanegbin(100, p0=p0, munb=munb, size=size))
+
+\dontrun{
+x = 0:10
+barplot(rbind(dzanegbin(x, p0=p0, munb=munb, size=size),
+ dnbinom(x, mu=munb, size=size)),
+ beside = TRUE, col = c("blue","green"),
+ main=paste("ZANB(p0=", p0, ", munb=", munb, ", size=", size, ") (blue) vs",
+ " NB(mu=", munb, ", size=", size, ") (green)", sep=""),
+ names.arg = as.character(x))
+}
+}
+\keyword{distribution}
diff --git a/man/zanegbinomial.Rd b/man/zanegbinomial.Rd
index ca154b7..9053ebe 100644
--- a/man/zanegbinomial.Rd
+++ b/man/zanegbinomial.Rd
@@ -10,8 +10,9 @@
}
\usage{
zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
- ep0=list(), emunb =list(), ek = list(),
- ik = 1, zero = -3, cutoff = 0.995, method.init=3)
+ ep0=list(), emunb =list(), ek = list(), ipnb0 = NULL,
+ ik = NULL, zero = -3, cutoff = 0.995, method.init=1,
+ shrinkage.init=0.95)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -38,8 +39,15 @@ zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
See \code{earg} in \code{\link{Links}} for general information.
}
+ \item{ipnb0}{
+ Optional initial values for the probability \eqn{p_0}{p0}.
+ If given, they must be in \eqn{(0,1)},
+ and it is ok to give one value each for each response/species.
+
+ }
\item{ik}{
- Initial values for \code{k}. They must be positive, and one value
+ Optional initial values for \code{k}.
+ If given, they must be positive, and give one value
for each response/species.
}
@@ -62,7 +70,7 @@ zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
\code{qnegbin(p)}.
}
- \item{method.init}{
+ \item{method.init, shrinkage.init}{
See \code{\link{negbinomial}}.
}
@@ -77,7 +85,7 @@ zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
binomial distribution in that the former has zeros coming from one
source, whereas the latter has zeros coming from the negative binomial
distribution too. The zero-inflated negative binomial distribution
- is currently not implemented in the \pkg{VGAM} package. Some people
+ is implemented in the \pkg{VGAM} package. Some people
call the zero-altered negative binomial a \emph{hurdle} model.
For one response/species, by default, the three linear/additive
@@ -134,20 +142,21 @@ for counts with extra zeros.
}
\seealso{
+ \code{\link{dzanegbin}},
\code{\link{posnegbinomial}},
\code{\link{negbinomial}},
\code{\link{binomialff}},
\code{\link{rposnegbin}},
\code{\link{zinegbinomial}},
- \code{\link{zipoisson}}.
+ \code{\link{zipoisson}},
+ \code{\link[stats:NegBinomial]{dnbinom}}.
}
\examples{
-\dontrun{
x = runif(n <- 2000)
p0 = logit(-1 + 2*x, inverse=TRUE)
-y1 = rposnegbin(n, munb=exp(0+2*x), k=exp(1)) # With covariates
-y2 = rposnegbin(n, munb=exp(1+2*x), k=exp(1)) # With covariates
+y1 = rposnegbin(n, munb=exp(0+2*x), size=exp(1)) # With covariates
+y2 = rposnegbin(n, munb=exp(1+2*x), size=exp(1)) # With covariates
y1 = ifelse(runif(n) < p0, 0, y1)
y2 = ifelse(runif(n) < p0, 0, y2)
table(y1)
@@ -155,9 +164,8 @@ table(y2)
fit = vglm(cbind(y1,y2) ~ x, zanegbinomial, trace=TRUE)
coef(fit, matrix=TRUE)
-fitted(fit)[1:9,]
-predict(fit)[1:9,]
-}
+fitted(fit)[1:3,]
+predict(fit)[1:3,]
}
\keyword{models}
\keyword{regression}
diff --git a/man/zapoisUC.Rd b/man/zapoisUC.Rd
new file mode 100644
index 0000000..0d197cb
--- /dev/null
+++ b/man/zapoisUC.Rd
@@ -0,0 +1,77 @@
+\name{Zapois}
+\alias{Zapois}
+\alias{dzapois}
+\alias{pzapois}
+\alias{qzapois}
+\alias{rzapois}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Zero-Altered Poisson Distribution }
+\description{
+ Density, distribution function, quantile function and random generation
+ for the zero-altered Poisson distribution with parameter \code{p0}.
+
+}
+\usage{
+dzapois(x, lambda, p0 = 0, log = FALSE)
+pzapois(q, lambda, p0 = 0)
+qzapois(p, lambda, p0 = 0)
+rzapois(n, lambda, p0 = 0)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+ \item{x, q}{vector of quantiles.}
+ \item{p}{vector of probabilities.}
+ \item{n}{number of observations. Must be a single positive integer. }
+ \item{lambda}{ Vector of positive means. }
+ \item{p0}{
+ Probability of zero, called \eqn{p0}.
+ The default value of \code{p0=0} corresponds
+ to the response having a positive Poisson distribution.
+
+ }
+ \item{log}{ Logical. Return the logarithm of the answer? }
+}
+\details{
+ The probability function of \eqn{Y} is 0 with probability
+ \code{p0}, else a positive \eqn{Poisson(\lambda)}{Poisson(lambda)}.
+
+}
+\value{
+ \code{dzapois} gives the density,
+ \code{pzapois} gives the distribution function,
+ \code{qzapois} gives the quantile function, and
+ \code{rzapois} generates random deviates.
+}
+%\references{ }
+\author{ Thomas W. Yee }
+\note{
+ The argument \code{p0} is recycled to the required length, and
+ must have values which lie in the interval [0,1].
+
+}
+
+\seealso{
+ \code{\link{zapoisson}}.
+
+}
+\examples{
+lambda = 3
+p0 = 0.2
+x = (-1):7
+(i = dzapois(x, lambda, p0))
+max(abs(cumsum(i) - pzapois(x, lambda, p0))) # Should be 0
+table(rzapois(100, lambda, p0))
+
+table(qzapois(runif(100), lambda, p0))
+round(dzapois(0:10, lambda, p0) * 100) # Should be similar
+
+\dontrun{
+x = 0:10
+barplot(rbind(dzapois(x, lambda, p0), dpois(x, lambda)),
+ beside = TRUE, col = c("blue","green"),
+ main=paste("ZAP(", lambda, ", p0=", p0, ") (blue) vs",
+ " Poisson(", lambda, ") (green)", sep=""),
+ names.arg = as.character(x))
+}
+}
+\keyword{distribution}
diff --git a/man/zapoisson.Rd b/man/zapoisson.Rd
index decdb4c..f9f210f 100644
--- a/man/zapoisson.Rd
+++ b/man/zapoisson.Rd
@@ -9,9 +9,8 @@
}
\usage{
-zapoisson(lp0 = "logit", llambda = "loge",
- ep0=list(), elambda=list(),
- zero=NULL)
+zapoisson(lp0 = "logit", llambda = "loge", ep0=list(),
+ elambda=list(), zero=NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -40,8 +39,8 @@ zapoisson(lp0 = "logit", llambda = "loge",
(after \code{lp0} is applied) is modelled as a single unknown
number that is estimated. It is modelled as a function of the
explanatory variables by \code{zero=NULL}. A negative value
- means that the value is recycled, so setting \eqn{-1} means all \eqn{p_0}{p0}
- are intercept-only (for multivariate responses).
+ means that the value is recycled, so setting \eqn{-1} means
+ all \eqn{p_0}{p0} are intercept-only (for multivariate responses).
}
}
@@ -52,7 +51,7 @@ zapoisson(lp0 = "logit", llambda = "loge",
which is modelled as a function of the covariates. The zero-altered
Poisson distribution differs from the zero-inflated Poisson distribution
in that the former has zeros coming from one source, whereas the latter
- has zeros coming from the Poisson distribution too. Some people call
+ has zeros coming from the Poisson distribution too. Some people call
the zero-altered Poisson a \emph{hurdle} model.
For one response/species, by default, the two linear/additive predictors
@@ -122,12 +121,13 @@ that these are reasonable.
}
\seealso{
+ \code{\link{rzapois}},
\code{\link{zipoisson}},
- \code{\link{yip88}},
\code{\link{pospoisson}},
\code{\link{posnegbinomial}},
\code{\link{binomialff}},
\code{\link{rpospois}}.
+
}
\examples{
diff --git a/man/zibinomUC.Rd b/man/zibinomUC.Rd
index ad78365..07d5cb7 100644
--- a/man/zibinomUC.Rd
+++ b/man/zibinomUC.Rd
@@ -63,7 +63,7 @@ rzibinom(n, size, prob, phi = 0)
\examples{
prob = 0.2; size = 10; phi = 0.5
(i = dzibinom(0:size, size, prob, phi=phi))
-cumsum(i) - pzibinom(0:size, size, prob, phi=phi) # Should be 0s
+max(abs(cumsum(i) - pzibinom(0:size, size, prob, phi=phi))) # Should be 0
table(rzibinom(100, size, prob, phi=phi))
table(qzibinom(runif(100), size, prob, phi=phi))
diff --git a/man/zinbUC.Rd b/man/zinegbinUC.Rd
similarity index 69%
rename from man/zinbUC.Rd
rename to man/zinegbinUC.Rd
index b2a0c45..8bd8465 100644
--- a/man/zinbUC.Rd
+++ b/man/zinegbinUC.Rd
@@ -1,9 +1,9 @@
-\name{Zinb}
-\alias{Zinb}
-\alias{dzinb}
-\alias{pzinb}
-\alias{qzinb}
-\alias{rzinb}
+\name{Zinegbin}
+\alias{Zinegbin}
+\alias{dzinegbin}
+\alias{pzinegbin}
+\alias{qzinegbin}
+\alias{rzinegbin}
%- Also NEED an '\alias' for EACH other topic documented here.
\title{ Zero-Inflated Negative Binomial Distribution }
\description{
@@ -12,10 +12,10 @@
}
\usage{
-dzinb(x, phi, size, prob=NULL, munb=NULL, log=FALSE)
-pzinb(q, phi, size, prob=NULL, munb=NULL)
-qzinb(p, phi, size, prob=NULL, munb=NULL)
-rzinb(n, phi, size, prob=NULL, munb=NULL)
+dzinegbin(x, phi, size, prob=NULL, munb=NULL, log=FALSE)
+pzinegbin(q, phi, size, prob=NULL, munb=NULL)
+qzinegbin(p, phi, size, prob=NULL, munb=NULL)
+rzinegbin(n, phi, size, prob=NULL, munb=NULL)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
@@ -50,10 +50,10 @@ rzinb(n, phi, size, prob=NULL, munb=NULL)
}
\value{
- \code{dzinb} gives the density,
- \code{pzinb} gives the distribution function,
- \code{qzinb} gives the quantile function, and
- \code{rzinb} generates random deviates.
+ \code{dzinegbin} gives the density,
+ \code{pzinegbin} gives the distribution function,
+ \code{qzinegbin} gives the quantile function, and
+ \code{rzinegbin} generates random deviates.
}
%\references{ }
\author{ Thomas W. Yee }
@@ -70,22 +70,22 @@ rzinb(n, phi, size, prob=NULL, munb=NULL)
}
\examples{
-munb = 3; phi = 0.2; k = 10
+munb = 3; phi = 0.2; size = k = 10
x = 0:10
-(i = dzinb(x, phi=phi, mu=munb, size=k))
-cumsum(i) - pzinb(x, phi=phi, mu=munb, size=k) # Should be 0s
-table(rzinb(100, phi=phi, mu=munb, size=k))
+(i = dzinegbin(x, phi=phi, mu=munb, size=k))
+max(abs(cumsum(i) - pzinegbin(x, phi=phi, mu=munb, size=k))) # Should be 0
+table(rzinegbin(100, phi=phi, mu=munb, size=k))
-table(qzinb(runif(1000), phi=phi, mu=munb, size=k))
-round(dzinb(x, phi=phi, mu=munb, size=k) * 1000) # Should be similar
+table(qzinegbin(runif(1000), phi=phi, mu=munb, size=k))
+round(dzinegbin(x, phi=phi, mu=munb, size=k) * 1000) # Should be similar
\dontrun{
-barplot(rbind(dzinb(x, phi=phi, mu=munb, size=k),
+barplot(rbind(dzinegbin(x, phi=phi, mu=munb, size=k),
dnbinom(x, mu=munb, size=k)),
beside = TRUE, col = c("blue","green"),
main=paste("ZINB(mu=", munb, ", k=", k, ", phi=", phi,
") (blue) vs negative binomial(mu=", munb,
- ", k=", k, ") (green)", sep=""),
+ ", size=", k, ") (green)", sep=""),
names.arg = as.character(x))
}
}
diff --git a/man/zinegbinomial.Rd b/man/zinegbinomial.Rd
index 6383889..f268741 100644
--- a/man/zinegbinomial.Rd
+++ b/man/zinegbinomial.Rd
@@ -109,7 +109,9 @@ zinegbinomial(lphi="logit", lmunb = "loge", lk = "loge",
}
\section{Warning }{
- Numerical problems can occur.
+ Numerical problems can occur, e.g., when the probability of
+ zero is actually less than, not more than, the nominal
+ probability of zero.
Half-stepping is not uncommon.
If failure to converge occurs, try using combinations of
\code{method.init},
@@ -121,7 +123,7 @@ zinegbinomial(lphi="logit", lmunb = "loge", lk = "loge",
}
\seealso{
- \code{\link{Zinb}},
+ \code{\link{Zinegbin}},
\code{\link{negbinomial}},
\code{\link[stats:negative binomial]{rpois}}.
@@ -131,8 +133,8 @@ x = runif(n <- 1000)
phi = logit(-0.5+1*x, inverse=TRUE)
munb = exp(3+x)
k = exp(0+2*x)
-y1 = rzinb(n, phi, mu=munb, size=k)
-y2 = rzinb(n, phi, mu=munb, size=k)
+y1 = rzinegbin(n, phi, mu=munb, size=k)
+y2 = rzinegbin(n, phi, mu=munb, size=k)
table(y1)["0"] / sum(table(y1))
table(y2)["0"] / sum(table(y2))
fit = vglm(cbind(y1,y2) ~ x, zinegbinomial(zero=NULL), trace=TRUE)
diff --git a/man/zipebcom.Rd b/man/zipebcom.Rd
index 0dca0fb..e61d684 100644
--- a/man/zipebcom.Rd
+++ b/man/zipebcom.Rd
@@ -118,7 +118,7 @@ zipebcom(lmu12="cloglog", lphi12="logit", loratio="loge",
If \eqn{\phi=0}{phi=0} then \code{zipebcom()} should be equivalent to
\code{binom2.or("cloglog", exch=TRUE)}.
- Full details are given in Yee and Dirnbock (2008).
+ Full details are given in Yee and Dirnbock (2009).
The leading \eqn{2 \times 2}{2 x 2} submatrix of the expected
information matrix (EIM) is of rank-1, not 2! This is due to the
@@ -149,10 +149,9 @@ zipebcom(lmu12="cloglog", lphi12="logit", loratio="loge",
}
\references{
- Yee, T. W. and Dirnbock, T. (2008)
- A model for species presence/absence data at two time
- points based on an odds ratio and zero-inflated Poisson
- distribution.
+ Yee, T. W. and Dirnbock, T. (2009)
+ Models for species' presence/absence data at two time
+ points based on constrained ordination and odds ratio.
In preparation.
}
diff --git a/man/zipfUC.Rd b/man/zipfUC.Rd
index 6344d03..adf3a77 100644
--- a/man/zipfUC.Rd
+++ b/man/zipfUC.Rd
@@ -52,7 +52,7 @@ proby = dzipf(y, N=N, s=s)
plot(y, proby, type="h", col="blue", ylab="P[Y=y]", ylim=c(0,0.2),
main=paste("Zipf(N=",N,", s=",s,")", sep=""))
sum(proby) # Should be 1
-max(abs(cumsum(proby) - pzipf(y, N=N, s=s))) # Should be 0
+max(abs(cumsum(proby) - pzipf(y, N=N, s=s))) # Should be 0
}
}
\keyword{distribution}
diff --git a/man/zipoisUC.Rd b/man/zipoisUC.Rd
index d05ef3b..a77a677 100644
--- a/man/zipoisUC.Rd
+++ b/man/zipoisUC.Rd
@@ -12,7 +12,7 @@
}
\usage{
-dzipois(x, lambda, phi = 0)
+dzipois(x, lambda, phi = 0, log = FALSE)
pzipois(q, lambda, phi = 0)
qzipois(p, lambda, phi = 0)
rzipois(n, lambda, phi = 0)
@@ -29,6 +29,7 @@ rzipois(n, lambda, phi = 0)
to the response having an ordinary Poisson distribution.
}
+ \item{log}{ Logical. Return the logarithm of the answer? }
}
\details{
The probability function of \eqn{Y} is 0 with probability
@@ -55,14 +56,15 @@ rzipois(n, lambda, phi = 0)
\seealso{
\code{\link[stats:Poisson]{dpois}},
\code{\link{zipoisson}},
- \code{\link{rzinb}}.
+ \code{\link{rzinegbin}}.
}
\examples{
lambda = 3
phi = 0.2
-(i = dzipois(0:7, lambda, phi))
-cumsum(i) - pzipois(0:7, lambda, phi) # Should be 0s
+x <- (-1):7
+(i = dzipois(x, lambda, phi))
+max(abs(cumsum(i) - pzipois(x, lambda, phi))) # Should be 0
table(rzipois(100, lambda, phi))
table(qzipois(runif(100), lambda, phi))
diff --git a/man/zipoisson.Rd b/man/zipoisson.Rd
index e1f29ca..043f214 100644
--- a/man/zipoisson.Rd
+++ b/man/zipoisson.Rd
@@ -116,7 +116,11 @@ zipoisson(lphi="logit", llambda = "loge",
}
\section{Warning }{
- Numerical problems can occur.
+ Numerical problems can occur, e.g., when the probability of
+ zero is actually less than, not more than, the nominal
+ probability of zero.
+ For example, in the Angers and Biswas (2003) data below,
+ replacing 182 by 1 results in nonconvergence.
Half-stepping is not uncommon.
If failure to converge occurs, try using combinations of
\code{method.init},
@@ -158,6 +162,10 @@ y = 0:7
w = c(182, 41, 12, 2, 2, 0, 0, 1)
y = y[w>0]
w = w[w>0]
+\dontrun{
+# The zero is deflated, not inflated, giving convergence problems
+w[1] = 1
+}
fit = vglm(y ~ 1, zipoisson(lphi=probit, iphi=0.3), wei=w, tra=TRUE)
fit at misc$prob0 # Estimate of P(Y=0)
coef(fit, matrix=TRUE)
diff --git a/src/fgam.f b/src/fgam.f
index 5ab50a7..333aadb 100644
--- a/src/fgam.f
+++ b/src/fgam.f
@@ -46,8 +46,8 @@ c preceding one of lower order, and combined with the values of b-
c splines of corresponding order in dbiatx to produce the desired
c values.
c
- integer k,left,nderiv, i,ideriv,il,j,jlow,jp1mid,kp1,kp1mm
- * ,ldummy,m,mhigh
+ integer k,left,nderiv, i,ideriv,il,j,jlow,jp1mid,kp1,kp1mm,
+ * ldummy,m,mhigh
double precision a(k,k),dbiatx(k,nderiv),t(1),x
double precision factor,fkp1mm,sum
mhigh = max0(min0(nderiv,k),1)
@@ -210,8 +210,12 @@ c
99 return
end
- double precision function bvalue ( t, bcoef, n, k, x, jderiv )
+
+
+c 20090105; converted bvalue into a subroutine.
+ subroutine wbvalue ( t, bcoef, n, k, x, jderiv, bvalue)
implicit double precision(a-h,o-z)
+ double precision bvalue
calls vinterv
c
calculates value at x of jderiv-th derivative of spline from b-repr.
@@ -274,7 +278,7 @@ c dimension t(n+k)
current fortran standard makes it impossible to specify the length of
c t precisely without the introduction of otherwise superfluous
c additional arguments.
- bvalue = 0.
+ bvalue = 0.0d0
if (jderiv .ge. k) go to 99
c
c *** find i s.t. 1 .le. i .lt. n+k and t(i) .lt. t(i+1) and
diff --git a/src/lerchphi.c b/src/lerchphi.c
index 6aabbb2..e99dc90 100644
--- a/src/lerchphi.c
+++ b/src/lerchphi.c
@@ -117,12 +117,15 @@ static int aj1234(double *z, double *s, double *v, int j, double *acc, double *r
int lerchphi(double *z, double *s, double *v, double *acc,
double *result, int *iter)
{
-
+
const unsigned short int beta = 1, n = 0, imax = 100;
unsigned short int j, m;
int i, sign, flag;
double v1, sn, eps0, eps, skn, skn0, omega, *num, *den, *StoreAj,
factor, factor1, x, est, iom, sum1, cacc;
+
+/* Added 20090205 by T.Yee to suppress 4 warnings */
+sum1 = est = 0.0; StoreAj = &v1; m = 0;
/* Local copy of v. */
diff --git a/src/lms.f b/src/lms.f
index e2e600b..183f90f 100644
--- a/src/lms.f
+++ b/src/lms.f
@@ -2,11 +2,11 @@
implicit logical (a-z)
integer g8jieq
double precision psi, dwgkz6, sfnva0, fpqrt7, ghry8z(3)
- integer one, zl9udh
+ integer uxzze7, oht3ga
double precision aa, bb, ig5cma, fiumb4
logical cc, pos
- one = 1
- zl9udh = 0
+ uxzze7 = 1
+ oht3ga = 0
fiumb4 = 1.0d-04
cc = (psi .ge. 0.0d0)
if(.not.(cc))goto 23000
@@ -51,11 +51,11 @@
implicit logical (a-z)
integer ws5jcg
double precision hr83e, dwgkz6, sfnva0, fpqrt7, uvf4mp(4), ghry8z
- integer one, two, ynmzp6
+ integer uxzze7, itwo2, ynmzp6
double precision psi, hc0tub, xkwp2m(3), dq3rxy
ynmzp6 = 3
- two = 2
- one = 1
+ itwo2 = 2
+ uxzze7 = 1
dq3rxy = 1.41421356237309515d0
if(.not.(ws5jcg .gt. 0))goto 23014
ghry8z = uvf4mp(4) * (uvf4mp(2)**2 + dq3rxy * fpqrt7 * hr83e *
@@ -64,7 +64,7 @@
23014 continue
hc0tub = 0.564189583547756279d0
psi = sfnva0 + dq3rxy * fpqrt7 * hr83e
- call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, two, xkwp2m)
+ call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, itwo2, xkwp2m)
ghry8z = (dexp(-hr83e*hr83e) * hc0tub) * (xkwp2m(2)**2 + (psi -
&sfnva0) * xkwp2m(3)) / fpqrt7**2
23015 continue
@@ -75,10 +75,10 @@
implicit logical (a-z)
integer ws5jcg
double precision hr83e, dwgkz6, sfnva0, fpqrt7, uvf4mp(4), ghry8z
- integer one, two
+ integer uxzze7, itwo2
double precision psi, hc0tub, mw6reg(2), dq3rxy
- two = 2
- one = 1
+ itwo2 = 2
+ uxzze7 = 1
if(.not.(ws5jcg .gt. 0))goto 23016
ghry8z = uvf4mp(4) * (-uvf4mp(2))
goto 23017
@@ -86,7 +86,7 @@
hc0tub = 0.564189583547756279d0
dq3rxy = 1.41421356237309515d0
psi = sfnva0 + dq3rxy * fpqrt7 * hr83e
- call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, one, mw6reg)
+ call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, uxzze7, mw6reg)
ghry8z = (dexp(-hr83e*hr83e) * hc0tub) * (-mw6reg(2)) / fpqrt7**2
23017 continue
return
@@ -96,10 +96,10 @@
implicit logical (a-z)
integer ws5jcg
double precision hr83e, dwgkz6, sfnva0, fpqrt7, uvf4mp(4), ghry8z
- integer one, two
+ integer uxzze7, itwo2
double precision psi, oaqng6, mw6reg(2), dq3rxy
- two = 2
- one = 1
+ itwo2 = 2
+ uxzze7 = 1
if(.not.(ws5jcg .gt. 0))goto 23018
ghry8z = uvf4mp(4) * (-uvf4mp(2)) * dsqrt(8.0d0) * hr83e
goto 23019
@@ -107,7 +107,7 @@
oaqng6 = -1.12837916709551256d0
dq3rxy = 1.41421356237309515d0
psi = sfnva0 + dq3rxy * fpqrt7 * hr83e
- call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, one, mw6reg)
+ call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, uxzze7, mw6reg)
ghry8z = dexp(-hr83e*hr83e) * oaqng6 * mw6reg(2) * (psi - sfnva0)
&/ fpqrt7**3
23019 continue
@@ -161,10 +161,10 @@
&oqie8v(kk), dwgkz6(nfiumb4), sfnva0(nfiumb4), fpqrt7(nfiumb4),
&ghry8z(3,nfiumb4), kqoy6w
integer w3gohz, p1rifj, nd6mep, o2yadh, btip7u, epx9jf, nepms8,
- &one, two
+ &uxzze7, itwo2
double precision mu4ygk, azgts7, xmr7cj
- one = 1
- two = 2
+ uxzze7 = 1
+ itwo2 = 2
o2yadh = 12
do 23032 w3gohz = 1,nfiumb4
do 23034 nepms8=1,3
diff --git a/src/rgam.f b/src/rgam.f
index 31d3153..1b538db 100644
--- a/src/rgam.f
+++ b/src/rgam.f
@@ -68,7 +68,7 @@
ax = lspar
bx = uspar
c = 0.381966011250105097d0
- kqoy6w = 2.0d-7
+ kqoy6w = 2.0d-5
vucgi1r = 0
a = ax
b = bx
@@ -193,13 +193,15 @@
integer nb
double precision vf1jtn(nb),eh6nly(nb),mvx9at(nb),vbxpg4(nb),tb(
&nb+4)
- integer m5xudf,ilo,i6ndbu, ynmzp6, def4wn
+ integer m5xudf,ilo,i6ndbu, ynmzp6, def4wn, nbp1
integer w3gohz,p1rifj,d9rjek
+ integer tlpr2hal
double precision uq9jtc(4,3),bgu6fw(16),avoe4y(4),yw2(4), wpt
double precision uoqx2m
uoqx2m = 1.0d0 / 3.0d0
ynmzp6 = 3
def4wn = 4
+ nbp1 = nb + 1
do 23045 w3gohz = 1,nb
vf1jtn(w3gohz) = 0.0d0
eh6nly(w3gohz) = 0.0d0
@@ -208,7 +210,7 @@
23045 continue
ilo = 1
do 23047 w3gohz = 1,nb
- call vinterv(tb(1),(nb+1),tb(w3gohz),m5xudf,i6ndbu)
+ call vinterv(tb(1), nbp1 ,tb(w3gohz),m5xudf,i6ndbu)
call vbsplvd(tb,def4wn,tb(w3gohz),m5xudf,bgu6fw,uq9jtc,ynmzp6)
do 23049 p1rifj = 1,4
avoe4y(p1rifj) = uq9jtc(p1rifj,3)
@@ -221,26 +223,27 @@
if(.not.(m5xudf .ge. 4))goto 23053
do 23055 p1rifj = 1,4
d9rjek = p1rifj
- vf1jtn(m5xudf-4+p1rifj) = vf1jtn(m5xudf-4+p1rifj) + wpt * (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ tlpr2hal = m5xudf-4+p1rifj
+ vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt * (avoe4y(p1rifj)*
+ &avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(
+ &p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
d9rjek = p1rifj+1
if(.not.(d9rjek .le. 4))goto 23057
- eh6nly(m5xudf+p1rifj-4) = eh6nly(m5xudf+p1rifj-4) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ eh6nly(tlpr2hal) = eh6nly(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
23057 continue
d9rjek = p1rifj+2
if(.not.(d9rjek .le. 4))goto 23059
- mvx9at(m5xudf+p1rifj-4) = mvx9at(m5xudf+p1rifj-4) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ mvx9at(tlpr2hal) = mvx9at(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
23059 continue
d9rjek = p1rifj+3
if(.not.(d9rjek .le. 4))goto 23061
- vbxpg4(m5xudf+p1rifj-4) = vbxpg4(m5xudf+p1rifj-4) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ vbxpg4(tlpr2hal) = vbxpg4(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
23061 continue
23055 continue
goto 23054
@@ -248,20 +251,21 @@
if(.not.(m5xudf .eq. 3))goto 23063
do 23065 p1rifj = 1,3
d9rjek = p1rifj
- vf1jtn(m5xudf-3+p1rifj) = vf1jtn(m5xudf-3+p1rifj) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ tlpr2hal = m5xudf-3+p1rifj
+ vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
d9rjek = p1rifj+1
if(.not.(d9rjek .le. 3))goto 23067
- eh6nly(m5xudf+p1rifj-3) = eh6nly(m5xudf+p1rifj-3) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ eh6nly(tlpr2hal) = eh6nly(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
23067 continue
d9rjek = p1rifj+2
if(.not.(d9rjek .le. 3))goto 23069
- mvx9at(m5xudf+p1rifj-3) = mvx9at(m5xudf+p1rifj-3) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ mvx9at(tlpr2hal) = mvx9at(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
23069 continue
23065 continue
goto 23064
@@ -269,14 +273,15 @@
if(.not.(m5xudf .eq. 2))goto 23071
do 23073 p1rifj = 1,2
d9rjek = p1rifj
- vf1jtn(m5xudf-2+p1rifj) = vf1jtn(m5xudf-2+p1rifj) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ tlpr2hal = m5xudf-2+p1rifj
+ vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
d9rjek = p1rifj+1
if(.not.(d9rjek .le. 2))goto 23075
- eh6nly(m5xudf+p1rifj-2) = eh6nly(m5xudf+p1rifj-2) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ eh6nly(tlpr2hal) = eh6nly(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
23075 continue
23073 continue
goto 23072
@@ -284,9 +289,10 @@
if(.not.(m5xudf .eq. 1))goto 23077
do 23079 p1rifj = 1,1
d9rjek = p1rifj
- vf1jtn(m5xudf-1+p1rifj) = vf1jtn(m5xudf-1+p1rifj) + wpt* (avoe4y(
- &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
- &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+ tlpr2hal = m5xudf-1+p1rifj
+ vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+ &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+ &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
23079 continue
23077 continue
23072 continue
@@ -295,38 +301,40 @@
23047 continue
return
end
- subroutine gayot2(rlep7v,lunah2,p2ip, mk2vyr,nk,thfyl1,sbkvx6)
+ subroutine gayot2(rlep7v,lunah2,p2ip, mk2vyr,nk,thfyl1,isbkvx6)
implicit logical (a-z)
- integer mk2vyr,nk,thfyl1,sbkvx6
+ integer mk2vyr,nk,thfyl1,isbkvx6
double precision rlep7v(mk2vyr,nk), lunah2(mk2vyr,nk), p2ip(
&thfyl1,nk)
integer w3gohz, d9rjek, nd6mep
double precision yrbij3(3),vef2gk(2),cfko0l(1),c0,c1,c2,c3
+ double precision wxj6p6, k6nvd6, s6w6ny, ijk1l1, ya6c6v, vj6e6b,
+ &rm44is, pe0ko0, by99io
c1 = 0.0d0
c2 = 0.0d0
c3 = 0.0d0
yrbij3(1) = 0.0d0
yrbij3(2) = 0.0d0
- yrbij3(1) = 0.0d0
+ yrbij3(3) = 0.0d0
vef2gk(1) = 0.0d0
vef2gk(2) = 0.0d0
cfko0l(1) = 0.0d0
do 23081 w3gohz = 1,nk
d9rjek = nk-w3gohz+1
c0 = 1.0d0 / rlep7v(4,d9rjek)
- if(.not.(d9rjek .le. nk-3))goto 23083
+ if(.not.(d9rjek .le. (nk-3)))goto 23083
c1 = rlep7v(1,d9rjek+3)*c0
c2 = rlep7v(2,d9rjek+2)*c0
c3 = rlep7v(3,d9rjek+1)*c0
goto 23084
23083 continue
- if(.not.(d9rjek .eq. nk-2))goto 23085
+ if(.not.(d9rjek .eq. (nk-2)))goto 23085
c1 = 0.0d0
c2 = rlep7v(2,d9rjek+2)*c0
c3 = rlep7v(3,d9rjek+1)*c0
goto 23086
23085 continue
- if(.not.(d9rjek .eq. nk-1))goto 23087
+ if(.not.(d9rjek .eq. (nk-1)))goto 23087
c1 = 0.0d0
c2 = 0.0d0
c3 = rlep7v(3,d9rjek+1)*c0
@@ -340,15 +348,20 @@
23088 continue
23086 continue
23084 continue
- lunah2(1,d9rjek) = 0.0d0 - (c1*yrbij3(1)+c2*yrbij3(2)+c3*yrbij3(3)
- &)
- lunah2(2,d9rjek) = 0.0d0 - (c1*yrbij3(2)+c2*vef2gk(1)+c3*vef2gk(2)
- &)
- lunah2(3,d9rjek) = 0.0d0 - (c1*yrbij3(3)+c2*vef2gk(2)+c3*cfko0l(1)
- &)
- lunah2(4,d9rjek) = c0**2 + c1**2 * yrbij3(1) + 2.0d0*c1*c2*yrbij3(
- &2)+2.0d0*c1*c3*yrbij3(3) + c2**2 * vef2gk(1) + 2.0d0*c2*c3*vef2gk(
- &2) + c3**2 * cfko0l(1)
+ wxj6p6 = c1*yrbij3(1)
+ k6nvd6 = c2*yrbij3(2)
+ s6w6ny = c3*yrbij3(3)
+ ijk1l1 = c1*yrbij3(2)
+ ya6c6v = c2*vef2gk(1)
+ vj6e6b = c3*vef2gk(2)
+ rm44is = c1*yrbij3(3)
+ pe0ko0 = c2*vef2gk(2)
+ by99io = c3*cfko0l(1)
+ lunah2(1,d9rjek) = 0.0d0 - (wxj6p6+k6nvd6+s6w6ny)
+ lunah2(2,d9rjek) = 0.0d0 - (ijk1l1+ya6c6v+vj6e6b)
+ lunah2(3,d9rjek) = 0.0d0 - (rm44is+pe0ko0+by99io)
+ lunah2(4,d9rjek) = c0**2 + c1*(wxj6p6 + 2.0d0*(k6nvd6 + s6w6ny)) +
+ & c2*(ya6c6v + 2.0d0* vj6e6b) + c3*by99io
yrbij3(1) = vef2gk(1)
yrbij3(2) = vef2gk(2)
yrbij3(3) = lunah2(2,d9rjek)
@@ -356,7 +369,7 @@
vef2gk(2) = lunah2(3,d9rjek)
cfko0l(1) = lunah2(4,d9rjek)
23081 continue
- if(.not.(sbkvx6 .eq. 0))goto 23091
+ if(.not.(isbkvx6 .eq. 0))goto 23091
return
23091 continue
do 23093 w3gohz = 1,nk
@@ -391,21 +404,25 @@
&thfyl1,fjg0qv)
implicit logical (a-z)
integer nfiumb4,nk,rlhz2a, mk2vyr,thfyl1,fjg0qv
- double precision egoxa3,atqh0o,x(nfiumb4),y(nfiumb4),w(nfiumb4),
- &knot(nk+4), coef(nk),sz(nfiumb4),rjcq9o(nfiumb4), n9peut, dwgkz6,
- &mheq6i(nk), n7cuql(nk),dvpc8x(nk),hdv8br(nk),cbg5ys(nk), vf1jtn(
- &nk),eh6nly(nk),mvx9at(nk),vbxpg4(nk), rlep7v(mk2vyr,nk),lunah2(
- &mk2vyr,nk),p2ip(thfyl1,nk)
+ double precision egoxa3,atqh0o,x(nfiumb4),y(nfiumb4),w(nfiumb4)
+ double precision knot(nk+4), coef(nk),sz(nfiumb4),rjcq9o(nfiumb4),
+ & n9peut, dwgkz6, mheq6i(nk)
+ double precision n7cuql(nk),dvpc8x(nk),hdv8br(nk),cbg5ys(nk)
+ double precision vf1jtn(nk),eh6nly(nk),mvx9at(nk),vbxpg4(nk),
+ &rlep7v(mk2vyr,nk),lunah2(mk2vyr,nk),p2ip(thfyl1,nk)
double precision das4bx, bgu6fw(16), b0,b1,b2,b3,kqoy6w, uq9jtc(4,
- &1), xv,bvalue,df
+ &1), xv,eqdf
+ double precision zh0bs0
double precision risyv0
- integer oht3ga, ynmzp6, ilo, i6ndbu, d9rjek, w3gohz, px1yhr,
- &m5xudf, def4wn
+ integer oht3ga, ynmzp6, ilo, i6ndbu, d9rjek, w3gohz
+ integer px1yhr, m5xudf, def4wn, uxzze7, nkp1
ilo = 1
kqoy6w = 0.1d-10
oht3ga = 0
ynmzp6 = 3
def4wn = 4
+ uxzze7 = 1
+ nkp1 = nk + 1
do 23103 w3gohz = 1,nk
coef(w3gohz) = mheq6i(w3gohz)
23103 continue
@@ -429,7 +446,7 @@
px1yhr = 1
do 23115 w3gohz = 1,nfiumb4
xv = x(w3gohz)
- sz(w3gohz) = bvalue(knot,coef, nk,def4wn,xv,oht3ga)
+ call wbvalue(knot,coef, nk,def4wn,xv,oht3ga, sz(w3gohz))
23115 continue
if(.not.(rlhz2a .eq. 0))goto 23117
return
@@ -437,7 +454,7 @@
call gayot2(rlep7v,lunah2,p2ip, mk2vyr,nk,thfyl1,oht3ga)
do 23119 w3gohz = 1,nfiumb4
xv = x(w3gohz)
- call vinterv(knot(1),(nk+1),xv,m5xudf,i6ndbu)
+ call vinterv(knot(1), nkp1 ,xv,m5xudf,i6ndbu)
if(.not.(i6ndbu .eq. -1))goto 23121
m5xudf = 4
xv = knot(4) + kqoy6w
@@ -447,28 +464,28 @@
xv = knot(nk+1) - kqoy6w
23123 continue
d9rjek = m5xudf-3
- call vbsplvd(knot,4,xv,m5xudf,bgu6fw,uq9jtc,1)
+ call vbsplvd(knot,def4wn,xv,m5xudf,bgu6fw,uq9jtc,uxzze7)
b0 = uq9jtc(1,1)
b1 = uq9jtc(2,1)
b2 = uq9jtc(3,1)
b3 = uq9jtc(4,1)
- rjcq9o(w3gohz) = (lunah2(4,d9rjek)*b0**2 + 2.0d0*lunah2(3,d9rjek)*
- &b0*b1 + 2.0d0*lunah2(2,d9rjek)*b0*b2 + 2.0d0*lunah2(1,d9rjek)*b0*
- &b3 + lunah2(4,d9rjek+1)*b1**2 + 2.0d0*lunah2(3,d9rjek+1)*b1*b2 +
- &2.0d0*lunah2(2,d9rjek+1)*b1*b3 + lunah2(4,d9rjek+2)*b2**2 + 2.0d0*
- &lunah2(3,d9rjek+2)*b2*b3 + lunah2(4,d9rjek+3)*b3**2 ) * w(w3gohz)*
- &*2
+ zh0bs0 = (b0 *(lunah2(4,d9rjek)*b0 + 2.0d0*(lunah2(3,d9rjek)*b1 +
+ &lunah2(2,d9rjek)*b2 + lunah2(1,d9rjek)*b3)) + b1 *(lunah2(4,
+ &d9rjek+1)*b1 + 2.0d0*(lunah2(3,d9rjek+1)*b2 + lunah2(2,d9rjek+1)*
+ &b3)) + b2 *(lunah2(4,d9rjek+2)*b2 + 2.0d0* lunah2(3,d9rjek+2)*b3 )
+ &+ b3**2* lunah2(4,d9rjek+3)) * w(w3gohz)**2
+ rjcq9o(w3gohz) = zh0bs0
23119 continue
if(.not.(rlhz2a .eq. 1))goto 23125
das4bx = 0.0d0
- df = 0.0d0
+ eqdf = 0.0d0
risyv0 = 0.0d0
do 23127 w3gohz = 1,nfiumb4
das4bx = das4bx + ((y(w3gohz)-sz(w3gohz))*w(w3gohz))**2
- df = df + rjcq9o(w3gohz)
+ eqdf = eqdf + rjcq9o(w3gohz)
risyv0 = risyv0 + w(w3gohz)*w(w3gohz)
23127 continue
- n9peut = (das4bx/risyv0)/((1.0d0-(atqh0o+egoxa3*df)/risyv0)**2)
+ n9peut = (das4bx/risyv0)/((1.0d0-(atqh0o+egoxa3*eqdf)/risyv0)**2)
goto 23126
23125 continue
if(.not.(rlhz2a .eq. 2))goto 23129
@@ -500,7 +517,12 @@
&nfiumb4+4), wevr5o(nfiumb4), n7cuql(nfiumb4),dvpc8x(nfiumb4),
&hdv8br(nfiumb4),cbg5ys(nfiumb4)
double precision kqoy6w,uq9jtc(4,1),bgu6fw(16)
- integer d9rjek,w3gohz,ilo,m5xudf,i6ndbu
+ double precision gyn0o0, sce5d5
+ integer d9rjek,w3gohz,ilo,m5xudf,i6ndbu, nhwi2tb1
+ integer def4wn, uxzze7
+ uxzze7 = 1
+ def4wn = 4
+ nhwi2tb1 = nfiumb4 + 1
do 23135 w3gohz = 1,nfiumb4
wevr5o(w3gohz) = 0.0d0
n7cuql(w3gohz) = 0.0d0
@@ -511,7 +533,7 @@
ilo = 1
kqoy6w = 0.1d-9
do 23137 w3gohz = 1,xl6qgm
- call vinterv(onyz6j(1),(nfiumb4+1),p3vlea(w3gohz),m5xudf,i6ndbu)
+ call vinterv(onyz6j(1), nhwi2tb1 ,p3vlea(w3gohz),m5xudf,i6ndbu)
if(.not.(i6ndbu .eq. 1))goto 23139
if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23141
m5xudf = m5xudf-1
@@ -520,35 +542,31 @@
return
23142 continue
23139 continue
- call vbsplvd(onyz6j,4,p3vlea(w3gohz),m5xudf,bgu6fw,uq9jtc,1)
+ call vbsplvd(onyz6j,def4wn,p3vlea(w3gohz),m5xudf,bgu6fw,uq9jtc,
+ &uxzze7)
d9rjek = m5xudf-4+1
- wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
- &1,1)
- n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)**2
- dvpc8x(d9rjek) = dvpc8x(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)*uq9jtc(2,
- &1)
- hdv8br(d9rjek) = hdv8br(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)*uq9jtc(3,
- &1)
- cbg5ys(d9rjek) = cbg5ys(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)*uq9jtc(4,
- &1)
+ gyn0o0 = w(w3gohz)**2
+ sce5d5 = gyn0o0 * uq9jtc(1,1)
+ wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+ n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(1,1)
+ dvpc8x(d9rjek) = dvpc8x(d9rjek) + sce5d5*uq9jtc(2,1)
+ hdv8br(d9rjek) = hdv8br(d9rjek) + sce5d5*uq9jtc(3,1)
+ cbg5ys(d9rjek) = cbg5ys(d9rjek) + sce5d5*uq9jtc(4,1)
d9rjek = m5xudf-4+2
- wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
- &2,1)
- n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(2,1)**2
- dvpc8x(d9rjek) = dvpc8x(d9rjek)+w(w3gohz)**2*uq9jtc(2,1)*uq9jtc(3,
- &1)
- hdv8br(d9rjek) = hdv8br(d9rjek)+w(w3gohz)**2*uq9jtc(2,1)*uq9jtc(4,
- &1)
+ sce5d5 = gyn0o0 * uq9jtc(2,1)
+ wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+ n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(2,1)
+ dvpc8x(d9rjek) = dvpc8x(d9rjek) + sce5d5*uq9jtc(3,1)
+ hdv8br(d9rjek) = hdv8br(d9rjek) + sce5d5*uq9jtc(4,1)
d9rjek = m5xudf-4+3
- wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
- &3,1)
- n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(3,1)**2
- dvpc8x(d9rjek) = dvpc8x(d9rjek)+w(w3gohz)**2*uq9jtc(3,1)*uq9jtc(4,
- &1)
- d9rjek = m5xudf-4+4
- wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
- &4,1)
- n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(4,1)**2
+ sce5d5 = gyn0o0 * uq9jtc(3,1)
+ wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+ n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(3,1)
+ dvpc8x(d9rjek) = dvpc8x(d9rjek) + sce5d5*uq9jtc(4,1)
+ d9rjek = m5xudf
+ sce5d5 = gyn0o0 * uq9jtc(4,1)
+ wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+ n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(4,1)
23137 continue
return
end
diff --git a/src/testf90.f90 b/src/testf90.f90
index 9af38f5..f85a83d 100644
--- a/src/testf90.f90
+++ b/src/testf90.f90
@@ -74,3 +74,23 @@ end subroutine vgamf90mux34
+
+
+subroutine vgamf90memalloc(m, n)
+implicit none
+
+integer :: m, n
+real(kind(0.0d0)), allocatable :: A(:,:)
+integer :: errno
+
+allocate(A(m,n), stat=errno)
+if(errno /= 0) then ! allocation failed
+ call INTPR("in vgamf90memalloc; errno: ",-1, errno, 1)
+ stop
+end if
+
+return
+end subroutine vgamf90memalloc
+
+
+
diff --git a/src/tyeepolygamma.f b/src/tyeepolygamma.f
index 4ec7432..5fd2ef4 100644
--- a/src/tyeepolygamma.f
+++ b/src/tyeepolygamma.f
@@ -128,3 +128,28 @@
23020 continue
return
end
+ subroutine cum8sum(bz4gufr, ghry8z, nghry8z, valong, ntot,
+ ¬c4uxow)
+ implicit logical (a-z)
+ integer nghry8z, ntot, notc4uxow
+ double precision bz4gufr(ntot), ghry8z(nghry8z), valong(ntot)
+ integer w3gohz, p1rifj
+ p1rifj = 1
+ ghry8z(p1rifj) = bz4gufr(p1rifj)
+ do 23024 w3gohz=2,ntot
+ if(.not.(valong(w3gohz) .gt. valong(w3gohz-1)))goto 23026
+ ghry8z(p1rifj) = ghry8z(p1rifj) + bz4gufr(w3gohz)
+ goto 23027
+23026 continue
+ p1rifj = p1rifj + 1
+ ghry8z(p1rifj) = bz4gufr(w3gohz)
+23027 continue
+23024 continue
+ if(.not.(p1rifj .eq. nghry8z))goto 23028
+ notc4uxow = 0
+ goto 23029
+23028 continue
+ notc4uxow = 1
+23029 continue
+ return
+ end
diff --git a/src/vgam.f b/src/vgam.f
index 58ef965..424ea3a 100644
--- a/src/vgam.f
+++ b/src/vgam.f
@@ -3,14 +3,14 @@
integer nfiumb4, nk, ikscn4, lku8xq
double precision knot(nk+4), j1l0o1(nk,lku8xq), p3vlea(nfiumb4),
&ocaxi1(nfiumb4,lku8xq)
- double precision xvalue, bvalue
+ double precision xvalue
integer w3gohz, d9rjek, def4wn
def4wn = 4
do 23000 d9rjek=1,lku8xq
do 23002 w3gohz=1,nfiumb4
xvalue = p3vlea(w3gohz)
- ocaxi1(w3gohz,d9rjek) = bvalue(knot, j1l0o1(1,d9rjek), nk, def4wn,
- & xvalue, ikscn4)
+ call wbvalue(knot, j1l0o1(1,d9rjek), nk, def4wn, xvalue, ikscn4,
+ &ocaxi1(w3gohz,d9rjek))
23002 continue
23000 continue
return
@@ -97,7 +97,7 @@
integer d9rjek, w3gohz, m5xudf, i6ndbu, xi1mqb, rlhz2a
integer yc1ezl, mk2vyr, thfyl1, hts1gp(3), ispar, opf6cv
double precision kqoy6w, uq9jtc(4,1), z2djpt(16), egoxa3, n9peut,
- &bt9lgm, v2isnf, fjo2dy, fpcb2n(3)
+ &bt9lgm, v2isnf, fjo2dydf, fpcb2n(3)
do 23024 d9rjek=1,lku8xq
if(.not.(l6xrjt(d9rjek) .eq. 0.0d0))goto 23026
ispar=0
@@ -111,87 +111,103 @@
&0)))goto 23028
mk2vyr = 4
bt9lgm = 1.50d0
- v2isnf = -0.25d0
+ v2isnf = 0.00d0
thfyl1 = 1
- fjo2dy=0.001d0
+ fjo2dydf=0.001d0
+ if(.not.(lku8xq.eq.1))goto 23030
+ fjo2dydf=0.005d0
+ goto 23031
+23030 continue
+ if(.not.(lku8xq.eq.2))goto 23032
+ fjo2dydf=0.015d0
+ goto 23033
+23032 continue
+ if(.not.(lku8xq.eq.3))goto 23034
+ fjo2dydf=0.025d0
+ goto 23035
+23034 continue
+ fjo2dydf=0.045d0
+23035 continue
+23033 continue
+23031 continue
hts1gp(1) = rlhz2a
hts1gp(2) = ispar
hts1gp(3) = 300
fpcb2n(1) = v2isnf
fpcb2n(2) = bt9lgm
- fpcb2n(3) = fjo2dy
+ fpcb2n(3) = fjo2dydf
yc1ezl=0
- if(.not.((lku8xq .eq. 1) .or. (xhe4cg.eq.lku8xq)))goto 23030
- do 23032 w3gohz=1,nfiumb4
+ if(.not.((lku8xq .eq. 1) .or. (xhe4cg.eq.lku8xq)))goto 23036
+ do 23038 w3gohz=1,nfiumb4
lj4dph(w3gohz,d9rjek) = lj4dph(w3gohz,d9rjek) / w8xfic(w3gohz,
&d9rjek)
-23032 continue
+23038 continue
call nvhb7f(egoxa3, dof(d9rjek), p3vlea, lj4dph(1,d9rjek), w8xfic(
&1,d9rjek), nfiumb4,nk, onyz6j,j1l0o1(1,d9rjek), w5poyv(1,d9rjek),
&rjcq9o(1,d9rjek), n9peut,l6xrjt(d9rjek),fpcb2n, sz6ohy, yc1ezl,
&hts1gp, mk2vyr,thfyl1,la5dcf)
- if(.not.(la5dcf .ne. 0))goto 23034
+ if(.not.(la5dcf .ne. 0))goto 23040
return
-23034 continue
- do 23036 w3gohz=1,nfiumb4
+23040 continue
+ do 23042 w3gohz=1,nfiumb4
w8xfic(w3gohz,d9rjek) = w8xfic(w3gohz,d9rjek) * w8xfic(w3gohz,
&d9rjek)
-23036 continue
- if(.not.(y6jcvk .ne. 0))goto 23038
- do 23040 w3gohz=1,nfiumb4
+23042 continue
+ if(.not.(y6jcvk .ne. 0))goto 23044
+ do 23046 w3gohz=1,nfiumb4
l8dgox(w3gohz,d9rjek) = rjcq9o(w3gohz,d9rjek) / w8xfic(w3gohz,
&d9rjek)
-23040 continue
-23038 continue
- goto 23031
-23030 continue
+23046 continue
+23044 continue
+ goto 23037
+23036 continue
call nvhb7f(egoxa3, dof(d9rjek), p3vlea, cy3dhl(1,d9rjek), w8xfic(
&1,d9rjek), nfiumb4,nk, onyz6j,j1l0o1(1,d9rjek),w5poyv(1,d9rjek),
&rjcq9o(1,d9rjek), n9peut,l6xrjt(d9rjek),fpcb2n, sz6ohy, yc1ezl,
&hts1gp, mk2vyr,thfyl1,la5dcf)
- if(.not.(la5dcf .ne. 0))goto 23042
+ if(.not.(la5dcf .ne. 0))goto 23048
return
-23042 continue
- do 23044 w3gohz=1,nfiumb4
+23048 continue
+ do 23050 w3gohz=1,nfiumb4
w8xfic(w3gohz,d9rjek) = w8xfic(w3gohz,d9rjek) * w8xfic(w3gohz,
&d9rjek)
-23044 continue
-23031 continue
- if(.not.(la5dcf .ne. 0))goto 23046
+23050 continue
+23037 continue
+ if(.not.(la5dcf .ne. 0))goto 23052
return
-23046 continue
+23052 continue
23028 continue
23024 continue
- if(.not.((lku8xq .eq. 1) .or. (xhe4cg .eq. lku8xq)))goto 23048
+ if(.not.((lku8xq .eq. 1) .or. (xhe4cg .eq. lku8xq)))goto 23054
return
-23048 continue
- do 23050 w3gohz=1,nk
- do 23052 d9rjek=1,lku8xq
+23054 continue
+ do 23056 w3gohz=1,nk
+ do 23058 d9rjek=1,lku8xq
cy3dhl(d9rjek,w3gohz)=0.0d0
-23052 continue
-23050 continue
- do 23054 w3gohz=1,(nk*lku8xq)
- do 23056 d9rjek=1,a51l0o
- nkzg2p(d9rjek,w3gohz) = 0.0d0
+23058 continue
23056 continue
-23054 continue
+ do 23060 w3gohz=1,(nk*lku8xq)
+ do 23062 d9rjek=1,a51l0o
+ nkzg2p(d9rjek,w3gohz) = 0.0d0
+23062 continue
+23060 continue
kqoy6w = 0.1d-9
- do 23058 w3gohz=1,nfiumb4
+ do 23064 w3gohz=1,nfiumb4
call vinterv(onyz6j(1),(nk+1),p3vlea(w3gohz),m5xudf,i6ndbu)
- if(.not.(i6ndbu .eq. 1))goto 23060
- if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23062
+ if(.not.(i6ndbu .eq. 1))goto 23066
+ if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23068
m5xudf=m5xudf-1
- goto 23063
-23062 continue
+ goto 23069
+23068 continue
return
-23063 continue
-23060 continue
+23069 continue
+23066 continue
call vbsplvd(onyz6j,4,p3vlea(w3gohz),m5xudf,z2djpt,uq9jtc,1)
d9rjek= m5xudf-4+1
- do 23064 xi1mqb=1,lku8xq
+ do 23070 xi1mqb=1,lku8xq
cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
&xi1mqb) * uq9jtc(1,1)
-23064 continue
+23070 continue
call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 1, 1,
&lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
call wgy5ta(w3gohz, d9rjek, 1, uq9jtc, nkzg2p, w8xfic, 1, 2,
@@ -201,10 +217,10 @@
call wgy5ta(w3gohz, d9rjek, 3, uq9jtc, nkzg2p, w8xfic, 1, 4,
&lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
d9rjek= m5xudf-4+2
- do 23066 xi1mqb=1,lku8xq
+ do 23072 xi1mqb=1,lku8xq
cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
&xi1mqb) * uq9jtc(2,1)
-23066 continue
+23072 continue
call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 2, 2,
&lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
call wgy5ta(w3gohz, d9rjek, 1, uq9jtc, nkzg2p, w8xfic, 2, 3,
@@ -212,37 +228,37 @@
call wgy5ta(w3gohz, d9rjek, 2, uq9jtc, nkzg2p, w8xfic, 2, 4,
&lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
d9rjek= m5xudf-4+3
- do 23068 xi1mqb=1,lku8xq
+ do 23074 xi1mqb=1,lku8xq
cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
&xi1mqb) * uq9jtc(3,1)
-23068 continue
+23074 continue
call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 3, 3,
&lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
call wgy5ta(w3gohz, d9rjek, 1, uq9jtc, nkzg2p, w8xfic, 3, 4,
&lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
d9rjek= m5xudf-4+4
- do 23070 xi1mqb=1,lku8xq
+ do 23076 xi1mqb=1,lku8xq
cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
&xi1mqb) * uq9jtc(4,1)
-23070 continue
+23076 continue
call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 4, 4,
&lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
-23058 continue
+23064 continue
call poqy8c(vb81l0(1,1), vb81l0(1,2), vb81l0(1,3), vb81l0(1,4),
&onyz6j, nk)
call j3navf(nkzg2p, nk, lku8xq, a51l0o, l6xrjt, vb81l0)
call vdpbfa7(nkzg2p, a51l0o, nk*lku8xq, a51l0o-1, fjg0qv, vb81l0)
- if(.not.(fjg0qv .ne. 0))goto 23072
+ if(.not.(fjg0qv .ne. 0))goto 23078
return
-23072 continue
+23078 continue
call vdpbsl7(nkzg2p, a51l0o, nk*lku8xq, a51l0o-1, cy3dhl, vb81l0)
opf6cv = 0
- do 23074 w3gohz=1,nk
- do 23076 d9rjek=1,lku8xq
+ do 23080 w3gohz=1,nk
+ do 23082 d9rjek=1,lku8xq
opf6cv = opf6cv + 1
j1l0o1(w3gohz,d9rjek) = cy3dhl(d9rjek,w3gohz)
-23076 continue
-23074 continue
+23082 continue
+23080 continue
call ye3zvn(onyz6j, p3vlea, j1l0o1, nfiumb4, nk, lku8xq, w5poyv)
call gyzcj5(nkzg2p, nkzg2p, vb81l0, zxao0o, a51l0o-1, nk*lku8xq)
call jiyw4z(nkzg2p, p3vlea, onyz6j, l8dgox, a51l0o, nfiumb4, nk,
@@ -256,15 +272,17 @@
integer nfiumb4, nk, lku8xq
double precision knot(nk+4), p3vlea(nfiumb4), j1l0o1(nk,lku8xq),
&w5poyv(nfiumb4,lku8xq)
- double precision xvalue, bvalue
- integer w3gohz, d9rjek
- do 23078 w3gohz=1,nfiumb4
+ double precision xvalue
+ integer w3gohz, d9rjek, oht3ga, def4wn
+ oht3ga = 0
+ def4wn = 4
+ do 23084 w3gohz=1,nfiumb4
xvalue = p3vlea(w3gohz)
- do 23080 d9rjek=1,lku8xq
- w5poyv(w3gohz,d9rjek) = bvalue(knot, j1l0o1(1,d9rjek), nk, 4,
- &xvalue, 0)
-23080 continue
-23078 continue
+ do 23086 d9rjek=1,lku8xq
+ call wbvalue(knot, j1l0o1(1,d9rjek), nk, def4wn, xvalue, oht3ga,
+ &w5poyv(w3gohz,d9rjek))
+23086 continue
+23084 continue
return
end
subroutine vsuff9(nfiumb4,uxs1iq,ynk9ah, p3vlea,jmwo0z,w8xfic,
@@ -279,138 +297,138 @@
&uxs1iq,1), f0pzmy(zkjqhi,uxs1iq), lg3zhr(uxs1iq,lku8xq), bgu6fw(
&lku8xq,lku8xq+1), ve2mqu(du8jbv,du8jbv+1), ifo4ew(lku8xq,du8jbv)
integer w3gohz, d9rjek, nd6mep, xi1mqb, i1nkrb, j0qwtz
- integer uxzze7
- uxzze7 = 1
- if(.not.(wj5shg .eq. 1))goto 23082
- if(.not.((zkjqhi .ne. xhe4cg) .or. (du8jbv .ne. lku8xq)))goto 2308
- &4
+ integer oneint
+ oneint = 1
+ if(.not.(wj5shg .eq. 1))goto 23088
+ if(.not.((zkjqhi .ne. xhe4cg) .or. (du8jbv .ne. lku8xq)))goto 2309
+ &0
c4uxow = 0
return
-23084 continue
-23082 continue
+23090 continue
+23088 continue
j0qwtz = lku8xq * (lku8xq+1) / 2
- if(.not.(xhe4cg .gt. j0qwtz))goto 23086
-23086 continue
+ if(.not.(xhe4cg .gt. j0qwtz))goto 23092
+23092 continue
call qh4ulb(zqve1l, vvl1li, lku8xq)
- do 23088 w3gohz=1,nfiumb4
+ do 23094 w3gohz=1,nfiumb4
qxy6aj(ynk9ah(w3gohz))=p3vlea(w3gohz)
-23088 continue
- do 23090 d9rjek=1,lku8xq
- do 23092 w3gohz=1,uxs1iq
+23094 continue
+ do 23096 d9rjek=1,lku8xq
+ do 23098 w3gohz=1,uxs1iq
lg3zhr(w3gohz,d9rjek) = 0.0d0
-23092 continue
-23090 continue
- do 23094 d9rjek=1,xhe4cg
- do 23096 w3gohz=1,uxs1iq
- ax1cdp(w3gohz,d9rjek) = 0.0d0
+23098 continue
23096 continue
-23094 continue
- if(.not.(xhe4cg .ne. j0qwtz))goto 23098
- do 23100 nd6mep=1,lku8xq
- do 23102 d9rjek=1,lku8xq
- bgu6fw(d9rjek,nd6mep) = 0.0d0
+ do 23100 d9rjek=1,xhe4cg
+ do 23102 w3gohz=1,uxs1iq
+ ax1cdp(w3gohz,d9rjek) = 0.0d0
23102 continue
23100 continue
-23098 continue
- do 23104 w3gohz=1,nfiumb4
- do 23106 d9rjek=1,xhe4cg
+ if(.not.(xhe4cg .ne. j0qwtz))goto 23104
+ do 23106 nd6mep=1,lku8xq
+ do 23108 d9rjek=1,lku8xq
+ bgu6fw(d9rjek,nd6mep) = 0.0d0
+23108 continue
+23106 continue
+23104 continue
+ do 23110 w3gohz=1,nfiumb4
+ do 23112 d9rjek=1,xhe4cg
bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek)) = w8xfic(w3gohz,d9rjek)
bgu6fw(vvl1li(d9rjek),zqve1l(d9rjek)) = bgu6fw(zqve1l(d9rjek),
&vvl1li(d9rjek))
-23106 continue
- do 23108 d9rjek=1,lku8xq
- do 23110 nd6mep=1,lku8xq
+23112 continue
+ do 23114 d9rjek=1,lku8xq
+ do 23116 nd6mep=1,lku8xq
lg3zhr(ynk9ah(w3gohz),d9rjek) = lg3zhr(ynk9ah(w3gohz),d9rjek) +
&bgu6fw(d9rjek,nd6mep)*jmwo0z(w3gohz,nd6mep)
-23110 continue
-23108 continue
- do 23112 d9rjek=1,xhe4cg
+23116 continue
+23114 continue
+ do 23118 d9rjek=1,xhe4cg
ax1cdp(ynk9ah(w3gohz),d9rjek) = ax1cdp(ynk9ah(w3gohz),d9rjek) +
&w8xfic(w3gohz,d9rjek)
-23112 continue
-23104 continue
+23118 continue
+23110 continue
c4uxow = 1
- if(.not.(wj5shg .eq. 1))goto 23114
- do 23116 w3gohz=1,uxs1iq
- do 23118 d9rjek=1,xhe4cg
+ if(.not.(wj5shg .eq. 1))goto 23120
+ do 23122 w3gohz=1,uxs1iq
+ do 23124 d9rjek=1,xhe4cg
bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek)) = ax1cdp(w3gohz,d9rjek)
bgu6fw(vvl1li(d9rjek),zqve1l(d9rjek)) = bgu6fw(zqve1l(d9rjek),
&vvl1li(d9rjek))
-23118 continue
- do 23120 d9rjek=1,lku8xq
+23124 continue
+ do 23126 d9rjek=1,lku8xq
bgu6fw(d9rjek,lku8xq+1)=lg3zhr(w3gohz,d9rjek)
-23120 continue
- call vcholf(bgu6fw, bgu6fw(1,lku8xq+1), lku8xq, c4uxow, uxzze7)
- if(.not.(c4uxow .ne. 1))goto 23122
- return
-23122 continue
- if(.not.(x6rito .ne. 0))goto 23124
- do 23126 d9rjek=1,xhe4cg
- f0pzmy(d9rjek,w3gohz) = bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek))
23126 continue
-23124 continue
- do 23128 d9rjek=1,lku8xq
- bz3pyo(w3gohz,d9rjek)=bgu6fw(d9rjek,lku8xq+1)
+ call vcholf(bgu6fw, bgu6fw(1,lku8xq+1), lku8xq, c4uxow, oneint)
+ if(.not.(c4uxow .ne. 1))goto 23128
+ return
23128 continue
-23116 continue
- goto 23115
-23114 continue
- if(.not.(xhe4cg .ne. j0qwtz))goto 23130
- do 23132 d9rjek=1,lku8xq
- do 23134 nd6mep=1,lku8xq
- bgu6fw(d9rjek,nd6mep) = 0.0d0
-23134 continue
+ if(.not.(x6rito .ne. 0))goto 23130
+ do 23132 d9rjek=1,xhe4cg
+ f0pzmy(d9rjek,w3gohz) = bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek))
23132 continue
23130 continue
- do 23136 w3gohz=1,uxs1iq
+ do 23134 d9rjek=1,lku8xq
+ bz3pyo(w3gohz,d9rjek)=bgu6fw(d9rjek,lku8xq+1)
+23134 continue
+23122 continue
+ goto 23121
+23120 continue
+ if(.not.(xhe4cg .ne. j0qwtz))goto 23136
+ do 23138 d9rjek=1,lku8xq
+ do 23140 nd6mep=1,lku8xq
+ bgu6fw(d9rjek,nd6mep) = 0.0d0
+23140 continue
+23138 continue
+23136 continue
+ do 23142 w3gohz=1,uxs1iq
call qh4ulb(zqve1l, vvl1li, lku8xq)
- do 23138 d9rjek=1,xhe4cg
+ do 23144 d9rjek=1,xhe4cg
bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek)) = ax1cdp(w3gohz,d9rjek)
bgu6fw(vvl1li(d9rjek),zqve1l(d9rjek)) = bgu6fw(zqve1l(d9rjek),
&vvl1li(d9rjek))
-23138 continue
- do 23140 d9rjek=1,lku8xq
+23144 continue
+ do 23146 d9rjek=1,lku8xq
bgu6fw(d9rjek,lku8xq+1)=lg3zhr(w3gohz,d9rjek)
-23140 continue
- do 23142 d9rjek=1,du8jbv
- do 23144 nd6mep=d9rjek,du8jbv
+23146 continue
+ do 23148 d9rjek=1,du8jbv
+ do 23150 nd6mep=d9rjek,du8jbv
ve2mqu(d9rjek,nd6mep) = 0.0d0
- do 23146 xi1mqb=1,lku8xq
- do 23148 i1nkrb=1,lku8xq
+ do 23152 xi1mqb=1,lku8xq
+ do 23154 i1nkrb=1,lku8xq
ve2mqu(d9rjek,nd6mep) = ve2mqu(d9rjek,nd6mep) + ifo4ew(xi1mqb,
&d9rjek) * bgu6fw(xi1mqb,i1nkrb) * ifo4ew(i1nkrb,nd6mep)
+23154 continue
+23152 continue
+23150 continue
23148 continue
-23146 continue
-23144 continue
-23142 continue
call qh4ulb(zqve1l, vvl1li, du8jbv)
- do 23150 d9rjek=1,zkjqhi
+ do 23156 d9rjek=1,zkjqhi
ax1cdp(w3gohz,d9rjek) = ve2mqu(zqve1l(d9rjek),vvl1li(d9rjek))
-23150 continue
- do 23152 d9rjek=1,du8jbv
+23156 continue
+ do 23158 d9rjek=1,du8jbv
ve2mqu(d9rjek,du8jbv+1) = 0.0d0
- do 23154 xi1mqb=1,lku8xq
+ do 23160 xi1mqb=1,lku8xq
ve2mqu(d9rjek,du8jbv+1) = ve2mqu(d9rjek,du8jbv+1) + ifo4ew(xi1mqb,
&d9rjek) * bgu6fw(xi1mqb,lku8xq+1)
-23154 continue
-23152 continue
- do 23156 d9rjek=1,du8jbv
+23160 continue
+23158 continue
+ do 23162 d9rjek=1,du8jbv
lg3zhr(w3gohz,d9rjek) = ve2mqu(d9rjek,du8jbv+1)
-23156 continue
- call vcholf(ve2mqu, ve2mqu(1,du8jbv+1), du8jbv, c4uxow, uxzze7)
- if(.not.(c4uxow .ne. 1))goto 23158
+23162 continue
+ call vcholf(ve2mqu, ve2mqu(1,du8jbv+1), du8jbv, c4uxow, oneint)
+ if(.not.(c4uxow .ne. 1))goto 23164
return
-23158 continue
- if(.not.(x6rito .ne. 0))goto 23160
- do 23162 d9rjek=1,zkjqhi
+23164 continue
+ if(.not.(x6rito .ne. 0))goto 23166
+ do 23168 d9rjek=1,zkjqhi
f0pzmy(d9rjek,w3gohz) = ve2mqu(zqve1l(d9rjek),vvl1li(d9rjek))
-23162 continue
-23160 continue
- do 23164 d9rjek=1,du8jbv
+23168 continue
+23166 continue
+ do 23170 d9rjek=1,du8jbv
bz3pyo(w3gohz,d9rjek) = ve2mqu(d9rjek,du8jbv+1)
-23164 continue
-23136 continue
-23115 continue
+23170 continue
+23142 continue
+23121 continue
return
end
subroutine jiyw4z(n5fkml, p3vlea, onyz6j, svpr1i, a51l0o, nfiumb4,
@@ -424,52 +442,52 @@
&lku8xq,lku8xq), w8xfic(nfiumb4,xhe4cg), rjcq9o(nfiumb4,lku8xq)
integer w3gohz, d9rjek, nd6mep, m5xudf, i6ndbu, xi1mqb, i1nkrb
double precision kqoy6w, z2djpt(16), uq9jtc(4,1)
- if(.not.(ifvar .ne. 0))goto 23166
- do 23168 nd6mep=1,lku8xq
- do 23170 w3gohz=1,nfiumb4
+ if(.not.(ifvar .ne. 0))goto 23172
+ do 23174 nd6mep=1,lku8xq
+ do 23176 w3gohz=1,nfiumb4
svpr1i(w3gohz,nd6mep) = 0.0d0
-23170 continue
-23168 continue
-23166 continue
+23176 continue
+23174 continue
+23172 continue
kqoy6w = 0.10d-9
call qh4ulb(zqve1l, vvl1li, lku8xq)
- do 23172 w3gohz=1,nfiumb4
- do 23174 d9rjek=1,lku8xq
- do 23176 nd6mep=1,lku8xq
+ do 23178 w3gohz=1,nfiumb4
+ do 23180 d9rjek=1,lku8xq
+ do 23182 nd6mep=1,lku8xq
bmb(d9rjek,nd6mep)=0.0d0
-23176 continue
-23174 continue
+23182 continue
+23180 continue
call vinterv(onyz6j(1), (nk+1), p3vlea(w3gohz), m5xudf, i6ndbu)
- if(.not.(i6ndbu.eq. 1))goto 23178
- if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23180
+ if(.not.(i6ndbu.eq. 1))goto 23184
+ if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23186
m5xudf=m5xudf-1
- goto 23181
-23180 continue
+ goto 23187
+23186 continue
return
-23181 continue
-23178 continue
+23187 continue
+23184 continue
call vbsplvd(onyz6j, 4, p3vlea(w3gohz), m5xudf, z2djpt, uq9jtc, 1)
d9rjek= m5xudf-4+1
- do 23182 xi1mqb=d9rjek,d9rjek+3
+ do 23188 xi1mqb=d9rjek,d9rjek+3
call vsel(xi1mqb, xi1mqb, lku8xq, nk, a51l0o, n5fkml, bgu6fw)
call bf7qci(lku8xq, uq9jtc(xi1mqb-d9rjek+1,1) * uq9jtc(xi1mqb-
&d9rjek+1,1), bgu6fw, bmb)
-23182 continue
- do 23184 xi1mqb=d9rjek,d9rjek+3
- do 23186 i1nkrb=xi1mqb+1,d9rjek+3
+23188 continue
+ do 23190 xi1mqb=d9rjek,d9rjek+3
+ do 23192 i1nkrb=xi1mqb+1,d9rjek+3
call vsel(xi1mqb, i1nkrb, lku8xq, nk, a51l0o, n5fkml, bgu6fw)
call bf7qci(lku8xq, 2.0d0 * uq9jtc(xi1mqb-d9rjek+1,1) * uq9jtc(
&i1nkrb-d9rjek+1,1), bgu6fw, bmb)
-23186 continue
-23184 continue
- if(.not.(ifvar .ne. 0))goto 23188
- do 23190 d9rjek=1,lku8xq
- svpr1i(w3gohz,d9rjek) = bmb(d9rjek,d9rjek)
+23192 continue
23190 continue
-23188 continue
+ if(.not.(ifvar .ne. 0))goto 23194
+ do 23196 d9rjek=1,lku8xq
+ svpr1i(w3gohz,d9rjek) = bmb(d9rjek,d9rjek)
+23196 continue
+23194 continue
call dp2zwv(bmb, w8xfic, bgu6fw, rjcq9o, lku8xq, nfiumb4, xhe4cg,
&zqve1l, vvl1li, w3gohz)
-23172 continue
+23178 continue
return
end
subroutine bf7qci(lku8xq, uq9jtc, bgu6fw, bmb)
@@ -477,16 +495,16 @@
integer lku8xq
double precision uq9jtc, bgu6fw(lku8xq,lku8xq), bmb(lku8xq,lku8xq)
integer d9rjek, nd6mep
- do 23192 d9rjek=1,lku8xq
- do 23194 nd6mep=1,lku8xq
+ do 23198 d9rjek=1,lku8xq
+ do 23200 nd6mep=1,lku8xq
bgu6fw(d9rjek,nd6mep) = bgu6fw(d9rjek,nd6mep) * uq9jtc
-23194 continue
-23192 continue
- do 23196 d9rjek=1,lku8xq
- do 23198 nd6mep=1,lku8xq
- bmb(nd6mep,d9rjek) = bmb(nd6mep,d9rjek) + bgu6fw(nd6mep,d9rjek)
+23200 continue
23198 continue
-23196 continue
+ do 23202 d9rjek=1,lku8xq
+ do 23204 nd6mep=1,lku8xq
+ bmb(nd6mep,d9rjek) = bmb(nd6mep,d9rjek) + bgu6fw(nd6mep,d9rjek)
+23204 continue
+23202 continue
return
end
subroutine vsel(s, t, lku8xq, nk, a51l0o, minv, bgu6fw)
@@ -494,34 +512,34 @@
integer s, t, lku8xq, nk, a51l0o
double precision minv(a51l0o,nk*lku8xq), bgu6fw(lku8xq,lku8xq)
integer w3gohz, d9rjek, y9eilo, pazyk8
- do 23200 w3gohz=1,lku8xq
- do 23202 d9rjek=1,lku8xq
- bgu6fw(w3gohz,d9rjek) = 0.0d0
-23202 continue
-23200 continue
- if(.not.(s .ne. t))goto 23204
do 23206 w3gohz=1,lku8xq
- y9eilo = (s-1)*lku8xq + w3gohz
do 23208 d9rjek=1,lku8xq
- pazyk8 = (t-1)*lku8xq + d9rjek
- bgu6fw(w3gohz,d9rjek) = minv(a51l0o-(pazyk8-y9eilo), pazyk8)
+ bgu6fw(w3gohz,d9rjek) = 0.0d0
23208 continue
23206 continue
- goto 23205
-23204 continue
- do 23210 w3gohz=1,lku8xq
+ if(.not.(s .ne. t))goto 23210
+ do 23212 w3gohz=1,lku8xq
y9eilo = (s-1)*lku8xq + w3gohz
- do 23212 d9rjek=w3gohz,lku8xq
+ do 23214 d9rjek=1,lku8xq
pazyk8 = (t-1)*lku8xq + d9rjek
bgu6fw(w3gohz,d9rjek) = minv(a51l0o-(pazyk8-y9eilo), pazyk8)
+23214 continue
23212 continue
+ goto 23211
23210 continue
- do 23214 w3gohz=1,lku8xq
- do 23216 d9rjek=w3gohz+1,lku8xq
- bgu6fw(d9rjek,w3gohz) = bgu6fw(w3gohz,d9rjek)
+ do 23216 w3gohz=1,lku8xq
+ y9eilo = (s-1)*lku8xq + w3gohz
+ do 23218 d9rjek=w3gohz,lku8xq
+ pazyk8 = (t-1)*lku8xq + d9rjek
+ bgu6fw(w3gohz,d9rjek) = minv(a51l0o-(pazyk8-y9eilo), pazyk8)
+23218 continue
23216 continue
-23214 continue
-23205 continue
+ do 23220 w3gohz=1,lku8xq
+ do 23222 d9rjek=w3gohz+1,lku8xq
+ bgu6fw(d9rjek,w3gohz) = bgu6fw(w3gohz,d9rjek)
+23222 continue
+23220 continue
+23211 continue
return
end
subroutine dp2zwv(bmb, w8xfic, bgu6fw, rjcq9o, lku8xq, nfiumb4,
@@ -532,23 +550,23 @@
&bgu6fw(lku8xq,lku8xq), rjcq9o(nfiumb4,lku8xq)
double precision qnk4zf, temp
integer d9rjek, nd6mep, xi1mqb, i1nkrb
- do 23218 i1nkrb=1,lku8xq
- do 23220 d9rjek=1,lku8xq
- do 23222 nd6mep=1,lku8xq
+ do 23224 i1nkrb=1,lku8xq
+ do 23226 d9rjek=1,lku8xq
+ do 23228 nd6mep=1,lku8xq
bgu6fw(nd6mep,d9rjek) = 0.0d0
-23222 continue
-23220 continue
- do 23224 xi1mqb=1,xhe4cg
+23228 continue
+23226 continue
+ do 23230 xi1mqb=1,xhe4cg
temp = w8xfic(p1rifj,xi1mqb)
bgu6fw(zqve1l(xi1mqb),vvl1li(xi1mqb)) = temp
bgu6fw(vvl1li(xi1mqb),zqve1l(xi1mqb)) = temp
-23224 continue
+23230 continue
qnk4zf = 0.0d0
- do 23226 d9rjek=1,lku8xq
+ do 23232 d9rjek=1,lku8xq
qnk4zf = qnk4zf + bmb(i1nkrb,d9rjek) * bgu6fw(d9rjek,i1nkrb)
-23226 continue
+23232 continue
rjcq9o(p1rifj,i1nkrb) = qnk4zf
-23218 continue
+23224 continue
return
end
subroutine gyzcj5(n5fkml, jrxg6l, d, uu, lku8xq, nfiumb4)
@@ -560,77 +578,77 @@
n5fkml(lku8xq+1,nfiumb4) = 1.0d0 / d(nfiumb4)
j0izmn = lku8xq+1
c3qxjo = nfiumb4+1 - j0izmn
- do 23228 myx3od=c3qxjo,nfiumb4
- do 23230 w3gohz=1,j0izmn
+ do 23234 myx3od=c3qxjo,nfiumb4
+ do 23236 w3gohz=1,j0izmn
uu(w3gohz, myx3od-c3qxjo+1) = jrxg6l(w3gohz, myx3od)
-23230 continue
-23228 continue
+23236 continue
+23234 continue
w3gohz = nfiumb4-1
-23232 if(.not.(w3gohz.ge.1))goto 23234
- if(.not.(lku8xq .lt. nfiumb4-w3gohz))goto 23235
+23238 if(.not.(w3gohz.ge.1))goto 23240
+ if(.not.(lku8xq .lt. nfiumb4-w3gohz))goto 23241
p4gdax = lku8xq
- goto 23236
-23235 continue
+ goto 23242
+23241 continue
p4gdax = nfiumb4-w3gohz
-23236 continue
+23242 continue
dibm1x=1
-23237 if(.not.(dibm1x.le.p4gdax))goto 23239
+23243 if(.not.(dibm1x.le.p4gdax))goto 23245
n5fkml(-dibm1x+lku8xq+1,w3gohz+dibm1x) = 0.0d0
nd6mep=1
-23240 if(.not.(nd6mep.le.dibm1x))goto 23242
+23246 if(.not.(nd6mep.le.dibm1x))goto 23248
n5fkml(-dibm1x+lku8xq+1,w3gohz+dibm1x) = n5fkml(-dibm1x+lku8xq+1,
&w3gohz+dibm1x) - uu(-nd6mep+lku8xq+1,w3gohz+nd6mep -c3qxjo+1) *
&n5fkml(nd6mep-dibm1x+lku8xq+1,w3gohz+dibm1x)
nd6mep=nd6mep+1
- goto 23240
-23242 continue
-23243 if(.not.(nd6mep.le.p4gdax))goto 23245
+ goto 23246
+23248 continue
+23249 if(.not.(nd6mep.le.p4gdax))goto 23251
n5fkml(-dibm1x+lku8xq+1,w3gohz+dibm1x) = n5fkml(-dibm1x+lku8xq+1,
&w3gohz+dibm1x) - uu(-nd6mep+lku8xq+1,w3gohz+nd6mep -c3qxjo+1) *
&n5fkml(dibm1x-nd6mep+lku8xq+1,w3gohz+nd6mep)
nd6mep=nd6mep+1
+ goto 23249
+23251 continue
+ dibm1x=dibm1x+1
goto 23243
23245 continue
- dibm1x=dibm1x+1
- goto 23237
-23239 continue
n5fkml(lku8xq+1,w3gohz) = 1.0d0 / d(w3gohz)
dibm1x = 1
-23246 if(.not.(dibm1x.le.p4gdax))goto 23248
+23252 if(.not.(dibm1x.le.p4gdax))goto 23254
n5fkml(lku8xq+1,w3gohz) = n5fkml(lku8xq+1,w3gohz) - uu(-dibm1x+
&lku8xq+1,w3gohz+dibm1x -c3qxjo+1) * n5fkml(-dibm1x+lku8xq+1,
&w3gohz+dibm1x)
dibm1x=dibm1x+1
- goto 23246
-23248 continue
- if(.not.(w3gohz .eq. c3qxjo))goto 23249
+ goto 23252
+23254 continue
+ if(.not.(w3gohz .eq. c3qxjo))goto 23255
c3qxjo = c3qxjo-1
- if(.not.(c3qxjo .lt. 1))goto 23251
+ if(.not.(c3qxjo .lt. 1))goto 23257
c3qxjo = 1
- goto 23252
-23251 continue
+ goto 23258
+23257 continue
myx3od=j0izmn-1
-23253 if(.not.(myx3od.ge.1))goto 23255
+23259 if(.not.(myx3od.ge.1))goto 23261
nd6mep=1
-23256 if(.not.(nd6mep.le.j0izmn))goto 23258
+23262 if(.not.(nd6mep.le.j0izmn))goto 23264
uu(nd6mep,myx3od+1) = uu(nd6mep,myx3od)
nd6mep=nd6mep+1
- goto 23256
-23258 continue
+ goto 23262
+23264 continue
myx3od=myx3od-1
- goto 23253
-23255 continue
+ goto 23259
+23261 continue
nd6mep=1
-23259 if(.not.(nd6mep.le.j0izmn))goto 23261
+23265 if(.not.(nd6mep.le.j0izmn))goto 23267
uu(nd6mep,1) = jrxg6l(nd6mep,c3qxjo)
nd6mep=nd6mep+1
- goto 23259
-23261 continue
-23252 continue
-23249 continue
+ goto 23265
+23267 continue
+23258 continue
+23255 continue
w3gohz = w3gohz-1
- goto 23232
-23234 continue
+ goto 23238
+23240 continue
return
end
subroutine ntju9b(bz4guf,jmwo0z,w8xfic, nfiumb4,lku8xq,ynk9ah,
@@ -658,46 +676,46 @@
integer ybfr6z
integer w3gohz, d9rjek, nd6mep, c4bdmu, o9ljyn, tvyd2b, zx1610,
&c4uxow
- integer uxzze7
+ integer oneint
double precision kogeb2, tap0km, t7sbea
- uxzze7 = 1
- if(.not.(wj5shg .eq. 1))goto 23262
+ oneint = 1
+ if(.not.(wj5shg .eq. 1))goto 23268
ybfr6z = xhe4cg
- goto 23263
-23262 continue
+ goto 23269
+23268 continue
ybfr6z = du8jbv*(du8jbv+1)/2
-23263 continue
+23269 continue
call qh4ulb(zqve1l, vvl1li, lku8xq)
call vsuff9(nfiumb4,uxs1iq,ynk9ah, bz4guf,jmwo0z,w8xfic, vy5hmo,
&yin,win,dfsom3,lj4dph, lku8xq, xhe4cg, ybfr6z, zqve1l, vvl1li,
- &zxao0o, zxao0o(1,1,3), ifo4ew, du8jbv, wj5shg, uxzze7, c4uxow)
- if(.not.(c4uxow .ne. 1))goto 23264
+ &zxao0o, zxao0o(1,1,3), ifo4ew, du8jbv, wj5shg, oneint, c4uxow)
+ if(.not.(c4uxow .ne. 1))goto 23270
return
-23264 continue
+23270 continue
kogeb2 = vy5hmo(1)
tap0km = vy5hmo(uxs1iq)-vy5hmo(1)
- do 23266 w3gohz=1,uxs1iq
+ do 23272 w3gohz=1,uxs1iq
vy5hmo(w3gohz) = (vy5hmo(w3gohz)-kogeb2)/tap0km
-23266 continue
+23272 continue
a51l0o = 4*du8jbv
la5dcf = 0
- do 23268 d9rjek=1,du8jbv
- if(.not.(l6xrjt(d9rjek) .eq. 0.0d0))goto 23270
+ do 23274 d9rjek=1,du8jbv
+ if(.not.(l6xrjt(d9rjek) .eq. 0.0d0))goto 23276
dof(d9rjek) = dof(d9rjek) + 1.0d0
-23270 continue
-23268 continue
+23276 continue
+23274 continue
call qh4ulb(zqve1l, vvl1li, du8jbv)
call vsplin(vy5hmo,lj4dph,win,uxs1iq,qc7zyb, jko0o1,a51l0o,du8jbv,
&ybfr6z, zqve1l,vvl1li, zxao0o, l6xrjt, fjg0qv, jq8lra, j1l0o1,
&phqco4(1), phqco4(1+jko0o1*du8jbv*a51l0o), vb81l0, zo5jyl, y6jcvk,
& bmb, rjcq9o, dof, ykdc2t, la5dcf, nfiumb4)
- do 23272 d9rjek=1,du8jbv
+ do 23278 d9rjek=1,du8jbv
dof(d9rjek) = -1.0d0
- do 23274 w3gohz=1,uxs1iq
+ do 23280 w3gohz=1,uxs1iq
dof(d9rjek)=dof(d9rjek)+rjcq9o(w3gohz,d9rjek)
-23274 continue
-23272 continue
- if(.not.(du8jbv .ge. 1))goto 23276
+23280 continue
+23278 continue
+ if(.not.(du8jbv .ge. 1))goto 23282
t7sbea = 1.0d-7
c4bdmu = uxs1iq*du8jbv
o9ljyn = 2*du8jbv
@@ -707,9 +725,9 @@
call qh4ulb(zqve1l, vvl1li, du8jbv)
call mux17f(dfsom3, phqco4, du8jbv, o9ljyn, uxs1iq, zxao0o(1,1,1),
& zxao0o(1,1,2), zqve1l, vvl1li, ybfr6z, c4bdmu)
- do 23278 nd6mep=1,o9ljyn
+ do 23284 nd6mep=1,o9ljyn
i83h1(nd6mep) = nd6mep
-23278 continue
+23284 continue
call dhkt9w(phqco4,c4bdmu,c4bdmu,o9ljyn,i0qvzl,i83h1,ykdc2t,
&zx1610,t7sbea)
call qh4ulb(zqve1l, vvl1li, du8jbv)
@@ -719,33 +737,33 @@
&blq5vu,lq8reh, ykdc2t(1),vfd2pw,tvyd2b,fjg0qv)
call vbksf(dfsom3,vfd2pw,du8jbv,uxs1iq,zxao0o,zqve1l,vvl1li,
&ybfr6z)
- if(.not.(y6jcvk .ne. 0))goto 23280
+ if(.not.(y6jcvk .ne. 0))goto 23286
call vrinvf9(phqco4, c4bdmu, o9ljyn, c4uxow, s0(1,1,1), s0(1,1,2))
- if(.not.(c4uxow .ne. 1))goto 23282
+ if(.not.(c4uxow .ne. 1))goto 23288
return
-23282 continue
- do 23284 d9rjek=1,du8jbv
- do 23286 w3gohz=1,uxs1iq
+23288 continue
+ do 23290 d9rjek=1,du8jbv
+ do 23292 w3gohz=1,uxs1iq
zo5jyl(w3gohz,d9rjek) = zo5jyl(w3gohz,d9rjek) - s0(d9rjek,d9rjek,
&1) - vy5hmo(w3gohz) * (2.0d0 * s0(d9rjek,d9rjek+du8jbv,1) +
&vy5hmo(w3gohz) * s0(d9rjek+du8jbv,d9rjek+du8jbv,1))
+23292 continue
+23290 continue
23286 continue
-23284 continue
-23280 continue
- goto 23277
-23276 continue
+ goto 23283
+23282 continue
call rpfnk6(uxs1iq, vy5hmo, win, jq8lra, vfd2pw, zo5jyl, y6jcvk)
-23277 continue
- do 23288 w3gohz=1,uxs1iq
- do 23290 d9rjek=1,du8jbv
+23283 continue
+ do 23294 w3gohz=1,uxs1iq
+ do 23296 d9rjek=1,du8jbv
jq8lra(w3gohz,d9rjek) = jq8lra(w3gohz,d9rjek) - vfd2pw(d9rjek,
&w3gohz)
-23290 continue
-23288 continue
- do 23292 d9rjek=1,du8jbv
+23296 continue
+23294 continue
+ do 23298 d9rjek=1,du8jbv
call uwye7d(nfiumb4, uxs1iq, ynk9ah, jq8lra(1,d9rjek), smo(1,
&d9rjek))
-23292 continue
+23298 continue
return
end
subroutine vbfa(d8gwha,n,lku8xq,gqai81, p3vlea,jmwo0z,w8xfic,
@@ -774,9 +792,9 @@
p=gqai81(2)
q=gqai81(3)
y6jcvk= 0
- if(.not.(gqai81(4) .eq. 1))goto 23294
+ if(.not.(gqai81(4) .eq. 1))goto 23300
y6jcvk = 1
-23294 continue
+23300 continue
no2fik=gqai81(6)
zx1610=gqai81(7)
c4bdmu=gqai81(9)
@@ -787,31 +805,31 @@
la5dcf = 0
a51l0o=gqai81(15)
sehz7y = 1
- if(.not.(tiav4e .gt. 0))goto 23296
- do 23298 w3gohz=1,tiav4e
+ if(.not.(tiav4e .gt. 0))goto 23302
+ do 23304 w3gohz=1,tiav4e
ykdc2t(w3gohz) = dof(w3gohz)
ykdc2t(w3gohz+tiav4e) = l6xrjt(w3gohz)
ykdc2t(w3gohz+2*tiav4e) = dof(w3gohz)
-23298 continue
-23296 continue
+23304 continue
+23302 continue
ucgi1r = 0
-23300 if(.not.(sehz7y .ne. 0))goto 23301
+23306 if(.not.(sehz7y .ne. 0))goto 23307
ucgi1r = ucgi1r+1
- if(.not.(ucgi1r .gt. 1))goto 23302
- if(.not.(tiav4e .gt. 0))goto 23304
- do 23306 w3gohz=1,tiav4e
+ if(.not.(ucgi1r .gt. 1))goto 23308
+ if(.not.(tiav4e .gt. 0))goto 23310
+ do 23312 w3gohz=1,tiav4e
if(.not.(ykdc2t(w3gohz+tiav4e).eq.0.0d0 .and.(dabs(ykdc2t(w3gohz+
- &2*tiav4e)-dof(w3gohz))/dof(w3gohz).gt.0.05d0)))goto 23308
+ &2*tiav4e)-dof(w3gohz))/dof(w3gohz).gt.0.05d0)))goto 23314
ykdc2t(w3gohz+2*tiav4e) = dof(w3gohz)
dof(w3gohz)=ykdc2t(w3gohz)
l6xrjt(w3gohz)=0.0d0
- goto 23309
-23308 continue
+ goto 23315
+23314 continue
ykdc2t(w3gohz+2*tiav4e) = dof(w3gohz)
-23309 continue
-23306 continue
-23304 continue
-23302 continue
+23315 continue
+23312 continue
+23310 continue
+23308 continue
call xqasw0(d8gwha,n,lku8xq, p3vlea,jmwo0z,w8xfic,l6xrjt,dof,
&ynk9ah,uxs1iq,vliac4, vfd2pw,sazp9g,go0l1q,s0, lq8reh,zo5jyl,
&h4fgoy, ioqzvb,i0qvzl, zx1610,i83h1, xbig, jrxg6l, ifo4ew, ozuw3p,
@@ -820,17 +838,17 @@
&qc7zyb, das4bx, vlni8d, jko0o1, mnh3up, fg3pxq, p,q,y6jcvk,
&nucgi1r,no2fik, wk2(1,1,1), wk2(1,1,2), wk2(1,1,3), c4bdmu,
&o9ljyn, tiav4e, xhe4cg, zkjqhi, la5dcf, a51l0o)
- if(.not.(d8gwha .ne. 0))goto 23310
+ if(.not.(d8gwha .ne. 0))goto 23316
call vcall2(sehz7y,w,y,go0l1q,lq8reh,jrxg6l)
- goto 23311
-23310 continue
+ goto 23317
+23316 continue
sehz7y = 0
-23311 continue
- if(.not.(sehz7y .ne. 0))goto 23312
+23317 continue
+ if(.not.(sehz7y .ne. 0))goto 23318
zx1610=0
-23312 continue
- goto 23300
-23301 continue
+23318 continue
+ goto 23306
+23307 continue
gqai81(7) = zx1610
gqai81(5) = nucgi1r
gqai81(14) = la5dcf
@@ -869,96 +887,96 @@
t7sbea = 1.0d-7
tvyd2b = 101
fjg0qv = 1
- if(.not.(q .eq. 0))goto 23314
+ if(.not.(q .eq. 0))goto 23320
no2fik = 1
-23314 continue
- if(.not.(d8gwha .ne. 0))goto 23316
- do 23318 d9rjek=1,o9ljyn
- do 23320 w3gohz=1,c4bdmu
- ioqzvb(w3gohz,d9rjek)=xbig(w3gohz,d9rjek)
23320 continue
-23318 continue
-23316 continue
- if(.not.(zx1610.eq.0))goto 23322
+ if(.not.(d8gwha .ne. 0))goto 23322
+ do 23324 d9rjek=1,o9ljyn
+ do 23326 w3gohz=1,c4bdmu
+ ioqzvb(w3gohz,d9rjek)=xbig(w3gohz,d9rjek)
+23326 continue
+23324 continue
+23322 continue
+ if(.not.(zx1610.eq.0))goto 23328
call qh4ulb(zqve1l,vvl1li,lku8xq)
call mux17f(jrxg6l, ioqzvb, lku8xq, o9ljyn, nfiumb4, zxao0o(1,1,1)
&, zxao0o(1,1,2), zqve1l, vvl1li, zkjqhi, c4bdmu)
- do 23324 nd6mep=1,o9ljyn
+ do 23330 nd6mep=1,o9ljyn
i83h1(nd6mep) = nd6mep
-23324 continue
+23330 continue
call dhkt9w(ioqzvb,c4bdmu,c4bdmu,o9ljyn,i0qvzl,i83h1,t5vlzq,
&zx1610,t7sbea)
-23322 continue
- do 23326 d9rjek=1,lku8xq
- do 23328 w3gohz=1,nfiumb4
- go0l1q(d9rjek,w3gohz)=0.0d0
23328 continue
- if(.not.(q .gt. 0))goto 23330
- do 23332 nd6mep=1,q
- if(.not.(wj5shg(nd6mep).eq.1))goto 23334
- do 23336 w3gohz=1,nfiumb4
+ do 23332 d9rjek=1,lku8xq
+ do 23334 w3gohz=1,nfiumb4
+ go0l1q(d9rjek,w3gohz)=0.0d0
+23334 continue
+ if(.not.(q .gt. 0))goto 23336
+ do 23338 nd6mep=1,q
+ if(.not.(wj5shg(nd6mep).eq.1))goto 23340
+ do 23342 w3gohz=1,nfiumb4
go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + sazp9g(w3gohz,
&hwi2tb(nd6mep)+d9rjek-1)
-23336 continue
- goto 23335
-23334 continue
- do 23338 jbyv3q=1,ozuw3p(nd6mep)
- do 23340 w3gohz=1,nfiumb4
+23342 continue
+ goto 23341
+23340 continue
+ do 23344 jbyv3q=1,ozuw3p(nd6mep)
+ do 23346 w3gohz=1,nfiumb4
go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + ifo4ew(d9rjek,
&hwi2tb(nd6mep)+jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23340 continue
+23346 continue
+23344 continue
+23341 continue
23338 continue
-23335 continue
+23336 continue
23332 continue
-23330 continue
-23326 continue
nucgi1r = 0
dyb3po = 1.0d0
-23342 if(.not.((dyb3po .gt. h4fgoy ) .and. (nucgi1r .lt. no2fik)))goto 2
- &3343
+23348 if(.not.((dyb3po .gt. h4fgoy ) .and. (nucgi1r .lt. no2fik)))goto 2
+ &3349
nucgi1r = nucgi1r + 1
njdgw8 = 0.0d0
- do 23344 d9rjek=1,lku8xq
- do 23346 w3gohz=1,nfiumb4
+ do 23350 d9rjek=1,lku8xq
+ do 23352 w3gohz=1,nfiumb4
hr83e(w3gohz,d9rjek)=jmwo0z(w3gohz,d9rjek)-go0l1q(d9rjek,w3gohz)
-23346 continue
-23344 continue
+23352 continue
+23350 continue
call qh4ulb(zqve1l,vvl1li,lku8xq)
call mux22f(jrxg6l,hr83e, t5vlzq, zkjqhi,zqve1l,vvl1li,nfiumb4,
&lku8xq,zxao0o)
call vdqrsl(ioqzvb,c4bdmu,c4bdmu,zx1610,i0qvzl, t5vlzq, wk2,wk2,
&lq8reh, wk2,vfd2pw,tvyd2b,fjg0qv)
das4bx=0.0d0
- do 23348 w3gohz=1,nfiumb4
- do 23350 d9rjek=1,lku8xq
+ do 23354 w3gohz=1,nfiumb4
+ do 23356 d9rjek=1,lku8xq
gwu72m = t5vlzq((w3gohz-1)*lku8xq+d9rjek) - vfd2pw(d9rjek,w3gohz)
das4bx = das4bx + gwu72m * gwu72m
-23350 continue
-23348 continue
+23356 continue
+23354 continue
call vbksf(jrxg6l,vfd2pw,lku8xq,nfiumb4,zxao0o,zqve1l,vvl1li,
&zkjqhi)
- if(.not.(q .gt. 0))goto 23352
- do 23354 nd6mep=1,q
- do 23356 d9rjek=1,lku8xq
- if(.not.(wj5shg(nd6mep).eq.1))goto 23358
- do 23360 w3gohz=1,nfiumb4
+ if(.not.(q .gt. 0))goto 23358
+ do 23360 nd6mep=1,q
+ do 23362 d9rjek=1,lku8xq
+ if(.not.(wj5shg(nd6mep).eq.1))goto 23364
+ do 23366 w3gohz=1,nfiumb4
x7aort(w3gohz,d9rjek)=sazp9g(w3gohz,hwi2tb(nd6mep)+d9rjek-1)
hr83e(w3gohz,d9rjek) = jmwo0z(w3gohz,d9rjek) - vfd2pw(d9rjek,
&w3gohz) - go0l1q(d9rjek,w3gohz) + x7aort(w3gohz,d9rjek)
-23360 continue
- goto 23359
-23358 continue
- do 23362 w3gohz=1,nfiumb4
+23366 continue
+ goto 23365
+23364 continue
+ do 23368 w3gohz=1,nfiumb4
x7aort(w3gohz,d9rjek)=0.0d0
- do 23364 jbyv3q=1,ozuw3p(nd6mep)
+ do 23370 jbyv3q=1,ozuw3p(nd6mep)
x7aort(w3gohz,d9rjek)=x7aort(w3gohz,d9rjek) + ifo4ew(d9rjek,
&hwi2tb(nd6mep)+jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23364 continue
+23370 continue
hr83e(w3gohz,d9rjek) = jmwo0z(w3gohz,d9rjek) - vfd2pw(d9rjek,
&w3gohz) - go0l1q(d9rjek,w3gohz) + x7aort(w3gohz,d9rjek)
+23368 continue
+23365 continue
23362 continue
-23359 continue
-23356 continue
rbwx6v = uxs1iq(nd6mep)
call ntju9b(p3vlea(1,vliac4(nd6mep)),hr83e,w8xfic, nfiumb4,lku8xq,
&ynk9ah(1,nd6mep),rbwx6v, l6xrjt(hwi2tb(nd6mep)), dof(hwi2tb(
@@ -972,48 +990,48 @@
&4+rbwx6v)*ozuw3p(nd6mep)), t5vlzq(1+(4+2*rbwx6v)*ozuw3p(nd6mep)),
&t5vlzq(1+(4+3*rbwx6v)*ozuw3p(nd6mep)), t5vlzq(1+(4+4*rbwx6v)*
&ozuw3p(nd6mep)))
- do 23366 d9rjek=1,lku8xq
- if(.not.(wj5shg(nd6mep).eq.1))goto 23368
- do 23370 w3gohz=1,nfiumb4
+ do 23372 d9rjek=1,lku8xq
+ if(.not.(wj5shg(nd6mep).eq.1))goto 23374
+ do 23376 w3gohz=1,nfiumb4
go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + sazp9g(w3gohz,
&hwi2tb(nd6mep)+d9rjek-1)
-23370 continue
- goto 23369
-23368 continue
- do 23372 jbyv3q=1,ozuw3p(nd6mep)
- do 23374 w3gohz=1,nfiumb4
+23376 continue
+ goto 23375
+23374 continue
+ do 23378 jbyv3q=1,ozuw3p(nd6mep)
+ do 23380 w3gohz=1,nfiumb4
go0l1q(d9rjek,w3gohz)=go0l1q(d9rjek,w3gohz) + ifo4ew(d9rjek,
&hwi2tb(nd6mep)+jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23374 continue
-23372 continue
-23369 continue
- do 23376 w3gohz=1,nfiumb4
+23380 continue
+23378 continue
+23375 continue
+ do 23382 w3gohz=1,nfiumb4
go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) - x7aort(w3gohz,
&d9rjek)
-23376 continue
-23366 continue
- do 23378 d9rjek=1,lku8xq
- if(.not.(wj5shg(nd6mep) .eq. 1))goto 23380
+23382 continue
+23372 continue
+ do 23384 d9rjek=1,lku8xq
+ if(.not.(wj5shg(nd6mep) .eq. 1))goto 23386
njdgw8 = njdgw8 + jcp1ti(nfiumb4,x7aort(1,d9rjek),sazp9g(1,hwi2tb(
&nd6mep)+d9rjek-1), w8xfic(1,d9rjek))
- goto 23381
-23380 continue
- do 23382 w3gohz=1,nfiumb4
+ goto 23387
+23386 continue
+ do 23388 w3gohz=1,nfiumb4
t5vlzq(w3gohz) = 0.0d0
- do 23384 jbyv3q=1,ozuw3p(nd6mep)
+ do 23390 jbyv3q=1,ozuw3p(nd6mep)
t5vlzq(w3gohz) = t5vlzq(w3gohz) + ifo4ew(d9rjek,hwi2tb(nd6mep)+
&jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23384 continue
-23382 continue
+23390 continue
+23388 continue
njdgw8 = njdgw8 + jcp1ti(nfiumb4, x7aort(1,d9rjek), t5vlzq,
&w8xfic(1,d9rjek))
-23381 continue
-23378 continue
- do 23386 d9rjek=1,lku8xq
- do 23388 w3gohz=1,nfiumb4
+23387 continue
+23384 continue
+ do 23392 d9rjek=1,lku8xq
+ do 23394 w3gohz=1,nfiumb4
hr83e(w3gohz,d9rjek)=jmwo0z(w3gohz,d9rjek)-go0l1q(d9rjek,w3gohz)
-23388 continue
-23386 continue
+23394 continue
+23392 continue
call qh4ulb(zqve1l,vvl1li,lku8xq)
call mux22f(jrxg6l,hr83e, t5vlzq, zkjqhi,zqve1l,vvl1li,nfiumb4,
&lku8xq,zxao0o)
@@ -1021,51 +1039,51 @@
&lq8reh, wk2,vfd2pw,tvyd2b,fjg0qv)
call vbksf(jrxg6l,vfd2pw,lku8xq,nfiumb4,zxao0o,zqve1l,vvl1li,
&zkjqhi)
-23354 continue
-23352 continue
- if(.not.(q .gt. 0))goto 23390
+23360 continue
+23358 continue
+ if(.not.(q .gt. 0))goto 23396
gcjn3k=0.0d0
- do 23392 d9rjek=1,lku8xq
- do 23394 w3gohz=1,nfiumb4
+ do 23398 d9rjek=1,lku8xq
+ do 23400 w3gohz=1,nfiumb4
gcjn3k = gcjn3k + w8xfic(w3gohz,d9rjek) * go0l1q(d9rjek,w3gohz)**
&2
-23394 continue
-23392 continue
- if(.not.(gcjn3k .gt. 0.0d0))goto 23396
+23400 continue
+23398 continue
+ if(.not.(gcjn3k .gt. 0.0d0))goto 23402
dyb3po = dsqrt(njdgw8/gcjn3k)
- goto 23397
-23396 continue
+ goto 23403
+23402 continue
dyb3po = 0.0d0
-23397 continue
-23390 continue
- if(.not.(nucgi1r .eq. 1))goto 23398
+23403 continue
+23396 continue
+ if(.not.(nucgi1r .eq. 1))goto 23404
dyb3po = 1.0d0
-23398 continue
- goto 23342
-23343 continue
- do 23400 d9rjek=1,o9ljyn
+23404 continue
+ goto 23348
+23349 continue
+ do 23406 d9rjek=1,o9ljyn
t5vlzq(d9rjek)=lq8reh(d9rjek)
-23400 continue
- do 23402 d9rjek=1,o9ljyn
+23406 continue
+ do 23408 d9rjek=1,o9ljyn
lq8reh(i83h1(d9rjek))=t5vlzq(d9rjek)
-23402 continue
- do 23404 w3gohz=1,nfiumb4
- do 23406 d9rjek=1,lku8xq
+23408 continue
+ do 23410 w3gohz=1,nfiumb4
+ do 23412 d9rjek=1,lku8xq
go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + vfd2pw(d9rjek,
&w3gohz)
-23406 continue
-23404 continue
- if(.not.((y6jcvk .ne. 0) .and. (q .gt. 0)))goto 23408
- do 23410 nd6mep=1,q
- do 23412 jbyv3q=1,ozuw3p(nd6mep)
+23412 continue
+23410 continue
+ if(.not.((y6jcvk .ne. 0) .and. (q .gt. 0)))goto 23414
+ do 23416 nd6mep=1,q
+ do 23418 jbyv3q=1,ozuw3p(nd6mep)
call uwye7d(nfiumb4,uxs1iq(nd6mep),ynk9ah(1,nd6mep), zo5jyl(1,
&hwi2tb(nd6mep)+jbyv3q-1),x7aort)
- do 23414 w3gohz=1,nfiumb4
+ do 23420 w3gohz=1,nfiumb4
zo5jyl(w3gohz,hwi2tb(nd6mep)+jbyv3q-1) = x7aort(w3gohz,1)
+23420 continue
+23418 continue
+23416 continue
23414 continue
-23412 continue
-23410 continue
-23408 continue
return
end
subroutine kgevo5(p3vlea, xout, nfiumb4, lku8xq)
@@ -1074,32 +1092,32 @@
double precision p3vlea(nfiumb4), xout(1)
integer w3gohz, d9rjek, nd6mep, xtiel4
xtiel4=1
- do 23416 d9rjek=1,lku8xq
- do 23418 w3gohz=1,nfiumb4
- do 23420 nd6mep=1,lku8xq
- if(.not.(d9rjek .eq. nd6mep))goto 23422
+ do 23422 d9rjek=1,lku8xq
+ do 23424 w3gohz=1,nfiumb4
+ do 23426 nd6mep=1,lku8xq
+ if(.not.(d9rjek .eq. nd6mep))goto 23428
xout(xtiel4) = 1.0d0
- goto 23423
-23422 continue
+ goto 23429
+23428 continue
xout(xtiel4) = 0.0d0
-23423 continue
+23429 continue
xtiel4=xtiel4+1
-23420 continue
-23418 continue
-23416 continue
- do 23424 d9rjek=1,lku8xq
- do 23426 w3gohz=1,nfiumb4
- do 23428 nd6mep=1,lku8xq
- if(.not.(d9rjek .eq. nd6mep))goto 23430
+23426 continue
+23424 continue
+23422 continue
+ do 23430 d9rjek=1,lku8xq
+ do 23432 w3gohz=1,nfiumb4
+ do 23434 nd6mep=1,lku8xq
+ if(.not.(d9rjek .eq. nd6mep))goto 23436
xout(xtiel4) = p3vlea(w3gohz)
- goto 23431
-23430 continue
+ goto 23437
+23436 continue
xout(xtiel4) = 0.0d0
-23431 continue
+23437 continue
xtiel4=xtiel4+1
-23428 continue
-23426 continue
-23424 continue
+23434 continue
+23432 continue
+23430 continue
return
end
double precision function jcp1ti(nfiumb4, yvec, go0l1q, wvec)
@@ -1109,17 +1127,17 @@
double precision wtot, risyv0, bgu6fw
risyv0 = 0.0d0
wtot = 0.0d0
- do 23432 w3gohz=1,nfiumb4
+ do 23438 w3gohz=1,nfiumb4
bgu6fw = yvec(w3gohz) - go0l1q(w3gohz)
risyv0 = risyv0 + wvec(w3gohz)*bgu6fw*bgu6fw
wtot = wtot + wvec(w3gohz)
-23432 continue
- if(.not.(wtot .gt. 0.0d0))goto 23434
+23438 continue
+ if(.not.(wtot .gt. 0.0d0))goto 23440
jcp1ti=risyv0/wtot
- goto 23435
-23434 continue
+ goto 23441
+23440 continue
jcp1ti=0.0d0
-23435 continue
+23441 continue
return
end
subroutine usytl1(nfiumb4, yvec, wvec, ghry8z, wtot)
@@ -1130,16 +1148,16 @@
integer w3gohz
wtot = 0.0d0
risyv0 = 0.0d0
- do 23436 w3gohz=1,nfiumb4
+ do 23442 w3gohz=1,nfiumb4
risyv0 = risyv0 + yvec(w3gohz) * wvec(w3gohz)
wtot = wtot + wvec(w3gohz)
-23436 continue
- if(.not.(wtot .gt. 0.0d0))goto 23438
+23442 continue
+ if(.not.(wtot .gt. 0.0d0))goto 23444
ghry8z = risyv0 / wtot
- goto 23439
-23438 continue
+ goto 23445
+23444 continue
ghry8z = 0.0d0
-23439 continue
+23445 continue
return
end
subroutine rpfnk6(nfiumb4, x, w, yvec, vfd2pw, zo5jyl, y6jcvk)
@@ -1156,30 +1174,30 @@
call usytl1(nfiumb4,x,w,qxy6aj, wtot)
vgh4cp = 0.0d0
qnk4zf = 0.0d0
- do 23440 w3gohz=1,nfiumb4
+ do 23446 w3gohz=1,nfiumb4
j0izmn = x(w3gohz)-qxy6aj
vgh4cp = vgh4cp + j0izmn * (yvec(w3gohz)-bz3pyo) * w(w3gohz)
j0izmn = j0izmn * j0izmn
qnk4zf = qnk4zf + j0izmn * w(w3gohz)
-23440 continue
+23446 continue
u7hbqo = vgh4cp/qnk4zf
agfy3b = bz3pyo - u7hbqo * qxy6aj
- do 23442 w3gohz=1,nfiumb4
+ do 23448 w3gohz=1,nfiumb4
vfd2pw(w3gohz) = agfy3b + u7hbqo * x(w3gohz)
-23442 continue
+23448 continue
qe3jcd = agfy3b + u7hbqo * x(1)
- if(.not.(y6jcvk .ne. 0))goto 23444
- do 23446 w3gohz=1,nfiumb4
+ if(.not.(y6jcvk .ne. 0))goto 23450
+ do 23452 w3gohz=1,nfiumb4
j0izmn = x(w3gohz)-qxy6aj
- if(.not.(w(w3gohz) .gt. 0.0d0))goto 23448
+ if(.not.(w(w3gohz) .gt. 0.0d0))goto 23454
zo5jyl(w3gohz,1) = zo5jyl(w3gohz,1) - 1.0d0/wtot - j0izmn *
&j0izmn / qnk4zf
- goto 23449
-23448 continue
+ goto 23455
+23454 continue
zo5jyl(w3gohz,1) = 0.0d0
-23449 continue
-23446 continue
-23444 continue
+23455 continue
+23452 continue
+23450 continue
return
end
subroutine uwye7d(nfiumb4, p, ynk9ah, qxy6aj, x)
@@ -1187,9 +1205,9 @@
integer nfiumb4, p, ynk9ah(nfiumb4)
double precision qxy6aj(p), x(nfiumb4)
integer w3gohz
- do 23450 w3gohz=1,nfiumb4
+ do 23456 w3gohz=1,nfiumb4
x(w3gohz) = qxy6aj(ynk9ah(w3gohz))
-23450 continue
+23456 continue
return
end
subroutine vknotl2(x, nfiumb4, knot, xl6qgm, q9wyop)
@@ -1197,27 +1215,27 @@
integer nfiumb4, xl6qgm, q9wyop
double precision x(nfiumb4), knot(nfiumb4)
integer ndk, d9rjek
- if(.not.(q9wyop .eq. 0))goto 23452
- if(.not.(nfiumb4 .le. 40))goto 23454
+ if(.not.(q9wyop .eq. 0))goto 23458
+ if(.not.(nfiumb4 .le. 40))goto 23460
ndk = nfiumb4
- goto 23455
-23454 continue
+ goto 23461
+23460 continue
ndk = 40 + dexp(0.25d0 * dlog(nfiumb4-40.0d0))
-23455 continue
- goto 23453
-23452 continue
+23461 continue
+ goto 23459
+23458 continue
ndk = xl6qgm - 6
-23453 continue
+23459 continue
xl6qgm = ndk + 6
- do 23456 d9rjek = 1,3
+ do 23462 d9rjek = 1,3
knot(d9rjek) = x(1)
-23456 continue
- do 23458 d9rjek = 1,ndk
+23462 continue
+ do 23464 d9rjek = 1,ndk
knot(d9rjek+3) = x( 1 + (d9rjek-1)*(nfiumb4-1)/(ndk-1) )
-23458 continue
- do 23460 d9rjek = 1,3
+23464 continue
+ do 23466 d9rjek = 1,3
knot(ndk+3+d9rjek) = x(nfiumb4)
-23460 continue
+23466 continue
return
end
subroutine pknotl2(knot, nfiumb4, keep, fjo2dy)
@@ -1225,23 +1243,23 @@
integer nfiumb4, keep(nfiumb4)
double precision knot(nfiumb4), fjo2dy
integer w3gohz, ilower
- do 23462 w3gohz=1,4
+ do 23468 w3gohz=1,4
keep(w3gohz) = 1
-23462 continue
+23468 continue
ilower = 4
- do 23464 w3gohz=5,(nfiumb4-4)
+ do 23470 w3gohz=5,(nfiumb4-4)
if(.not.((knot(w3gohz) - knot(ilower) .ge. fjo2dy) .and.(knot(
- &nfiumb4) - knot(w3gohz) .ge. fjo2dy)))goto 23466
+ &nfiumb4) - knot(w3gohz) .ge. fjo2dy)))goto 23472
keep(w3gohz) = 1
ilower = w3gohz
- goto 23467
-23466 continue
+ goto 23473
+23472 continue
keep(w3gohz) = 0
-23467 continue
-23464 continue
- do 23468 w3gohz=(nfiumb4-3),nfiumb4
+23473 continue
+23470 continue
+ do 23474 w3gohz=(nfiumb4-3),nfiumb4
keep(w3gohz) = 1
-23468 continue
+23474 continue
return
end
subroutine vglmf(xbig,c4bdmu,o9ljyn,d8gwha,nfiumb4, jmwo0z,lq8reh,
@@ -1257,21 +1275,21 @@
integer sehz7y
call qh4ulb(zqve1l,vvl1li,lku8xq)
sehz7y = 1
-23470 if(.not.(sehz7y .ne. 0))goto 23471
+23476 if(.not.(sehz7y .ne. 0))goto 23477
call vfit(lku8xq,c4bdmu,o9ljyn,nfiumb4, xbig,jmwo0z,lq8reh,go0l1q,
&blq5vu, jrxg6l,ioqzvb,i0qvzl,das4bx, zx1610,i83h1, bgu6fw,zxao0o,
&xhe4cg,zkjqhi,zqve1l,vvl1li)
- if(.not.(d8gwha .ne. 0))goto 23472
+ if(.not.(d8gwha .ne. 0))goto 23478
call vcall1(sehz7y,jmwo0z,go0l1q,lq8reh,jrxg6l,xbig,cpxbig)
- goto 23473
-23472 continue
+ goto 23479
+23478 continue
sehz7y= 0
-23473 continue
- if(.not.(sehz7y .ne. 0))goto 23474
+23479 continue
+ if(.not.(sehz7y .ne. 0))goto 23480
zx1610=0
-23474 continue
- goto 23470
-23471 continue
+23480 continue
+ goto 23476
+23477 continue
return
end
subroutine vfit(lku8xq,c4bdmu,o9ljyn,nfiumb4, xbig,jmwo0z,lq8reh,
@@ -1290,52 +1308,52 @@
tvyd2b=101
fjg0qv=1
dyb3po=1.0d0
- if(.not.(zx1610 .eq. 0))goto 23476
- do 23478 d9rjek=1,o9ljyn
- do 23480 w3gohz=1,c4bdmu
+ if(.not.(zx1610 .eq. 0))goto 23482
+ do 23484 d9rjek=1,o9ljyn
+ do 23486 w3gohz=1,c4bdmu
ioqzvb(w3gohz,d9rjek) = xbig(w3gohz,d9rjek)
-23480 continue
-23478 continue
- do 23482 nd6mep=1,o9ljyn
+23486 continue
+23484 continue
+ do 23488 nd6mep=1,o9ljyn
i83h1(nd6mep) = nd6mep
-23482 continue
+23488 continue
call mux17f(jrxg6l, ioqzvb, lku8xq, o9ljyn, nfiumb4, zxao0o(1,1,1)
&, zxao0o(1,1,2), zqve1l, vvl1li, zkjqhi, c4bdmu)
call dhkt9w(ioqzvb,c4bdmu,c4bdmu,o9ljyn,i0qvzl,i83h1,bgu6fw,
&zx1610,t7sbea)
-23476 continue
+23482 continue
call mux22f(jrxg6l,jmwo0z,bgu6fw,zkjqhi,zqve1l,vvl1li,nfiumb4,
&lku8xq,zxao0o)
nd6mep=1
- do 23484 d9rjek=1,lku8xq
- do 23486 w3gohz=1,nfiumb4
+ do 23490 d9rjek=1,lku8xq
+ do 23492 w3gohz=1,nfiumb4
jmwo0z(w3gohz,d9rjek)=bgu6fw(nd6mep)
nd6mep=nd6mep+1
-23486 continue
-23484 continue
+23492 continue
+23490 continue
call vdqrsl(ioqzvb,c4bdmu,c4bdmu,zx1610,i0qvzl,jmwo0z,bgu6fw(1),
&blq5vu,lq8reh, bgu6fw(1),go0l1q,tvyd2b,fjg0qv)
das4bx=0.0d0
xi1mqb=0
hv3wja=1
- do 23488 w3gohz=1,nfiumb4
- do 23490 d9rjek=1,lku8xq
+ do 23494 w3gohz=1,nfiumb4
+ do 23496 d9rjek=1,lku8xq
xi1mqb = xi1mqb + 1
- if(.not.(xi1mqb .gt. nfiumb4))goto 23492
+ if(.not.(xi1mqb .gt. nfiumb4))goto 23498
xi1mqb = 1
hv3wja = hv3wja + 1
-23492 continue
+23498 continue
gwu72m = jmwo0z(xi1mqb,hv3wja) - go0l1q(d9rjek,w3gohz)
das4bx = das4bx + gwu72m * gwu72m
-23490 continue
-23488 continue
+23496 continue
+23494 continue
call vbksf(jrxg6l,go0l1q,lku8xq,nfiumb4,zxao0o,zqve1l,vvl1li,
&xhe4cg)
- do 23494 d9rjek=1,o9ljyn
+ do 23500 d9rjek=1,o9ljyn
bgu6fw(d9rjek) = lq8reh(d9rjek)
-23494 continue
- do 23496 d9rjek=1,o9ljyn
+23500 continue
+ do 23502 d9rjek=1,o9ljyn
lq8reh(i83h1(d9rjek)) = bgu6fw(d9rjek)
-23496 continue
+23502 continue
return
end
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/r-cran-vgam.git
More information about the debian-science-commits
mailing list