philchalmers / mirt

Multidimensional item response theory
https://philchalmers.github.io/mirt/
201 stars 75 forks source link

Sandwich SE estimation for (explanatory) LCA #113

Closed seonghobae closed 7 years ago

seonghobae commented 7 years ago

Hi Phil,

I having a trouble fitting an LCA model with sandwich SE estimation.

Here is a test case.

> mdirt(Science[,1:3], 1, SE = T, SE.type = 'sandwich', method = 'EM', covdata = data.frame(Science[4]), formula = ~Benefit)
Iteration: 2, Log-Lik: -1229.960, Max-Change: 0.00000

Calculating information matrix...
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
No hessian defined for lca class
Error in solve.default(-Ihess - IgradP + Igrad) : 
  Lapack routine dgesv: system is exactly singular: U[1,1] = 0

Seongho

philchalmers commented 7 years ago

The fix for this is straightforward but takes time. The hessian for the internal lca type has to be defined using C++ code like many of the other optimised itemtypes.

For now, you could compute the crossprod and Oakes estimates and combine this yourself to make the sandwich ACOV estimate.

mod <- mirt(Science, 1, SE=T)
modcp <- mirt(Science, 1, SE=T, SE.type = 'crossprod')
vcov(modcp) %*% solve(vcov(mod)) %*% vcov(modcp)

I'll likely add a SE.type = 'Oakes.sandwich' sometime because computing the robust ACOV this way can be much faster.