Skip to content

Commit d69f4e4

Browse files
Matías Castillo AguilarMatías Castillo Aguilar
authored andcommitted
-
1 parent 6c9efec commit d69f4e4

File tree

16 files changed

+3891
-183
lines changed

16 files changed

+3891
-183
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package: writR
22
Title: Inferential statistics and reporting in APA style
3-
Version: 0.2.0.1
3+
Version: 0.3.0
44
Date: 2021-03-05
55
Authors@R:
66
person(given = "Matías",

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
export(aov_r)
44
export(cent_disp)
5+
export(contingency)
56
export(report)

R/aov.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ aov_r <- function(data
8888
rt <- model[i,]
8989
j <- if (grepl(pattern = ':', i)) gsub(':', '_', i) else i
9090
result[['full']][[j]] <- paste0(
91-
stats <- paste0("*F* ~", if(!is.null(within) && any(grepl(within, i))) at$correction else "Fisher"
91+
stats <- paste0("*F*~", if(!is.null(within) && any(grepl(within, i))) at$correction else "Fisher"
9292
, "~ (", rt$`num Df`
9393
,", ",rt$`den Df`
9494
,') = ',rt$F

R/bipair.R

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ bipair <- function(data
4646
d <- effectsize::effectsize(test, verbose = F)
4747

4848
desc <- if(markdown) {
49-
list(m = '*M* = ', i = ', *SD* = ', t = '*t* ~Student~ (', p = ', *p* '
50-
, d = "*d* ~Cohen's~ = ", ci = ', CI~95%~[') } else {
49+
list(m = '$M$ = ', i = ', $SD$ = ', t = '$t_{~Student}$ (', p = ', $p$ '
50+
, d = "$d_{~Cohen}$ = ", ci = ', CI~95%~[') } else {
5151
list(m = 'M = ', i = ', SD = ', t = 't(', p = ', p '
5252
, d = "d = ", ci = ', CI95% [') }
5353

@@ -84,7 +84,7 @@ bipair <- function(data
8484
, nboot = nboot)['AKP',]
8585

8686
desc <- if(markdown) {
87-
list(m = '*M* = ', i = ', *SD* = ', t = '*t* ~Yuen~ (', p = ', *p* '
87+
list(m = '$M$ = ', i = ', $SD$ = ', t = '$t_{~Yuen}$ (', p = ', $p$ '
8888
, d = '$\\delta_R^{AKP}$ = ', ci = ', CI~95%~[') } else {
8989
list(m = 'M = ', i = ', SD = ', t = 't(', p = ', p '
9090
, d = "delta = ", ci = ', CI95% [') }
@@ -115,8 +115,8 @@ bipair <- function(data
115115
paired = TRUE, verbose = FALSE)
116116

117117
desc <- if(markdown) {
118-
list(m = '*Mdn* = ', i = ', *IQR* = ', v = '*V* = ', p = ', *p* '
119-
, r = '*r* ~biserial~ = ', ci = ', CI~95%~[') } else {
118+
list(m = '$Mdn$ = ', i = ', $IQR$ = ', v = '$V$ = ', p = ', $p$ '
119+
, r = '$r_{~biserial}$ = ', ci = ', CI~95%~[') } else {
120120
list(m = 'Mdn = ', i = ', IQR = ', v = 'V = ', p = ', p '
121121
, r = 'r = ', ci = ', CI95% [') }
122122

R/bitwo.R

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ bitwo <- function(data
5656
d <- effectsize::effectsize(test, verbose = F)
5757

5858
desc <- if(markdown) {
59-
list(m = '*M* = ', i = ', *SD* = ', t = '*t* ~Student~ (', p = ', *p* '
60-
, d = "*d* ~Cohen's~ = ", ci = ', CI~95%~[') } else {
59+
list(m = '$M$ = ', i = ', $SD$ = ', t = '$t_{~Student}$ (', p = ', $p$ '
60+
, d = "$d_{~Cohen}$ = ", ci = ', CI~95%~[') } else {
6161
list(m = 'M = ', i = ', SD = ', t = 't(', p = ', p '
6262
, d = "d = ", ci = ', CI95% [') }
6363

@@ -87,8 +87,8 @@ bitwo <- function(data
8787
d <- effectsize::effectsize(test, verbose = F)
8888

8989
desc <- if(markdown) {
90-
list(m = '*M* = ', i = ', *SD* = ', t = '*t* ~Welch~ (', p = ', *p* '
91-
, d = "*d* ~Cohen's~ = ", ci = ', CI~95%~[') } else {
90+
list(m = '$M$ = ', i = ', $SD$ = ', t = '$t_{~Welch}$ (', p = ', $p$ '
91+
, d = "$d_{~Cohen}$ = ", ci = ', CI~95%~[') } else {
9292
list(m = 'M = ', i = ', SD = ', t = 't(', p = ', p '
9393
, d = "d = ", ci = ', CI95% [') }
9494

@@ -126,7 +126,7 @@ bitwo <- function(data
126126
, nboot = nboot)
127127

128128
desc <- if(markdown) {
129-
list(m = '*M* = ', i = ', *SD* = ', t = '*t* ~Yuen~ (', p = ', *p* '
129+
list(m = '$M$ = ', i = ', $SD$ = ', t = '$t_{~Yuen}$ (', p = ', $p$ '
130130
, d = '$\\xi$ = ', ci = ', CI~95%~[') } else {
131131
list(m = 'M = ', i = ', SD = ', t = 't(', p = ', p '
132132
, d = "xi = ", ci = ', CI95% [') }
@@ -156,8 +156,8 @@ bitwo <- function(data
156156
r <- effectsize::rank_biserial(data[[variable]] ~ data[[by]], data = data)
157157

158158
desc <- if(markdown) {
159-
list(m = '*Mdn* = ', i = ', *IQR* = ', w = '*W* =', p = ', *p* '
160-
, r = '*r* ~biserial~ = ', ci = ', CI~95%~[') } else {
159+
list(m = '$Mdn$ = ', i = ', $IQR$ = ', w = '$W$ =', p = ', $p$ '
160+
, r = '$r_{~biserial}$ = ', ci = ', CI~95%~[') } else {
161161
list(m = 'Mdn = ', i = ', IQR = ', w = 'W =', p = ', p '
162162
, r = 'r = ', ci = ', CI95% [') }
163163

R/cent_disp.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ cent_disp <- function (x
1616
if(!is.numeric(x)) stop(paste(deparse(substitute(x)), "is not numeric."))
1717
if(type == 'auto') {
1818
.norm <- if(length(x) < 50)
19-
shapiro.test(x)$p.value > 0.05 else
19+
stats::shapiro.test(x)$p.value > 0.05 else
2020
nortest::lillie.test(x)$p.value > 0.05
2121
type <- if(.norm) "p" else "np"
2222
}
@@ -25,6 +25,6 @@ cent_disp <- function (x
2525
m <- round(.f$cent(x, na.rm = T), k)
2626
i <- round(.f$disp(x, na.rm = T), k)
2727
if(markdown)
28-
paste0('*',.f$m,'* = ',m,', *',.f$i,'* = ',i) else
28+
paste0('$',.f$m,'$ = ',m,', $',.f$i,'$ = ',i) else
2929
paste0(.f$m,' = ',m,', ',.f$i,' = ',i)
3030
}

R/contingency.R

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
#' Report categorical analyses
2+
#'
3+
#' Perform nominal/ordinal analysis on 1 dimensional table for goodnes-of-fit chi-squared, and two dimensional data for Pearson chi-squared, Fisher exact test or (if paired), McNemar test reporting their corresponding stats and effect sizes in APA Style.
4+
#' @param data Data frame containing the variables `x` and `y`.
5+
#' @param x Factor variable, quoted or unquoted.
6+
#' @param y Factor. If `NULL`, a goodness-of-fit is carried, otherwise a two-way analysis is performed.
7+
#' @param paired Logical. If `TRUE` McNemar's Chi-squared test is carried on.
8+
#' @param exact Logical. If `TRUE` then Fisher's Exact Test is carried on, but only when `paired = FALSE` (default). If is a 2 x 2 design, Odds Ratio (OR) is returned as effect size, otherwise it will only return the formated p-value.
9+
#' @param markdown Whether you want the output formated for inline R Markdown or as plain text.
10+
#' @param ... Currently not used.
11+
#' @keywords contingency
12+
#' @return A list of length 3 or 2 with statistical test and `$method` used.
13+
#' @export
14+
15+
contingency <- function(data
16+
, x
17+
, y = NULL
18+
, paired = FALSE
19+
, exact = FALSE
20+
, markdown = TRUE
21+
, ...) {
22+
.arg <- match.call()
23+
24+
x.var <- data[[.arg$x]]
25+
if(is.null(.arg$y)) {
26+
way <- "One"
27+
} else {
28+
y.var <- data[[.arg$y]]
29+
way <- "Two"
30+
}
31+
32+
result <- list()
33+
test <- if(isTRUE(paired)) "Mcnemar" else
34+
if(isTRUE(exact)) "Exact" else
35+
"Chi"
36+
37+
if(test == "Chi") {
38+
tab <- if(way == "One")
39+
list(table(x.var),
40+
"gof",
41+
"Chi-squared test for given probabilities") else
42+
list(table(x.var, y.var),
43+
"Pearson",
44+
"Pearson's Chi-squared test")
45+
test <- stats::chisq.test(
46+
x = tab[[1]],
47+
correct = FALSE)
48+
es <- effectsize::cramers_v(
49+
x = tab[[1]],
50+
adjust = FALSE)
51+
expr <- if(isTRUE(markdown))
52+
list(a = paste0("$\\chi^2_{~", tab[[2]], "}$ ("),
53+
b = ", $p$ ",
54+
c = "$V_{~Cramer}$ = ",
55+
d = ', CI~95%~[') else
56+
list(a = "X^2 (",
57+
b = ", p ",
58+
c = "V = ",
59+
d = ', CI95% [')
60+
result[['full']] <- paste0(
61+
result[['stats']] <- paste0(
62+
expr$a,
63+
test$parameter,
64+
") = ",
65+
round(test$statistic,2),
66+
expr$b,
67+
ifelse(
68+
test$p.value < 0.001,
69+
'< 0.001',
70+
paste(
71+
'=',
72+
round(test$p.value, 3)
73+
)
74+
)
75+
), ', ',
76+
result[['es']] <- paste0(
77+
expr$c,
78+
round(es$Cramers_v,2),
79+
expr$d,
80+
round(es$CI_low,2),
81+
', ',
82+
round(es$CI_high,2),
83+
']')
84+
)
85+
result[['method']] <- tab[[3]]
86+
return(result)
87+
88+
} else {
89+
if(test == "Exact") {
90+
tab <- table(x.var, y.var)
91+
test <- stats::fisher.test(
92+
x = tab)
93+
error <- class(
94+
try(
95+
expr = {
96+
(es <- effectsize::oddsratio(
97+
x = x.var,
98+
y = y.var) )
99+
},
100+
silent = TRUE)
101+
) == "try-error"
102+
if(isTRUE(error)) {
103+
expr <- if(isTRUE(markdown))
104+
list(a = "$p_{~FET}$ ") else
105+
list(a = "FET, p ")
106+
result[['full']] <- paste0(
107+
result[['stats']] <- paste0(
108+
expr$a,
109+
ifelse(
110+
test = test$p.value < 0.001,
111+
yes = '< 0.001',
112+
no = paste(
113+
'=',
114+
round(test$p.value, 3)
115+
)
116+
)
117+
)
118+
)
119+
result[['es']] <- "Not available"
120+
result[['method']] <- "Fisher's Exact Test for Count Data"
121+
return(result)
122+
} else {
123+
expr <- if(isTRUE(markdown))
124+
list(a = "$p_{~FET}$ ",
125+
b = "$OR$ = ",
126+
c = ', CI~95%~[') else
127+
list(a = "FET: p ",
128+
b = "OR = ",
129+
c = ', CI95% [')
130+
result[['full']] <- paste0(
131+
result[['stats']] <- paste0(
132+
expr$a,
133+
ifelse(
134+
test = test$p.value < 0.001,
135+
yes = '< 0.001',
136+
no = paste(
137+
'=',
138+
round(test$p.value, 3)
139+
)
140+
)
141+
)
142+
, ', ',
143+
result[['es']] <- paste0(
144+
expr$b,
145+
round(es$Odds_ratio,2),
146+
expr$c,
147+
round(es$CI_low,2),
148+
', ',
149+
round(es$CI_high,2),
150+
']')
151+
)
152+
result[['method']] <- "Fisher's Exact Test for Count Data"
153+
return(result)
154+
}
155+
} else {
156+
tab <- table(x.var,y.var)
157+
test <- stats::mcnemar.test(
158+
x = tab,
159+
correct = FALSE)
160+
es <- effectsize::cohens_g(
161+
x = tab)
162+
expr <- if(isTRUE(markdown))
163+
list(a = paste0("$\\chi^2_{~McNemar}$ ("),
164+
b = ", $p$ ",
165+
c = "$g_{~Cohen}$ = ",
166+
d = ', CI~95%~[') else
167+
list(a = "X^2 (",
168+
b = ", p ",
169+
c = "g = ",
170+
d = ', CI95% [')
171+
result[['full']] <- paste0(
172+
result[['stats']] <- paste0(
173+
expr$a,
174+
test$parameter,
175+
") = ",
176+
round(test$statistic,2),
177+
expr$b,
178+
ifelse(
179+
test = test$p.value < 0.001,
180+
yes = '< 0.001',
181+
no = paste(
182+
'=',
183+
round(test$p.value, 3)
184+
)
185+
)
186+
),
187+
', ',
188+
result[['es']] <- paste0(
189+
expr$c,
190+
round(es$Cohens_g,2),
191+
expr$d,
192+
round(es$CI_low,2),
193+
', ',
194+
round(es$CI_high,2),
195+
']')
196+
)
197+
result[['method']] <- "McNemar's Chi-squared test"
198+
return(result)
199+
}
200+
}
201+
}
202+

R/multgroup.R

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ multgroup <- function(data
7171
}
7272

7373
desc <- if(markdown) {
74-
list(m = '*M* = ', i = ', *SD* = ', f = '*F* ~Fisher~ (', p = ', *p* '
75-
, eta = '$\\eta$^2^ = ', ci = ', CI~95%~[') } else {
74+
list(m = '$M$ = ', i = ', $SD$ = ', f = '$F_{~Fisher}$ (', p = ', $p$ '
75+
, eta = '$\\eta^2$ = ', ci = ', CI~95%~[') } else {
7676
list(m = 'M = ', i = ', SD = ', f = 'F(', p = ', p '
7777
, eta = "eta^2 = ", ci = ', CI95% [') }
7878

@@ -113,8 +113,8 @@ multgroup <- function(data
113113
}
114114

115115
desc <- if(markdown) {
116-
list(m = '*M* = ', i = ', *SD* = ', f = '*F* ~Welch~ (', p = ', *p* '
117-
, eta = '$\\eta$^2^ = ', ci = ', CI~95%~[') } else {
116+
list(m = '$M$ = ', i = ', $SD$ = ', f = '$F_{~Welch}$ (', p = ', $p$ '
117+
, eta = '$\\eta^2$ = ', ci = ', CI~95%~[') } else {
118118
list(m = 'M = ', i = ', SD = ', f = 'F(', p = ', p '
119119
, eta = "eta^2 = ", ci = ', CI95% [') }
120120

@@ -159,7 +159,7 @@ multgroup <- function(data
159159
}
160160

161161
desc <- if(markdown) {
162-
list(m = '*M* = ', i = ', *SD* = ', f = '*F* ~trimed-means~ (', p = ', *p* '
162+
list(m = '$M$ = ', i = ', $SD$ = ', f = '$F_{~trimed-means}$ (', p = ', $p$ '
163163
, xi = '$\\xi$ = ', ci = ', CI~95%~[') } else {
164164
list(m = 'M = ', i = ', SD = ', f = 'F(', p = ', p '
165165
, xi = "xi = ", ci = ', CI95% [') }
@@ -202,8 +202,8 @@ multgroup <- function(data
202202
}
203203

204204
desc <- if(markdown) {
205-
list(m = '*Mdn* = ', i = ', *IQR* = ', chi = '$\\chi$^2^ ~Kruskal-Wallis~ (', p = ', *p* '
206-
, ep = '$\\epsilon$^2^ = ', ci = ', CI~95%~[') } else {
205+
list(m = '$Mdn$ = ', i = ', $IQR$ = ', chi = '$\\chi^2_{~Kruskal-Wallis}$ (', p = ', $p$ '
206+
, ep = '$\\epsilon^2$ = ', ci = ', CI~95%~[') } else {
207207
list(m = 'Mdn = ', i = ', IQR = ', chi = 'X^2(', p = ', p '
208208
, ep = 'epsilon^2 = ', ci = ', CI95% [') }
209209

0 commit comments

Comments
 (0)