# User written Box-Cox type transformation function

**URL:** <https://discourse.mc-stan.org/t/user-written-box-cox-type-transformation-function/1966>\
**Category:** RStan\
**Created:** [September 20, 2017, 8:05pm UTC](https://discourse.mc-stan.org/t/user-written-box-cox-type-transformation-function/1966 "2017-09-20T20:05:39Z")\
**Posts on this page:** 1\
**Showing post:** 6

<div class="post-metadata">

**Author:** ![Bob\_Carpenter](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.mc-stan.org/bob_carpenter/32/9230_2.png) [@Bob\_Carpenter](https://discourse.mc-stan.org/u/Bob_Carpenter)\
**Post date:** [September 27, 2017, 6:37pm UTC](https://discourse.mc-stan.org/t/user-written-box-cox-type-transformation-function/1966/6 "2017-09-27T18:37:48Z")

</div>

Thanks for sending a working solution. A simpler version with less nesting and fewer assignments is:

```
   real h(real a, real b) {
     return (pow(a, b) - 1) / b;
   }

   real g(real y, real p) {
    real eps = 0.005;
    if (y >= 0) {
      if (abs(p) <= eps)
        return log1p(y);
     return h(1 + y, p);
    }
    if (p >= 2 - eps && p <= 2 + eps)
      return -log1m(y);
    return -h(1 - y, 2 - p);
  }

```

It avoids recomputation of `2 - p` into the bargain.

---

_[View the full topic](https://discourse.mc-stan.org/t/user-written-box-cox-type-transformation-function/1966)._
