Skip to content

Commit

Permalink
Add src files to git
Browse files Browse the repository at this point in the history
  • Loading branch information
dmenne committed Jul 7, 2016
1 parent dc23755 commit dd36a7b
Show file tree
Hide file tree
Showing 4 changed files with 1,765 additions and 23 deletions.
24 changes: 10 additions & 14 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
*.o
src/*.o-*
*.so
*.dll
*.html
.RData
.Rproj.user
.Rhistory
.RData
.Ruserdata
inst/doc
*.html
src/*.o
src/include/
src/*.cpp
^./src-i
src/include/hpp
src/*.rds
*.rda
src-i386
src-x64
..Rcheck
src/*.dll
.httr-oauth
vignettes/*.R
.DS_Store
*.bak
24 changes: 15 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,37 @@

By dieter.menne@menne-biomed.de, Menne Biomed Consulting Tübingen, D-72074 Tübingen

A package and a Shiny web application to create simulated gastric emptying data, and to analyze experimental gastric emptying data using population fit with R and package nlme.
A package and a Shiny web application to create simulated gastric emptying data, and to analyze experimental gastric emptying data using population fit with R and package nlme. Simplified versions of Stan-based (http://mc-stan.org/) Bayesian fits are included and will be extended in future.

The package is available from github: https://github.com/dmenne/gastempt
Part of the work has been supported by section GI MRT, Klinik für Gastroenterologie und Hepatologie, Universitätsspital Zürich; thanks to Werner Schwizer and Andreas Steingötter for support.


The package is available from github: https://github.com/dmenne/gastempt. It can be installed with

```
devtools::install_github("dmenne/gastempt")
```

Part of the work has been supported by section GI MRT, Klinik für Gastroenterologie und Hepatologie, Universitätsspital Zürich.

Two models are implemented:

* `linexp, vol = v0 * (1 + kappa * t / tempt) * exp(-t / tempt):`Recommended for gastric emptying curves with an initial volume overshoot from secretion. With parameter kappa > 1, there is a maximum after t=0. When all emptying curves start with a steep drop, this model can be difficult to fit.
* `powexp, vol = v0 * exp(-(t / tempt) ^ beta):` The power exponential function introduced by Elashof et. al. to fit scintigraphic emptying data; this type of data does not have an initial overshoot by design. Compared to the `linexp` model, fitting `powexp` is more reliable and rarely fails to converge in the presence of noise and outliers. The power exponential can be useful with MRI data when there is an unusual late phase in emptying.

* Data can be entered directly from the clipboard copied from Excel, or can be simulated.
* Several preset simulations are provided.
* Data can be entered directly from the clipboard copied from Excel, or can be simulated using a Shiny app.
* Several preset simulations are provided in the Shiny app.
* Robustness of models can be tested by manipulating noise quality and between-subject variance.
* Fits are displayed as curves
* Fits are displayed with data.
* The coefficients of the analysis including t50 and the slope in t50 can be downloaded in .csv format.

Hopefully coming (looking for sponsors... ):
Coming:

* Post-hoc analysis in Shiny application by treatment groups, both for cross-over and fully randomized designs.
* Overcoming the convergence constraints of nlme fits: Using Bayesian models and Stan (http://mc-stan.org/).
* More Stan (http://mc-stan.org/).
* Tutorial: Why are single curve fits not useful in clinical research? How to analyze studies, and how to fit single curves anyway, e.g. for clinical practice.
* Tutorial: How to fit curves in more complex cases that cannot be handled by the Shiny application using R, package gastempt, and Stan directly.

![Screenshot](inst/shiny/screenshot.png)

Use `roxygen2::roxygenize(clean = TRUE)`; devtools/RStudio documentation fails.


87 changes: 87 additions & 0 deletions src/Modules.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#include <Rcpp.h>
using namespace Rcpp ;
#include "include/models.hpp"

RCPP_MODULE(stan_fit4linexp_gastro_1b_mod) {


class_<rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> >("model_linexp_gastro_1b")

.constructor<SEXP,SEXP>()


.method("call_sampler", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::call_sampler)
.method("param_names", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::param_names)
.method("param_names_oi", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::param_names_oi)
.method("param_fnames_oi", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::param_fnames_oi)
.method("param_dims", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::param_dims)
.method("param_dims_oi", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::param_dims_oi)
.method("update_param_oi", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::update_param_oi)
.method("param_oi_tidx", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::param_oi_tidx)
.method("grad_log_prob", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::grad_log_prob)
.method("log_prob", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::log_prob)
.method("unconstrain_pars", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::unconstrain_pars)
.method("constrain_pars", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::constrain_pars)
.method("num_pars_unconstrained", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::num_pars_unconstrained)
.method("unconstrained_param_names", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::unconstrained_param_names)
.method("constrained_param_names", &rstan::stan_fit<model_linexp_gastro_1b_namespace::model_linexp_gastro_1b, boost::random::ecuyer1988> ::constrained_param_names)
;
}
#include <Rcpp.h>
using namespace Rcpp ;
#include "include/models.hpp"

RCPP_MODULE(stan_fit4linexp_gastro_1c_mod) {


class_<rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> >("model_linexp_gastro_1c")

.constructor<SEXP,SEXP>()


.method("call_sampler", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::call_sampler)
.method("param_names", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::param_names)
.method("param_names_oi", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::param_names_oi)
.method("param_fnames_oi", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::param_fnames_oi)
.method("param_dims", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::param_dims)
.method("param_dims_oi", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::param_dims_oi)
.method("update_param_oi", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::update_param_oi)
.method("param_oi_tidx", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::param_oi_tidx)
.method("grad_log_prob", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::grad_log_prob)
.method("log_prob", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::log_prob)
.method("unconstrain_pars", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::unconstrain_pars)
.method("constrain_pars", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::constrain_pars)
.method("num_pars_unconstrained", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::num_pars_unconstrained)
.method("unconstrained_param_names", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::unconstrained_param_names)
.method("constrained_param_names", &rstan::stan_fit<model_linexp_gastro_1c_namespace::model_linexp_gastro_1c, boost::random::ecuyer1988> ::constrained_param_names)
;
}
#include <Rcpp.h>
using namespace Rcpp ;
#include "include/models.hpp"

RCPP_MODULE(stan_fit4linexp_gastro_1d_mod) {


class_<rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> >("model_linexp_gastro_1d")

.constructor<SEXP,SEXP>()


.method("call_sampler", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::call_sampler)
.method("param_names", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::param_names)
.method("param_names_oi", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::param_names_oi)
.method("param_fnames_oi", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::param_fnames_oi)
.method("param_dims", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::param_dims)
.method("param_dims_oi", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::param_dims_oi)
.method("update_param_oi", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::update_param_oi)
.method("param_oi_tidx", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::param_oi_tidx)
.method("grad_log_prob", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::grad_log_prob)
.method("log_prob", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::log_prob)
.method("unconstrain_pars", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::unconstrain_pars)
.method("constrain_pars", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::constrain_pars)
.method("num_pars_unconstrained", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::num_pars_unconstrained)
.method("unconstrained_param_names", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::unconstrained_param_names)
.method("constrained_param_names", &rstan::stan_fit<model_linexp_gastro_1d_namespace::model_linexp_gastro_1d, boost::random::ecuyer1988> ::constrained_param_names)
;
}

0 comments on commit dd36a7b

Please sign in to comment.