Create regression tables from generalized linear model(GLM), generalized estimating equation(GEE), generalized linear mixed-effects model(GLMM), Cox proportional hazards model, survey-weighted generalized linear model(svyglm) and survey-weighted Cox model results for publication.
Regression Tables from 'GLM', 'GEE', 'GLMM', 'Cox' and 'survey' Results for Publication.
install.packages("jstable")remotes::install_github('jinseob2kim/jstable')library(jstable)
## Gaussianglm_gaussian <- glm(mpg~cyl + disp, data = mtcars)glmshow.display(glm_gaussian, decimal = 2)
## $first.line
## [1] "Linear regression predicting mpg\n"
##
## $table
## crude coeff.(95%CI) crude P value adj. coeff.(95%CI)
## cyl "-2.88 (-3.51,-2.24)" "< 0.001" "-1.59 (-2.98,-0.19)"
## disp "-0.04 (-0.05,-0.03)" "< 0.001" "-0.02 (-0.04,0)"
## adj. P value
## cyl "0.034"
## disp "0.054"
##
## $last.lines
## [1] "No. of observations = 32\nR-squared = 0.7596\nAIC value = 167.1456\n\n"
##
## attr(,"class")
## [1] "display" "list"
## Binomialglm_binomial <- glm(vs~cyl + disp, data = mtcars, family = binomial)glmshow.display(glm_binomial, decimal = 2)
## $first.line
## [1] "Logistic regression predicting vs\n"
##
## $table
## crude OR.(95%CI) crude P value adj. OR.(95%CI) adj. P value
## cyl "0.2 (0.08,0.56)" "0.002" "0.15 (0.02,1.02)" "0.053"
## disp "0.98 (0.97,0.99)" "0.002" "1 (0.98,1.03)" "0.715"
##
## $last.lines
## [1] "No. of observations = 32\nAIC value = 23.8304\n\n"
##
## attr(,"class")
## [1] "display" "list"
geeglm
object from geepack packagelibrary(geepack) ## for dietox datadata(dietox)dietox$Cu <- as.factor(dietox$Cu)dietox$ddn = as.numeric(rnorm(nrow(dietox)) > 0)gee01 <- geeglm (Weight ~ Time + Cu , id = Pig, data = dietox, family = gaussian, corstr = "ex")geeglm.display(gee01)
## $caption
## [1] "GEE(gaussian) predicting Weight by Time, Cu - Group Pig"
##
## $table
## crude coeff(95%CI) crude P value adj. coeff(95%CI)
## Time "6.94 (6.79,7.1)" "< 0.001" "6.94 (6.79,7.1)"
## Cu: ref.=1 NA NA NA
## 2 "-0.59 (-3.73,2.54)" "0.711" "-0.84 (-3.9,2.23)"
## 3 "1.9 (-1.87,5.66)" "0.324" "1.77 (-1.9,5.45)"
## adj. P value
## Time "< 0.001"
## Cu: ref.=1 NA
## 2 "0.593"
## 3 "0.345"
##
## $metric
## crude coeff(95%CI) crude P value
## NA NA
## Estimated correlation parameters "0.775" NA
## No. of clusters "72" NA
## No. of observations "861" NA
## adj. coeff(95%CI) adj. P value
## NA NA
## Estimated correlation parameters NA NA
## No. of clusters NA NA
## No. of observations NA NA
gee02 <- geeglm (ddn ~ Time + Cu , id = Pig, data = dietox, family = binomial, corstr = "ex")geeglm.display(gee02)
## $caption
## [1] "GEE(binomial) predicting ddn by Time, Cu - Group Pig"
##
## $table
## crude OR(95%CI) crude P value adj. OR(95%CI)
## Time "0.99 (0.96,1.03)" "0.785" "0.99 (0.96,1.03)"
## Cu: ref.=1 NA NA NA
## 2 "1.14 (0.79,1.65)" "0.485" "1.14 (0.79,1.65)"
## 3 "1.06 (0.72,1.57)" "0.76" "1.06 (0.72,1.57)"
## adj. P value
## Time "0.783"
## Cu: ref.=1 NA
## 2 "0.484"
## 3 "0.76"
##
## $metric
## crude OR(95%CI) crude P value
## NA NA
## Estimated correlation parameters "0.026" NA
## No. of clusters "72" NA
## No. of observations "861" NA
## adj. OR(95%CI) adj. P value
## NA NA
## Estimated correlation parameters NA NA
## No. of clusters NA NA
## No. of observations NA NA
lmerMod
or glmerMod
object from lme4 packagelibrary(lme4)l1 = lmer(Weight ~ Time + Cu + (1|Pig) + (1|Evit), data = dietox)lmer.display(l1, ci.ranef = T)
## $table
## crude coeff(95%CI) crude P value adj. coeff(95%CI)
## Time 6.94 (6.88,7.01) 0.0000000 6.94 (6.88,7.01)
## Cu: ref.=1 <NA> NA <NA>
## 2 -0.57 (-4.66,3.52) 0.7837028 -0.81 (-4.42,2.8)
## 3 1.9 (-2.23,6.04) 0.3666829 1.78 (-1.87,5.43)
## Random effects <NA> NA <NA>
## Pig 39.71 (27.82,54.93) NA <NA>
## Evit 0.9 (0,13.45) NA <NA>
## Residual 11.37 (10.3,12.55) NA <NA>
## Metrics <NA> NA <NA>
## No. of groups (Pig) 72 NA <NA>
## No. of groups (Evit) 3 NA <NA>
## No. of observations 861 NA <NA>
## Log-likelihood -2400.69 NA <NA>
## AIC value 4801.38 NA <NA>
## adj. P value
## Time 0.0000000
## Cu: ref.=1 NA
## 2 0.6598522
## 3 0.3393579
## Random effects NA
## Pig NA
## Evit NA
## Residual NA
## Metrics NA
## No. of groups (Pig) NA
## No. of groups (Evit) NA
## No. of observations NA
## Log-likelihood NA
## AIC value NA
##
## $caption
## [1] "Linear mixed model fit by REML : Weight ~ Time + Cu + (1 | Pig) + (1 | Evit)"
l2 = glmer(ddn ~ Weight + Time + (1|Pig), data= dietox, family= "binomial")lmer.display(l2)
## $table
## crude OR(95%CI) crude P value adj. OR(95%CI)
## Weight 1 (0.99,1.01) 0.9358643 1.01 (0.99,1.03)
## Time 0.99 (0.96,1.03) 0.7905865 0.95 (0.81,1.1)
## Random effects <NA> NA <NA>
## Pig 0.1 NA <NA>
## Metrics <NA> NA <NA>
## No. of groups (Pig) 72 NA <NA>
## No. of observations 861 NA <NA>
## Log-likelihood -594.2 NA <NA>
## AIC value 1196.4 NA <NA>
## adj. P value
## Weight 0.4925311
## Time 0.4642975
## Random effects NA
## Pig NA
## Metrics NA
## No. of groups (Pig) NA
## No. of observations NA
## Log-likelihood NA
## AIC value NA
##
## $caption
## [1] "Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) : ddn ~ Weight + Time + (1 | Pig)"
frailty
or cluster
optionslibrary(survival)fit1 <- coxph(Surv(time, status) ~ ph.ecog + age + cluster(inst), lung, model = T) ## model = T: to extract original datafit2 <- coxph(Surv(time, status) ~ ph.ecog + age + frailty(inst), lung, model = T)cox2.display(fit1)
## $table
## crude HR(95%CI) crude P value adj. HR(95%CI) adj. P value
## ph.ecog "1.61 (1.25,2.08)" "< 0.001" "1.56 (1.22,2)" "< 0.001"
## age "1.02 (1.01,1.03)" "0.007" "1.01 (1,1.02)" "0.085"
##
## $ranef
## [,1] [,2] [,3] [,4]
## cluster NA NA NA NA
## inst NA NA NA NA
##
## $metric
## [,1] [,2] [,3] [,4]
## <NA> NA NA NA NA
## No. of observations 226 NA NA NA
## No. of events 163 NA NA NA
##
## $caption
## [1] "Marginal Cox model on time ('time') to event ('status') - Group inst"
cox2.display(fit2)
## $table
## crude HR(95%CI) crude P value adj. HR(95%CI) adj. P value
## ph.ecog "1.64 (1.31,2.05)" "< 0.001" "1.58 (1.26,1.99)" "< 0.001"
## age "1.02 (1,1.04)" "0.041" "1.01 (0.99,1.03)" "0.225"
##
## $ranef
## [,1] [,2] [,3] [,4]
## frailty NA NA NA NA
## inst NA NA NA NA
##
## $metric
## [,1] [,2] [,3] [,4]
## <NA> NA NA NA NA
## No. of observations 226 NA NA NA
## No. of events 163 NA NA NA
##
## $caption
## [1] "Frailty Cox model on time ('time') to event ('status') - Group inst"
coxme
object from coxme packagelibrary(coxme)fit <- coxme(Surv(time, status) ~ ph.ecog + age + (1|inst), lung)coxme.display(fit)
## $table
## crude HR(95%CI) crude P value adj. HR(95%CI) adj. P value
## ph.ecog "1.66 (1.32,2.09)" "< 0.001" "1.61 (1.27,2.03)" "< 0.001"
## age "1.02 (1,1.04)" "0.043" "1.01 (0.99,1.03)" "0.227"
##
## $ranef
## [,1] [,2] [,3] [,4]
## Random effect NA NA NA NA
## inst(Intercept) 0.02 NA NA NA
##
## $metric
## [,1] [,2] [,3] [,4]
## <NA> NA NA NA NA
## No. of groups(inst) 18 NA NA NA
## No. of observations 226 NA NA NA
## No. of events 163 NA NA NA
##
## $caption
## [1] "Mixed effects Cox model on time ('time') to event ('status') - Group inst"
svyglm
object from survey packagelibrary(survey)data(api)apistrat$tt = c(rep(1, 20), rep(0, nrow(apistrat) -20))apistrat$tt2 = factor(c(rep(0, 40), rep(1, nrow(apistrat) -40)))dstrat<-svydesign(id=~1,strata=~stype, weights=~pw, data=apistrat, fpc=~fpc)ds <- svyglm(api00~ell+meals+mobility + tt2, design=dstrat)ds2 <- svyglm(tt~ell+meals+mobility + tt2, design=dstrat, family = quasibinomial())svyregress.display(ds)
## $first.line
## [1] "Linear regression predicting api00- weighted data\n"
##
## $table
## crude coeff.(95%CI) crude P value adj. coeff.(95%CI)
## ell "-3.73 (-4.35,-3.11)" "< 0.001" "-0.48 (-1.25,0.29)"
## meals "-3.38 (-3.71,-3.05)" "< 0.001" "-3.14 (-3.69,-2.59)"
## mobility "-1.43 (-3.3,0.44)" "0.137" "0.22 (-0.55,0.99)"
## tt2: 1 vs 0 "10.98 (-34.16,56.12)" "0.634" "6.13 (-17.89,30.15)"
## adj. P value
## ell "0.222"
## meals "< 0.001"
## mobility "0.573"
## tt2: 1 vs 0 "0.618"
##
## $last.lines
## [1] "No. of observations = 200\nAIC value = 2309.8282\n\n"
##
## attr(,"class")
## [1] "display" "list"
svyregress.display(ds2)
## $first.line
## [1] "Logistic regression predicting tt- weighted data\n"
##
## $table
## crude OR.(95%CI) crude P value adj. OR.(95%CI)
## ell "1.02 (1,1.05)" "0.047" "1.11 (1.03,1.21)"
## meals "1.01 (0.99,1.03)" "0.255" "0.95 (0.91,1)"
## mobility "1.01 (0.98,1.03)" "0.506" "1.1 (0.98,1.23)"
## tt2: 1 vs 0 "0 (0,0)" "< 0.001" "0 (0,0)"
## adj. P value
## ell "0.009"
## meals "0.068"
## mobility "0.114"
## tt2: 1 vs 0 "< 0.001"
##
## $last.lines
## [1] "No. of observations = 200\n\n"
##
## attr(,"class")
## [1] "display" "list"
svycoxph
object from survey packagedata(pbc, package="survival")pbc$sex = factor(pbc$sex)pbc$stage = factor(pbc$stage)pbc$randomized<-with(pbc, !is.na(trt) & trt>0)biasmodel<-glm(randomized~age*edema,data=pbc,family=binomial)pbc$randprob<-fitted(biasmodel)if (is.null(pbc$albumin)) pbc$albumin<-pbc$alb ##pre2.9.0dpbc <- svydesign(id=~1, prob=~randprob, strata=~edema, data=subset(pbc,randomized))model <- svycoxph(Surv(time,status>0)~ sex + protime + albumin + stage,design=dpbc)svycox.display(model)
## Stratified Independent Sampling design (with replacement)
## svydesign(id = ~1, prob = ~randprob, strata = ~edema, data = subset(pbc,
## randomized))
## Stratified Independent Sampling design (with replacement)
## svydesign(id = ~1, prob = ~randprob, strata = ~edema, data = subset(pbc,
## randomized))
## Stratified Independent Sampling design (with replacement)
## svydesign(id = ~1, prob = ~randprob, strata = ~edema, data = subset(pbc,
## randomized))
## Stratified Independent Sampling design (with replacement)
## svydesign(id = ~1, prob = ~randprob, strata = ~edema, data = subset(pbc,
## randomized))
## Stratified Independent Sampling design (with replacement)
## svydesign(id = ~1, prob = ~randprob, strata = ~edema, data = subset(pbc,
## randomized))
## $table
## crude HR(95%CI) crude P value adj. HR(95%CI)
## sex: f vs m "0.62 (0.4,0.97)" "0.038" "0.55 (0.33,0.9)"
## protime "1.37 (1.09,1.72)" "0.006" "1.52 (1.2,1.91)"
## albumin "0.2 (0.14,0.29)" "< 0.001" "0.31 (0.2,0.47)"
## stage: ref.=1 NA NA NA
## 2 "5.67 (0.77,41.78)" "0.089" "10.94 (1.01,118.55)"
## 3 "9.78 (1.37,69.94)" "0.023" "17.03 (1.69,171.6)"
## 4 "22.89 (3.2,163.48)" "0.002" "22.56 (2.25,226.42)"
## adj. P value
## sex: f vs m "0.017"
## protime "< 0.001"
## albumin "< 0.001"
## stage: ref.=1 NA
## 2 "0.049"
## 3 "0.016"
## 4 "0.008"
##
## $metric
## [,1] [,2] [,3] [,4]
## <NA> NA NA NA NA
## No. of observations 312.00 NA NA NA
## No. of events 144.00 NA NA NA
## AIC 1483.12 NA NA NA
##
## $caption
## [1] "Survey cox model on time ('time') to event ('status > 0')"
library(survival); library(dplyr)lung %>%mutate(status = as.integer(status == 1),sex = factor(sex),kk = factor(as.integer(pat.karno >= 70)),kk1 = factor(as.integer(pat.karno >= 60))) -> lungTableSubgroupMultiCox(Surv(time, status) ~ sex, var_subgroups = c("kk", "kk1"), data=lung, line = T)
## Variable Count Percent Point Estimate Lower Upper 0 1 P value
## 1 Overall 228 100 1.91 1.14 3.2 41.3 58.7 0.014
## 2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 3 kk <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 4 0 38 38 2.88 0.31 26.49 20 80 0.35
## 5 1 187 187 1.84 1.08 3.14 43.1 56.9 0.026
## 6 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 7 kk1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 8 0 8 8 <NA> <NA> <NA> 0 100 <NA>
## 9 1 217 217 1.88 1.12 3.17 42.6 57.4 0.018
## P for interaction
## 1 <NA>
## 2 <NA>
## 3 0.525
## 4 <NA>
## 5 <NA>
## 6 <NA>
## 7 0.997
## 8 <NA>
## 9 <NA>
## Survey datalibrary(survey)data.design <- svydesign(id = ~1, data = lung)TableSubgroupMultiCox(Surv(time, status) ~ sex, var_subgroups = c("kk", "kk1"), data = data.design, line = F)
## Independent Sampling design (with replacement)
## svydesign(id = ~1, data = lung)
## Independent Sampling design (with replacement)
## svydesign(id = ~1, data = lung)
## Independent Sampling design (with replacement)
## subset(data, get(var_subgroup) == .)
## Independent Sampling design (with replacement)
## subset(data, get(var_subgroup) == .)
## Independent Sampling design (with replacement)
## svydesign(id = ~1, data = lung)
## Independent Sampling design (with replacement)
## subset(data, get(var_subgroup) == .)
## Variable Count Percent Point Estimate Lower Upper 0 1 P value
## 1 Overall 228 100 1.91 1.14 3.19 41.3 58.7 0.013
## 2 kk <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 3 0 38 38 2.88 0.31 27.1 20 80 0.355
## 4 1 187 187 1.84 1.08 3.11 43.1 56.9 0.024
## 5 kk1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 6 0 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 7 1 217 217 1.88 1.12 3.15 42.6 57.4 0.017
## P for interaction
## 1 <NA>
## 2 0.523
## 3 <NA>
## 4 <NA>
## 5 <0.001
## 6 <NA>
## 7 <NA>
CreateTableOneJS
and svyCreateTableOneJS
can get simplified table with showAllLevels == F option.TableSubgroupMultiCox
: Get sub-group analysis table for forestplot with Cox/svycox model.CreateTableOneJS
and svyCreateTableOneJS
according to tableone package(0.10.0).cox2.display
Update travis-ci
Add appveyor CI to test window environment
Add vignettes
glmshow.display
svyCreateTableOne2
, svyCreateTableOneJS
, LabelJsTable
, LabelepiDisplay
and svyregress.display
coefNA
can be used in svyregress.display
svyglm
function.
Apply testhat.
Auto-selection between Chi-square test and Fisher's exact test in CreateTableOneJS
, CreateTableOne2
.
Table 1 for survey data: svyCreateTableOne2
and svyCreateTableOneJS
are modified functions of svyCreateTableOne
(tableone package).
New function: coefNA
Bug fixes: Coefficients in glmshow.display
, cox2.display
cox2.display
glmshow.display
, cox2.display
, geeglm.display
, coxme.display
glmshow.display
: table from glm.object
.LabelepiDisplay
: column name issue.svycox.display
: table from svycoxph.object
in survey packagesvyregress.display
: table from svyglm.object
in survey packageUpdate: cox2.display
function allows data
argument.
Remove jsBasicGadget
: Move to jsmodule package.
Shiny gadget for descriptive statistics: jsBasicGadget
Rstudio Addin of jsBasicGadget
: jsBasicAddin
geeExp
, lmerExp
functioncoxExp
, cox2.display
functionTable from coxph.object
(survival package) - allow cluster
& frailty
options: cox2.display
function
Apply label information to cox2.display
: LabeljsCox
function
Apply label information to geeglm.display
: LabeljsGeeglm
function
geeglm.display
functionApply label information to epiDisplay.object
: LabelepiDisplay
function
Apply label information to lmer.display
, coxme.display
: LabeljsMixed
function
coxme.object
(coxme package): coxme.display
functionopt.tb1
from 10 to 25.