Skip to content

Commit

Permalink
Update student_t_qf.stanfunctions (#85)
Browse files Browse the repository at this point in the history
* Update student_t_qf.stanfunctions

* fix path

* Formatting

---------

Co-authored-by: GitHub Actions <[email protected]>
  • Loading branch information
spinkney and actions-user committed Jul 11, 2023
1 parent c240166 commit 8241956
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 168 deletions.
36 changes: 17 additions & 19 deletions functions/copula/student_t_copula.stanfunctions
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/** @addtogroup student_t_copula Student T Copula Functions
/** @addtogroup student_t_copula Student T Copula Functions
*
* @include \copula\student_t_copula.stanfunctions
*
Expand All @@ -15,23 +15,21 @@
* @param rho Real number [-1, 1]
* @param nu Real \f$(0, +\infty)\f$
*/

real bivariate_t_copula_lpdf(vector u, vector v, real rho, real nu) {
int N = num_elements(u);
vector[N] t1 = student_t_qf(u, nu);
vector[N] t2 = student_t_qf(v, nu);
vector[N] t1_sq = square(t1);
vector[N] t2_sq = square(t2);

real bivariate_t_copula_lpdf(vector u, vector v, real rho, real nu) {
int N = num_elements(u);
vector[N] t1 = student_t_qf(u, nu);
vector[N] t2 = student_t_qf(v, nu);
vector[N] t1_sq = square(t1);
vector[N] t2_sq = square(t2);

real lpdf = N
* (-0.5 * log1m(rho ^ 2) + lgamma(0.5 * (nu + 2))
+ lgamma(0.5 * nu) - 2 * lgamma(0.5 * (nu + 1)));
lpdf += 0.5 * (nu + 1)
* sum(log1p(t1_sq / nu) + log1p(t2_sq / nu));
lpdf += -0.5 * (nu + 2)
* sum(log1p((t1_sq - 2 * t1 .* t2 * rho + t2_sq)
/ (nu * (1 - rho ^ 2))));
return lpdf;
}
real lpdf = N
* (-0.5 * log1m(rho ^ 2) + lgamma(0.5 * (nu + 2)) + lgamma(0.5 * nu)
- 2 * lgamma(0.5 * (nu + 1)));
lpdf += 0.5 * (nu + 1) * sum(log1p(t1_sq / nu) + log1p(t2_sq / nu));
lpdf += -0.5 * (nu + 2)
* sum(log1p((t1_sq - 2 * t1 .* t2 * rho + t2_sq) / (nu * (1 - rho ^ 2))));
return lpdf;
}

/** @} */
/** @} */
41 changes: 21 additions & 20 deletions functions/distribution/student_t.stanfunctions
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,34 @@
real student_t_lcdf_stan(real x, real df) {
int lower_tail = 1;
real lval;

if (df <= 0) {
if (df <= 0) {
reject("df must be > 0. Found df = ", df);
}

if (is_inf(x)) {
return not_a_number();
}
if (is_inf(df))
return normal_lcdf(x | 0, 1);

return normal_lcdf(x | 0, 1);
real nx = 1 + (x / df) * x;
if (nx > 1e100)
lval = -0.5 * df * (2 * log(abs(x)) - log(df)) - lbeta(0.5 * df, 0.5) - log(0.5 * df);
else
lval = df > x * x ? beta_lccdf(x * x / (df + x * x) | 0.5, df / 2) : beta_lcdf(1 / nx | df / 2, 0.5);
else
lval = df > x * x ? beta_lccdf(x * x / (df + x * x) | 0.5, df / 2)
: beta_lcdf(1 / nx | df / 2, 0.5);


if (x <= 0) {
lower_tail = 0;
}

if (lower_tail == 1) {
return log1m(0.5 * exp(lval));
} else {
return lval - log2();
}

if (lower_tail == 1) {
return log1m(0.5 * exp(lval));
} else {
return lval - log2();
}
return lval;
}

Expand All @@ -59,7 +59,7 @@ real student_t_lcdf_stan(real x, real df) {
*/
real student_t_lccdf_stan(real x, real df) {
real lval;

if (df <= 0) {
reject("df must be > 0. Found df = ", df);
}
Expand All @@ -69,14 +69,15 @@ real student_t_lccdf_stan(real x, real df) {
}

if (is_inf(df))
return normal_lccdf(x | 0, 1);

return normal_lccdf(x | 0, 1);
real nx = 1 + (x / df) * x;
if (nx > 1e100)
lval = -0.5 * df * (2 * log(abs(x)) - log(df)) - lbeta(0.5 * df, 0.5) - log(0.5 * df);
else
lval = df > x * x ? beta_lccdf(x * x / (df + x * x) | 0.5, df / 2) : beta_lcdf(1 / nx | df / 2, 0.5);

else
lval = df > x * x ? beta_lccdf(x * x / (df + x * x) | 0.5, df / 2)
: beta_lcdf(1 / nx | df / 2, 0.5);

return x < 0 ? log1m(0.5 * exp(lval)) : lval - log2();
}

Expand Down
Loading

0 comments on commit 8241956

Please sign in to comment.