This function uses a jackknife approach to compute person parameters. The jackknife ability measure is based on primarily estimated models (PP_4pl(), PP_gpcm() or PPall()) - so the function is applied on the estimation objects, and jackknifed ability measures are returned.
JKpp(estobj, ...)
# S3 method for class 'fourpl'
JKpp(
estobj,
cmeth = "mean",
maxsteps = 500,
exac = 0.001,
fullmat = FALSE,
ctrl = list(),
...
)
# S3 method for class 'gpcm'
JKpp(
estobj,
cmeth = "mean",
maxsteps = 500,
exac = 0.001,
fullmat = FALSE,
ctrl = list(),
...
)
# S3 method for class 'gpcm4pl'
JKpp(
estobj,
cmeth = "mean",
maxsteps = 500,
exac = 0.001,
fullmat = FALSE,
ctrl = list(),
...
)
# S3 method for class 'jk'
print(x, ...)
# S3 method for class 'jk'
summary(object, nrowmax = 15, ...)An object which originates from using PP_gpcm(), PP_4pl() or PPall().
More input.
Choose the centering method, to summarize the n jackknife results to one single ability estimate. There are three valid entries: "mean", "median" and "AMT" (see Details for further description).
The maximum number of steps the NR Algorithm will take.
How accurate are the estimates supposed to be? Default is 0.001.
Default = FALSE. If TRUE, the function returns the whole jackknife matrix, which is the basis for the jackknife estimator.
More controls
an object of class jk which is the result of using the JKpp() function
An object of class jk which is the result of using the JKpp() function
When printing the matrix of estimates - how many rows should be shown? Default = 15.
Please use the Jackknife Standard-Error output with caution! It is implemented as suggested in Wainer and Wright (1980), but the results seem a bit strange, because the JK-SE is supposed to overestimate the SE compared to the MLE-SE. Actually, in all examples an underestimation of the SE was observed compared to the MLE/WLE-SE!
AMT-robustified jackknife: When choosing cmeth = AMT, the jackknife ability subsample estimates and the original supplied ability estimate are combined to a single jackknife-ability value by the Sine M-estimator. The AMT (or Sine M-estimator) is one of the winners in the Princeton Robustness Study of 1972. To get a better idea how the estimation process works, take a closer look to the paper which is mentioned below (Wainer & Wright, 1980).
Wainer, H., & Wright, B. D. (1980). Robust estimation of ability in the Rasch model. Psychometrika, 45(3), 373-391.
################# Jackknife ###################################################
### 4 PL model ######
### data creation ##########
set.seed(1623)
# intercepts
diffpar <- seq(-3,3,length=12)
# slope parameters
sl <- round(runif(12,0.5,1.5),2)
la <- round(runif(12,0,0.25),2)
ua <- round(runif(12,0.8,1),2)
# response matrix
abpar <- rnorm(10,0,1.7)
awm <- sim_4pl(beta = diffpar,alpha = sl,lowerA = la,upperA=ua,theta = abpar)
## 1PL model #####
# MLE
res1plmle <- PP_4pl(respm = awm,thres = diffpar,type = "mle")
#> Estimating: 1pl model ...
#> type = mle
#> Estimation finished!
# WLE
res1plwle <- PP_4pl(respm = awm,thres = diffpar,type = "wle")
#> Estimating: 1pl model ...
#> type = wle
#> Estimation finished!
# MAP estimation
res1plmap <- PP_4pl(respm = awm,thres = diffpar,type = "map")
#> Warning: all mu's are set to 0!
#> Warning: all sigma2's are set to 1!
#> Estimating: 1pl model ...
#> type = map
#> Estimation finished!
# EAP estimation
res1pleap <- PP_4pl(respm = awm,thres = diffpar,type = "eap")
#> Warning: all mu's are set to 0!
#> Warning: all sigma2's are set to 1!
#> Estimating: 1pl model ...
#> type = eap
#> Estimation finished!
# robust estimation
res1plrob <- PP_4pl(respm = awm,thres = diffpar,type = "robust")
#> Estimating: 1pl model ...
#> type = robust
#> Estimation finished!
## centering method = mean
res_jk1 <- JKpp(res1plmle)
res_jk2 <- JKpp(res1plwle)
res_jk3 <- JKpp(res1plmap)
res_jk4 <- JKpp(res1plrob)
res_jk5 <- JKpp(res1pleap)
summary(res_jk1)
#> PP Version: 0.6.4.0
#>
#> Call: JKpp.fourpl(estobj = res1plmle)
#> - job started @ Tue Apr 21 13:42:12 2026
#>
#> Estimation type: Jackknife --> mle
#>
#> -------------------------------------
#> estimate SE
#> [1,] 1.7363 0.1015
#> [2,] -1.2290 0.1072
#> [3,] 0.5319 0.1016
#> [4,] 2.3532 0.1173
#> [5,] -1.1482 0.1024
#> [6,] 0.0000 0.0913
#> [7,] -0.6334 0.1133
#> [8,] -1.8278 0.0858
#> [9,] -1.6833 0.0982
#> [10,] -0.0644 0.1186
## centering method = median
res_jk1a <- JKpp(res1plmle,cmeth = "median")
res_jk2a <- JKpp(res1plwle,cmeth = "median")
res_jk3a <- JKpp(res1plmap,cmeth = "median")
summary(res_jk2a)
#> PP Version: 0.6.4.0
#>
#> Call: JKpp.fourpl(estobj = res1plwle, cmeth = "median")
#> - job started @ Tue Apr 21 13:42:12 2026
#>
#> Estimation type: Jackknife --> wle
#>
#> -------------------------------------
#> estimate SE
#> [1,] 1.9587 0.1029
#> [2,] -1.7012 0.1933
#> [3,] 0.8853 0.1336
#> [4,] 2.6364 0.0908
#> [5,] -1.3424 0.1125
#> [6,] 0.0000 0.0894
#> [7,] -0.8377 0.1377
#> [8,] -2.0417 0.1129
#> [9,] -1.9587 0.0916
#> [10,] -0.0843 0.1191
## centering method = AMT
res_jk1b <- JKpp(res1plmle,cmeth = "AMT")
res_jk2b <- JKpp(res1plwle,cmeth = "AMT")
res_jk3b <- JKpp(res1plmap,cmeth = "AMT")
summary(res_jk3b)
#> PP Version: 0.6.4.0
#>
#> Call: JKpp.fourpl(estobj = res1plmap, cmeth = "AMT")
#> - job started @ Tue Apr 21 13:42:12 2026
#>
#> Estimation type: Jackknife --> map
#>
#> -------------------------------------
#> estimate SE
#> [1,] 0.7226 0.1201
#> [2,] -0.6483 0.0678
#> [3,] 0.0910 0.1009
#> [4,] 0.7104 0.2275
#> [5,] -0.7071 0.0584
#> [6,] 0.0000 0.0560
#> [7,] -0.6097 0.1025
#> [8,] -1.2173 0.0637
#> [9,] -0.7433 0.1107
#> [10,] 0.0204 0.0718
## 2PL model #####
# MLE
res2plmle <- PP_4pl(respm = awm,thres = diffpar, slopes = sl,type = "mle")
#> Estimating: 2pl model ...
#> type = mle
#> Estimation finished!
# WLE
res2plwle <- PP_4pl(respm = awm,thres = diffpar, slopes = sl,type = "wle")
#> Estimating: 2pl model ...
#> type = wle
#> Estimation finished!
# MAP estimation
res2plmap <- PP_4pl(respm = awm,thres = diffpar, slopes = sl,type = "map")
#> Warning: all mu's are set to 0!
#> Warning: all sigma2's are set to 1!
#> Estimating: 2pl model ...
#> type = map
#> Estimation finished!
# EAP estimation
res2pleap <- PP_4pl(respm = awm,thres = diffpar,slopes = sl,type = "eap")
#> Warning: all mu's are set to 0!
#> Warning: all sigma2's are set to 1!
#> Estimating: 2pl model ...
#> type = eap
#> Estimation finished!
# robust estimation
res2plrob <- PP_4pl(respm = awm,thres = diffpar,slopes = sl,type = "robust")
#> Estimating: 2pl model ...
#> type = robust
#> Estimation finished!
res_jk6 <- JKpp(res2plmle)
res_jk7 <- JKpp(res2plwle)
res_jk8 <- JKpp(res2plmap)
res_jk9 <- JKpp(res2pleap)
res_jk10 <- JKpp(res2plrob)
### GPCM model ######
# some threshold parameters
THRES <- matrix(c(-2,-1.23,1.11,3.48,1
,2,-1,-0.2,0.5,1.3,-0.8,1.5),nrow=2)
# slopes
sl <- c(0.5,1,1.5,1.1,1,0.98)
awmatrix <- matrix(c(1,0,2,0,1,1,1,0,0,1,2,0,0,0,0,0,0,0,0,1,
1,2,2,1,1,1,1,0,0,1),byrow=TRUE,nrow=5)
### PCM model ######
# MLE
respcmlmle <- PP_gpcm(respm = awmatrix,thres = THRES,
slopes = rep(1,ncol(THRES)),type = "mle")
#> Estimating: GPCM ...
#> type = mle
#> Estimation finished!
# WLE
respcmwle <- PP_gpcm(respm = awmatrix,thres = THRES,
slopes = rep(1,ncol(THRES)),type = "wle")
#> Estimating: GPCM ...
#> type = wle
#> Estimation finished!
# MAP estimation
respcmmap <- PP_gpcm(respm = awmatrix,thres = THRES,
slopes = rep(1,ncol(THRES)),type = "map")
#> Warning: all mu's are set to 0!
#> Warning: all sigma2's are set to 1!
#> Estimating: GPCM ...
#> type = map
#> Estimation finished!
res_jk11 <- JKpp(respcmlmle)
res_jk12 <- JKpp(respcmwle)
res_jk13 <- JKpp(respcmmap)
### GPCM/4-PL mixed model ######
THRES <- matrix(c(-2,-1.23,1.11,3.48,1
,2,-1,-0.2,0.5,1.3,-0.8,1.5),nrow=2)
sl <- c(0.5,1,1.5,1.1,1,0.98)
THRESx <- THRES
THRESx[2,1:3] <- NA
# for the 4PL item the estimated parameters are submitted,
# for the GPCM items the lower asymptote = 0
# and the upper asymptote = 1.
la <- c(0.02,0.1,0,0,0,0)
ua <- c(0.97,0.91,1,1,1,1)
awmatrix <- matrix(c(1,0,1,0,1,1,1,0,0,1
,2,0,0,0,1,0,0,0,0,1
,0,2,2,1,1,1,1,0,0,1),byrow=TRUE,nrow=5)
# create model2est
# this function tries to help finding the appropriate
# model by inspecting the THRESx.
model2est <- findmodel(THRESx)
# MLE estimation
respmixed_mle <- PPall(respm = awmatrix,
thres = THRESx,
slopes = sl,
lowerA = la,
upperA=ua,
type = "mle",
model2est=model2est)
#> Estimating: mixed 4PL, GPCM ...
#> type = mle
#> Estimation finished!
# WLE estimation
respmixed_wle <- PPall(respm = awmatrix,
thres = THRESx,
slopes = sl,
lowerA = la,
upperA=ua,
type = "wle",
model2est=model2est)
#> Estimating: mixed 4PL, GPCM ...
#> type = wle
#> Estimation finished!
res_jk114 <- JKpp(respmixed_mle)
res_jk115 <- JKpp(respmixed_wle)