static void irt_rpf_mdim_drm_prob(const double *spec, const double *param, const double *th, double *out) { int numDims = spec[RPF_ISpecDims]; double dprod = dotprod(param, th, numDims); double diff = param[numDims]; double athb = -(dprod + diff); if (athb < -EXP_STABLE_DOMAIN) athb = -EXP_STABLE_DOMAIN; else if (athb > EXP_STABLE_DOMAIN) athb = EXP_STABLE_DOMAIN; double tmp; if (numDims == 0) { tmp = 1/(1+exp(athb)); } else { const double gg = antilogit(param[numDims+1]); const double uu = antilogit(param[numDims+2]); const double width = uu-gg; if (width < 0) tmp = nan("I"); else { tmp = gg + width / (1 + exp(athb)); } } out[0] = 1-tmp; out[1] = tmp; }
static void irt_rpf_mdim_drm_prob2(const double *spec, const double *param, const double *th, double *out1, double *out2) { int numDims = spec[RPF_ISpecDims]; double dprod = dotprod(param, th, numDims); double diff = param[numDims]; double athb = -(dprod + diff); if (athb < -EXP_STABLE_DOMAIN) athb = -EXP_STABLE_DOMAIN; else if (athb > EXP_STABLE_DOMAIN) athb = EXP_STABLE_DOMAIN; double tmp = 1 / (1 + exp(athb)); out1[0] = 1-tmp; out1[1] = tmp; if (numDims) { const double gg = antilogit(param[numDims+1]); const double uu = antilogit(param[numDims+2]); tmp = gg + (uu-gg) * tmp; } out2[0] = 1-tmp; out2[1] = tmp; }
void P_dich(vector<double> &P, const vector<double> &par, const NumericMatrix &Theta, const NumericVector &ot, const int &N, const int &nfact) { const int len = par.size(); const double utmp = par[len-1]; const double gtmp = par[len-2]; const double g = antilogit(>mp); const double u = antilogit(&utmp); const double d = par[len-3]; const int USEOT = ot.size() > 1; for (int i = 0; i < N; ++i){ double z = d; for (int j = 0; j < nfact; ++j) z += par[j] * Theta(i,j); if(USEOT) z += ot[i]; if(z > ABS_MAX_Z) z = ABS_MAX_Z; else if(z < -ABS_MAX_Z) z = -ABS_MAX_Z; P[i+N] = g + (u - g) /(1.0 + exp(-z)); P[i] = 1.0 - P[i + N]; } }
static void irt_rpf_mdim_drm_dTheta(const double *spec, const double *param, const double *where, const double *dir, double *grad, double *hess) { int numDims = spec[RPF_ISpecDims]; double PQ[2]; double PQstar[2]; irt_rpf_mdim_drm_prob2(spec, param, where, PQstar, PQ); double Pstar = PQstar[0]; double Qstar = PQstar[1]; const double *aa = param; const double guess = antilogit(param[numDims + 1]); const double upper = antilogit(param[numDims + 2]); for (int ax=0; ax < numDims; ax++) { double piece = dir[ax] * (upper-guess) * aa[ax] * (Pstar * Qstar); grad[1] += piece; grad[0] -= piece; piece = dir[ax] * (2 * (upper - guess) * aa[ax]*aa[ax] * (Qstar * Qstar * Pstar) - (upper - guess) * aa[ax]*aa[ax] * (Pstar * Qstar)); hess[1] -= piece; hess[0] += piece; } }
void P_comp(vector<double> &P, const vector<double> &par, const NumericMatrix &Theta, const int &N, const int &nfact) { vector<double> a(nfact), d(nfact); for(int j = 0; j < nfact; ++j){ a[j] = par[j]; d[j] = par[j+nfact]; } const double gtmp = par[nfact*2]; const double g = antilogit(>mp); for(int i = 0; i < N; ++i) P[i+N] = 1.0; for(int j = 0; j < nfact; ++j) for(int i = 0; i < N; ++i) P[i+N] = P[i+N] * (1.0 / (1.0 + exp(-(a[j] * Theta(i,j) + d[j])))); for(int i = 0; i < N; ++i){ P[i+N] = g + (1.0 - g) * P[i+N]; if(P[i+N] < 1e-20) P[i+N] = 1e-20; else if (P[i+N] > 1.0 - 1e-20) P[i+N] = 1.0 - 1e-20; P[i] = 1.0 - P[i+N]; } }
static void irt_rpf_mdim_drm_deriv1(const double *spec, const double *param, const double *where, const double *weight, double *out) { const int numDims = spec[RPF_ISpecDims]; double QP[2]; double QPstar[2]; irt_rpf_mdim_drm_prob2(spec, param, where, QPstar, QP); const double r1 = weight[1]; const double r2 = weight[0]; const double r1_P = r1/QP[1]; const double r1_P2 = r1/(QP[1] * QP[1]); const double r2_Q = r2/QP[0]; const double r2_Q2 = r2/(QP[0] * QP[0]); const double r1_Pr2_Q = (r1_P - r2_Q); const double Pstar = QPstar[1]; const double Pstar2 = Pstar * Pstar; const double Pstar3 = Pstar2 * Pstar; const double Qstar = QPstar[0]; if (numDims == 0) { out[0] -= Pstar * Qstar * r1_Pr2_Q; double chunk1 = (Pstar - Pstar2); out[1] -= (r1_P * ((Pstar - 3*Pstar2 + 2*Pstar3)) - r1_P2 * chunk1*chunk1 + r2_Q * ((-Pstar + 3*Pstar2 - 2*Pstar3)) - r2_Q2 * chunk1*chunk1); // cc^2 return; } const double expgg = param[numDims+1]; const double expuu = param[numDims+2]; const double gg = antilogit(expgg); const double uu = antilogit(expuu); const double difexpgg = gg * (1-gg); const double difexpuu = uu * (1-uu); const double gm1 = (1.0 - gg); const double um1 = (1.0 - uu); const double u_1u = uu * um1; const double g_1g = gg * gm1; const double ugD = (uu-gg); for (int dx=0; dx < numDims; dx++) { out[dx] -= where[dx] * Pstar * Qstar * ugD * r1_Pr2_Q; } out[numDims] -= ugD * Pstar * Qstar * r1_Pr2_Q; out[numDims+1] -= difexpgg * QPstar[0] * r1_Pr2_Q; out[numDims+2] -= difexpuu * QPstar[1] * r1_Pr2_Q; int ox = numDims+2; for(int ix=0; ix < numDims; ix++) { for(int jx=0; jx <= ix; jx++) { out[++ox] -= (r1_P * (ugD * where[ix] * where[jx] * (Pstar - 3*Pstar2 + 2*Pstar3)) - r1_P2 * (ugD * where[ix] * (Pstar - Pstar2) * (ugD * where[jx] * (Pstar - Pstar2))) + r2_Q * (ugD * where[ix] * where[jx] * (-Pstar + 3*Pstar2 - 2*Pstar3)) - r2_Q2 * (ugD * where[ix] * (-Pstar + Pstar2) * (ugD * where[jx] * (-Pstar + Pstar2)))); // aa_k aa_k } } for(int ix=0; ix < numDims; ix++) { out[++ox] -= (r1_P * (ugD * where[ix] * (Pstar - 3*Pstar2 + 2*Pstar3)) - r1_P2 * (ugD * where[ix] * (Pstar - Pstar2) * (ugD * (Pstar - Pstar2))) + r2_Q * (ugD * where[ix] * (-Pstar + 3*Pstar2 - 2*Pstar3)) - r2_Q2 * (ugD * where[ix] * (-Pstar + Pstar2) * (ugD * (-Pstar + Pstar2)))); // cc aa_k } double chunk1 = ugD * (Pstar - Pstar2); out[++ox] -= (r1_P * (ugD * (Pstar - 3*Pstar2 + 2*Pstar3)) - r1_P2 * chunk1*chunk1 + r2_Q * (ugD * (-Pstar + 3*Pstar2 - 2*Pstar3)) - r2_Q2 * chunk1*chunk1); // cc^2 for(int ix=0; ix < numDims; ix++) { out[++ox] -= (r1_P * (g_1g * where[ix] * (-Pstar + Pstar2)) - r1_P2 * (ugD * where[ix] * (Pstar - Pstar2)) * g_1g * Qstar + r2_Q * (g_1g * where[ix] * (Pstar - Pstar2)) - r2_Q2 * (ugD * where[ix] * (-Pstar + Pstar2) ) * g_1g * (Pstar - 1)); // gg aa_k } out[++ox] -= (r1_P * (g_1g * (-Pstar + Pstar2)) - r1_P2 * (ugD * (Pstar - Pstar2)) * g_1g * Qstar + r2_Q * (g_1g * (Pstar - Pstar2)) - r2_Q2 * (ugD * (-Pstar + Pstar2)) * g_1g * -Qstar); // gg cc out[++ox] -= (r1_P * (g_1g * (2.0*gm1 - 1.0 - 2.0*gm1*Pstar + Pstar)) - r1_P2 * (g_1g * (1.0 - Pstar)) * (g_1g * (1.0 - Pstar)) + r2_Q * (g_1g * (-2.0*gm1 + 1.0 + 2.0*gm1*Pstar - Pstar)) - r2_Q2 * (g_1g * (-1.0 + Pstar)) * (g_1g * (-1.0 + Pstar))); // gg^2 for(int ix=0; ix < numDims; ix++) { out[++ox] -= (r1_P * (u_1u * where[ix] * (Pstar - Pstar2)) - r1_P2 * (ugD * where[ix] * (Pstar - Pstar2)) * u_1u * Pstar + r2_Q * (u_1u * where[ix] * (-Pstar + Pstar2)) + r2_Q2 * (ugD * where[ix] * (-Pstar + Pstar2) ) * u_1u * Pstar); // uu aa_k } out[++ox] -= (r1_P * (u_1u * (Pstar - Pstar2)) - r1_P2 * (ugD * (Pstar - Pstar2)) * u_1u * Pstar + r2_Q * (u_1u * (-Pstar + Pstar2)) + r2_Q2 * (ugD * (-Pstar + Pstar2)) * u_1u * Pstar); // uu cc out[++ox] -= (-r1_P2 * (g_1g * (1.0 - Pstar)) * u_1u * Pstar + r2_Q2 * (g_1g * (-1.0 + Pstar)) * u_1u * Pstar); // uu gg out[++ox] -= (r1_P * (2.0*u_1u*um1*Pstar) - r1_P * (u_1u*Pstar) - r1_P2 *(u_1u*u_1u*Pstar2) - r2_Q * (2.0*u_1u*um1*Pstar) + r2_Q * (u_1u*Pstar) - r2_Q2 *(u_1u*u_1u*Pstar2)); // uu^2 }