@@ -160,10 +160,10 @@ double log_pseudoposterior(
160160 const double quad_effect = main_group (v, 1 );
161161 const int ref = baseline_category (v);
162162 for (int c = 0 ; c <= num_cats; ++c) {
163- const int centered = c - ref;
164- const double quad = quad_effect * centered * centered ;
165- const double lin = lin_effect * c ;
166- const arma::vec exponent = lin + quad + c * rest_score - bound;
163+ const int score = c - ref;
164+ const double lin = lin_effect * score ;
165+ const double quad = quad_effect * score * score ;
166+ const arma::vec exponent = lin + quad + score * rest_score - bound;
167167 denom += ARMA_MY_EXP (exponent);
168168 }
169169 }
@@ -566,10 +566,10 @@ arma::vec gradient(
566566 const double lin_effect = main_group (v, 0 );
567567 const double quad_effect = main_group (v, 1 );
568568 for (int s = 0 ; s <= K; ++s) {
569- const int centered = s - ref;
570- const double lin = lin_effect * s ;
571- const double quad = quad_effect * centered * centered ;
572- exponents.col (s) = lin + quad + s * rest_score - bound;
569+ const int score = s - ref;
570+ const double lin = lin_effect * score ;
571+ const double quad = quad_effect * score * score ;
572+ exponents.col (s) = lin + quad + score * rest_score - bound;
573573 }
574574 }
575575
@@ -594,7 +594,7 @@ arma::vec gradient(
594594 }
595595 }
596596 } else {
597- arma::vec lin_score = arma::regspace<arma::vec>(0 , K); // length K+1
597+ arma::vec lin_score = arma::regspace<arma::vec>(0 - ref , K - ref ); // length K+1
598598 arma::vec quad_score = arma::square (lin_score - ref);
599599
600600 double sum_lin = arma::accu (probs * lin_score);
@@ -619,8 +619,15 @@ arma::vec gradient(
619619 if (v == v2) continue ;
620620
621621 arma::vec expected_value (num_group_obs, arma::fill::zeros);
622- for (int s = 1 ; s <= K; ++s) {
623- expected_value += s * probs.col (s) % obs.col (v2);
622+ if (is_ordinal_variable (v)) {
623+ for (int s = 1 ; s <= K; ++s) {
624+ expected_value += s * probs.col (s) % obs.col (v2);
625+ }
626+ } else {
627+ for (int s = 0 ; s <= K; ++s) {
628+ int score = s - ref;
629+ expected_value += score * probs.col (s) % obs.col (v2);
630+ }
624631 }
625632 double sum_expectation = arma::accu (expected_value);
626633
@@ -860,10 +867,10 @@ double log_pseudoposterior_main_component(
860867 const double quad_effect = main_group (variable, 1 );
861868 const int ref = baseline_category (variable);
862869 for (int cat = 0 ; cat <= num_cats; cat++) {
863- const int centered = cat - ref;
864- const double quad = quad_effect * centered * centered ;
865- const double lin = lin_effect * cat ;
866- const arma::vec exponent = lin + quad + cat * rest_score - bound;
870+ const int score = cat - ref;
871+ const double quad = quad_effect * score * score ;
872+ const double lin = lin_effect * score ;
873+ const arma::vec exponent = lin + quad + score * rest_score - bound;
867874 denom += ARMA_MY_EXP (exponent);
868875 }
869876 }
@@ -1044,10 +1051,10 @@ double log_pseudoposterior_pair_component(
10441051 const double quad_effect = main_group (v, 1 );
10451052 const int ref = baseline_category (v);
10461053 for (int c = 0 ; c <= num_cats; ++c) {
1047- const int centered = c - ref;
1048- const double quad = quad_effect * centered * centered ;
1049- const double lin = lin_effect * c ;
1050- const arma::vec exponent = lin + quad + c * rest_score - bound;
1054+ const int score = c - ref;
1055+ const double lin = lin_effect * score ;
1056+ const double quad = quad_effect * score * score ;
1057+ const arma::vec exponent = lin + quad + score * rest_score - bound;
10511058 denom += ARMA_MY_EXP (exponent);
10521059 }
10531060 }
@@ -1192,9 +1199,9 @@ double log_ratio_pseudolikelihood_constant_variable(
11921199 arma::vec const_current (num_cats + 1 , arma::fill::zeros);
11931200 arma::vec const_proposed (num_cats + 1 , arma::fill::zeros);
11941201 for (int s = 0 ; s <= num_cats; ++s) {
1195- const int centered = s - ref;
1196- const_current (s) = main_current (0 ) * s + main_current (1 ) * centered * centered ;
1197- const_proposed (s) = main_proposed (0 ) * s + main_proposed (1 ) * centered * centered ;
1202+ const int score = s - ref;
1203+ const_current (s) = main_current (0 ) * score + main_current (1 ) * score* score ;
1204+ const_proposed (s) = main_proposed (0 ) * score + main_proposed (1 ) * score * score ;
11981205 }
11991206
12001207 double lbound = std::max (const_current.max (), const_proposed.max ());
@@ -1204,8 +1211,9 @@ double log_ratio_pseudolikelihood_constant_variable(
12041211 bound_proposed = lbound + num_cats * arma::clamp (rest_proposed, 0.0 , arma::datum::inf);
12051212
12061213 for (int s = 0 ; s <= num_cats; ++s) {
1207- denom_current += ARMA_MY_EXP (const_current (s) + s * rest_current - bound_current);
1208- denom_proposed += ARMA_MY_EXP (const_proposed (s) + s * rest_proposed - bound_proposed);
1214+ const int score = s - ref;
1215+ denom_current += ARMA_MY_EXP (const_current (s) + score * rest_current - bound_current);
1216+ denom_proposed += ARMA_MY_EXP (const_proposed (s) + score * rest_proposed - bound_proposed);
12091217 }
12101218 }
12111219
0 commit comments