-
Notifications
You must be signed in to change notification settings - Fork 0
/
Statistic_without_math.Rmd
556 lines (371 loc) · 29.6 KB
/
Statistic_without_math.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
---
title: "Statistica senza Matematica"
runningheader: "Un manualetto di statistica adatta ad uso medico" # only for pdf output
subtitle: "Un manualetto di statistica adatta ad uso medico" # only for html output
author: "Pirani Max Enrico"
date: "`r Sys.Date()`"
output:
tufte::tufte_handout:
citation_package: natbib
latex_engine: xelatex
tufte::tufte_book:
citation_package: natbib
latex_engine: xelatex
tufte::tufte_html: default
bibliography: skeleton.bib
link-citations: yes
---
```{r setup, include=FALSE}
library(tufte)
# invalidate cache when the tufte version changes
knitr::opts_chunk$set(cache.extra = packageVersion('tufte'))
options(htmltools.dir.version = FALSE)
```
# Introduzione
Ho scritto questo libro principalmente per i nostri studenti, la maggior parte dei quali non amava la matematica e non capiva perché dovessero imparare le formule matematiche quando il software del computer eseguiva i calcoli per loro. Non li convinceva l'argomentazione secondo cui l'esecuzione dei calcoli avrebbe permesso loro di comprendere il test, e non convinceva nemmeno noi. Volevamo che avessero una comprensione concettuale della statistica e che si divertissero ad analizzare i dati. Negli ultimi 20 anni abbiamo dovuto adattare il nostro insegnamento a gruppi numerosi di studenti, molti dei quali non avevano una formazione formale in matematica. Ci siamo resi conto che era difficile consigliare alcuni dei tradizionali libri di testo di statistica: o erano pieni di formule matematiche, e venivano percepiti dagli studenti come noiosi, o erano semplici ricette di cucina statistica, che mostravano loro come eseguire i calcoli, ma non davano loro una reale comprensione del significato delle statistiche. Abbiamo quindi deciso di scrivere questo libro, che cerca di dare agli studenti una comprensione concettuale della statistica evitando la distrazione delle formule e dei calcoli.
Abbiamo cercato di semplificare concetti complessi, a volte molto complessi. La semplificazione comporta un compromesso in termini di accuratezza. Ne eravamo consapevoli durante la stesura del libro e abbiamo cercato di essere il più accurati possibile, pur fornendo la spiegazione più semplice. Siamo anche consapevoli che alcuni studenti non utilizzano `R` per l'analisi dei dati. SPSS®, tuttavia, è ancora uno dei pacchetti statistici più utilizzati nelle scienze sociali ed è per questo che il testo è strettamente legato a `R`. Gli studenti che non utilizzano questo pacchetto dovrebbero comunque trovare il libro utile.
# Statistica descrittiva
## Media
La media è la somma di tutti i risultati in un campione diviso per il numerodei risultati nel campione. In altre parole, si calcola prendendo la somma ditutti i valori nel campione e dividendo per il numero totale di valori nel campione.
Un esempio di calcolo di media in `R` :
```{r}
# Inizializzazione dei valori
voti <- c(80, 85, 90, 95)
# Calcolo della media
media <- mean(voti)
# Visualizzazione della media
media
```
Questo codice calcolerà la media dei voti presenti nel vettore `voti` e restituirà il risultato.
## Mediana
La mediana è il valore che si trova esattamente al centro di un insieme ordinato di numeri. Per calcolare la mediana, è necessario ordinare i n ordine crescente o decrescente e trovare il valore centrale o la media dei due valori centrali se il numero di elementi è pari.
Ecco un esempio di calcolo della mediana in R utilizzando Rmarkdown:
```{r}
# Dataset di esempio
dati <- c(2, 3, 5, 6, 8, 10, 12, 15)
# Calcolo della mediana
mediana <- median(dati)
# Stampa il risultato
mediana
```
Nell'esempio sopra, abbiamo un vettore di dati `dati` e utilizziamo la funzione `median()` di R per calcolare la mediana dei valori. Il risultato viene quindi visualizzato tramite la funzione `print()`.
## Definizione di Ranking ##
Il ranking è un metodo per ordinare una serie di oggetti in base a una determinata caratteristica o criterio. In sostanza, il ranking assegna un posto o una posizione unica a ciascun oggetto, in base a come si posiziona rispetto agli altri oggetti.Ecco un esempio di come calcolare il ranking di una lista di valori in `R`
Iniziamo creando un nuovo documento R Markdown (.Rmd) nel tuo ambiente R.
Prima di tutto, assicurati di avere installati i pacchetti necessari. In questo esempio utilizzeremo il pacchetto "dplyr" per la manipolazione dei dati e il pacchetto "tidyr" per la trasformazione dei dati in formato lungo.
Ecco un esempio di codice R Markdown:
```{r}
# Creazione dei dati di esempio
valori <- c(10, 5, 8, 2)
# Calcolo del ranking dei valori
ranking <- rank(-valori, ties.method = "min")
# Visualizzazione del ranking
ranking
```
La funzione `rank()` viene utilizzata per calcolare il ranking dei valori nel vettore `valori`. L'argomento `ties.method = "min"` viene utilizzato per gestire il caso in cui ci siano valori duplicati nel vettore. In questo caso, il metodo "min" viene utilizzato per assegnare il ranking più basso ai valori duplicati (ad esempio, se ci sono due valori uguali al secondo posto, entrambi riceveranno il ranking 2).
Nell'esempio, il vettore `valori` contiene i valori [10, 5, 8, 2]. Il codice calcola il ranking di questi valori, ottenendo [1, 3, 2, 4]. Significa che il numero più alto (10) ha il ranking 1, il numero successivo più alto (8) ha il ranking 2, il terzo più alto (5) ha il ranking 3 e l'ultimo (2) ha il ranking 4. Questo viene visualizzato usando la funzione `print()`.
## Definizione di Moda in statistica descrittiva ##
La moda in statistica descrittiva è il valore che compare più frequentemente inun insieme di dati. In altre parole, è il valore che si presenta con la maggiore frequenza. Ecco un esempio in `R`:
```R
# Esempio di calcolo della moda in R
x <- c(1, 2, 3, 3, 4, 4, 5, 5, 5)
moda <- unique(x)[which.max(tabulate(match(x, unique(x))))]
print(moda)
```
Nell'esempio fornito, l'insieme di dati `x` contiene i numeri da 1 a 5, ma con frequenze diverse. La moda sarà quindi il valore 5, poiché compare più frequentemente degli altri valori.
## Problema del calcolo delle medie quando gli estremi sono troppo distanti tra loro
Quando gli estremi in un insieme di dati sono troppo distanti tra loro, potrebbeesserci un problema nel calcolo della media. La media è influenzata dai valoriestremi perché tiene conto di tutti i valori nel calcolo. Se ci sono valoriestremamente alti o bassi, possono distorcere la media.
Hai ragione, la presenza di valori estremi in un insieme di dati può influenzare significativamente la media calcolata. In questi casi, può essere più appropriato considerare l'uso di altre misure statistiche, come la mediana o la moda, che possono essere meno influenzate da valori estremi. Un esempio pratico di questo potrebbe essere :
Ad esempio, se stiamo cercando di calcolare la media dei redditi delle persone in una determinata area, ma ci sono poche persone con redditi molto elevati o molto bassi che distorcono significativamente la media, allora potrebbe essere più utile considerare la mediana dei redditi, che rappresenta il valore centrale dell'insieme di dati. In questo modo, si riduce l'influenza dei valori estremi e si ottiene una misura più rappresentativa della distribuzione dei redditi. Oppure un altro esempio:
> Se calcoliamo la media di questi voti, otterremo:
(50 + 60 + 70 + 80 + 90 + 100 + 200) / 7 = 750 / 7 ≈ 107.14
Qui possiamo notare che il valore estremo di 200 ha fortemente influenzato la media, portandola ad essere piuttosto alta. Questo può avere un effetto distorto sulla rappresentazione complessiva dei dati.
In situazioni come questa, potrebbe essere più appropriato utilizzare altre misure di tendenza centrale come la mediana o la moda, che non sono influenzate in modo significativo dai valori estremi.
In conclusione, quando gli estremi sono troppo distanti tra loro, è importante considerare l'utilizzo di diverse misure di tendenza centrale e valutare le caratteristiche dei dati per ottenere una descrizione accurata e completa.
In caso di valori estremi che potrebbero influenzare significativamente la media, potrebbe essere più appropriato utilizzare la mediana o la moda come misure di tendenza centrale.
La mediana è il valore centrale di un insieme di dati ordinato, che non viene influenzato dai valori estremi. Ordinando i dati in ordine crescente o decrescente, la mediana sarà il valore esattamente al centro della lista.
La moda, d'altra parte, è il valore che compare più frequentemente nella lista di dati. La moda è anche meno influenzata dai valori estremi rispetto alla media, poiché si basa sulla frequenza di comparsa dei valori piuttosto che sulla loro somma.
Quindi, in caso di valori estremi, potrebbe essere utile considerare sia la mediana che la moda come alternative alla media per ottenere una visione più accurata del centro dei dati.
## Definizione di errore di campionatura
L'errore di campionatura è la discrepanza tra il valore stimato di una variabiledi interesse e il suo vero valore nella popolazione, causata dall'estrazione diun campione invece di raccogliere dati da tutta la popolazione. Questo errorepuò essere ridotto aumentando la dimensione del campione o utilizzando tecnichedi campionamento appropriate.
Un esempio pratico di errore di campionatura potrebbe essere l'indagine su un'elezione politica. Supponiamo di voler stimare la percentuale di voti che un candidato ha ottenuto nella popolazione generale. Selezioniamo un campione rappresentativo di elettori e chiediamo loro per chi hanno votato, potremmo ottenere una stima del risultato elettorale. Tuttavia, questa stima potrebbe deviare dal risultato reale a causa di variazioni casuali nel campione selezionato. Quanto più grande è il campione e quanto più accuratamente è selezionato, tanto più piccolo sarà l'errore di campionatura e tanto più accurata sarà la nostra stima.
## Cosa significa misura di tendenza centrale
La misura di tendenza centrale è un valore statistico che rappresenta un punto centrale o tipico di un insieme di dati. È utilizzato per indicare il valore intorno al quale si raggruppano i dati.
Ecco una definizione e un esempio pratico in R:
> Definizione: La misura di tendenza centrale è un valore che rappresenta la posizione centrale di un insieme di dati. Le tre misure di tendenza centrale comuni sono la media, la mediana e la moda.
Esempio pratico in R:
Supponiamo di avere un vettore di dati numeric, ad esempio: 3, 5, 7, 9, 11.
Per calcolare la media:
```R
dati <- c(3, 5, 7, 9, 11)
media <- mean(dati)
```
Per calcolare la mediana:
```R
dati <- c(3, 5, 7, 9, 11)
rediana <- median(dati)
```
Per calcolare la moda:
```R
dati <- c(3, 5, 5, 7, 9, 11)
moda <- table(dati)
moda <- as.numeric(names(moda)[moda == max(moda)])
```
Nell'esempio sopra, la media sarebbe 7, la mediana sarebbe 7 e la moda sarebbe 5. Queste tre misure di tendenza centrale ci danno informazioni diverse sulla distribuzione dei dati.
## Come ottenere una misura di tendenza centrale utilizzando R
I questo capitolo si descrivono i comandi per ottenere una misura di analisi centrale utilizzando R.
Ora iniziamo con l'imparare a creare un dataset utilizzando SQLite e creando il dataset partendo da una tabella già presente. Il database si chiama `dog_walking.db` mentre la tabella si chiama `walking_data`. Il tutto creando un codice in `R`.
Ecco un'esempio di codice in R che illustra come creare un dataset utilizzando SQLite e partendo da una tabella esistente:
```R
# Installa il pacchetto RSQLite se non hai già fatto
# install.packages("RSQLite")
# Carica il pacchetto RSQLite
library(RSQLite)
# Imposta la connessione al database
con <- dbConnect(RSQLite::SQLite(), "dog_walking.db")
# Esegue la query per selezionare tutti i dati dalla tabella
query <- "SELECT * FROM walking_data"
walkin_dog <- dbGetQuery(con, query)
# Chiudi la connessione al database
dbDisconnect(con)
# Stampa il dataset appena creato
print(walkin_dog)
```
Assicurati di avere il pacchetto `RSQLite` installato sul tuo sistema prima di eseguire questo codice. Puoi installarlo utilizzando la funzione `install.packages("RSQLite")` se necessario.
Ora vediamo di utilizzare un funzione che sia simile al commando `explore` nel pacchetto SPSS analizzando creando delle misure di tendenza centrale sempre usando R.
```R
library(summarytools)
descr(walkin_dog)
confidence_interval <- t.test(walkin_dog)$conf.init
confidence_interval
```
## La rappresentazione grafica dei dati ##
L'istogramma di frequenza è un utile strumento per illustrare graficamente i dati. I ricercatori sono spesso interessati alla frequenza di occorrenza dei valori nei loro dati di campionamento. Ad esempio, se si raccoglievano informazioni sulle occupazioni degli individui, si potrebbe essere interessati a scoprire quanti individui rientrano in ciascuna categoria di impiego. Per illustrare l'istogramma, consideriamo un istogramma di frequenza basato sui dati raccolti in uno studio del 2011 condotto da Armitage e Reidy (non pubblicato). In questo studio sulla paura del sangue, i ricercatori chiesero ai partecipanti di indicare da una lista di sette colori quale fosse il loro preferito. L'istogramma che rappresenta i dati è mostrato nella Figura . Dalla Figura si può notare che le persone in questo campione hanno valutato il blu come il colore preferito più spesso e il bianco come il meno preferito. L'istogramma di frequenza è un ottimo modo per ispezionare visivamente i dati. Spesso desideriamo sapere se ci sono punteggi che potrebbero sembrare un po' fuori posto.
Ora per importare il dataset nel mio database sqlite uso questo codice
```R
library(haven)
library(DBI)
con <- dbConnect(RSQLite::SQLite(), dbname= "dog_walking.db")
colors_data <- dbReadTable(con, "colors")
```
```R
# Funzione da rivedere
## library(ggplot2)
## # Crea l'istogramma
## grafico_istogramma <- ggplot(data_colors, aes(x = colours)) +
## geom_bar(fill = "green", color = "black") +
## theme(panel.background = element_rect(fill = "black"))
## print(grafico_istogramma)
```
Nel dataset colors_data ho due colonne nella prima c'è l' ID del soggetto nella seconda un numero che varia da 1 a 7. Ogni numero corrisponde a 1=Rosso , 2=Verde, 3=Marrone, 4=Nero, 5=Bianco, 6=Blue, 7=Giallo. Ora devo creare un histogramma in cui nelle X c'è il colore preferito mentre nelle Y il numero di persone. Come posso farlo in R
```R
#conteggio_colore <- table(colors_data$COLOUR)
#etichette_colori <- c("Rosso", "Verde", "Marrone", "Nero", "Bianco", "Blue", "Giallo")
```
## Grafici Steam-Leaf ##
Gli stem and leaf plots, o diagrammi a gambo e foglia, sono simili agli istogrammi di frequenza in quanto permettono di visualizzare come sono distribuiti i punteggi. Tuttavia, mantengono anche i valori delle singole osservazioni. Sviluppati da Tukey nel 1977, sono solitamente più facili da disegnare a mano rispetto agli istogrammi. Il diagramma a gambo e foglia per i dati utilizzati per illustrare il calcolo della media, mediana e moda (2, 12, 12, 19, 19, 20, 20, 20, 25) è presentato nella seguente codice.
```R
# Crea un vettore di dati
data <- c(2, 12, 12, 19, 19, 20, 20, 20, 25)
# Utilizza la funzione stem() per generare il grafico stem-and-leaf
stem(data)
```
## Box Plot ##
Il box plot, anche noto come diagramma a scatola e baffi, è una tecnica grafica sviluppata da Tukey nel 1977. Questo strumento è utile quando si desidera identificare punteggi estremi in un set di dati, anche se non sono immediatamente evidenti. Il box plot fornisce una chiara indicazione dei punteggi estremi e, come i diagrammi a stelo e foglia e gli istogrammi, offre informazioni sulla distribuzione dei punteggi.
Nel contesto dell'esempio sulla depressione, il box plot aiuta a visualizzare in modo efficace la presenza di punteggi estremi nel set di dati, offrendo una rappresentazione visiva della distribuzione.
Esempio di codice R per creare un box plot:
```R
# Creazione di un set di dati di esempio
depression_data <- c(10, 15, 18, 22, 28, 35, 50, 60, 75, 90, 110)
# Creazione di un box plot
boxplot(depression_data, main="Box Plot - Esempio Depression Data")
```
## Diagrammi a Dispersione ##
Una tecnica utile per esaminare la relazione tra due variabili è ottenere un diagramma a dispersione. Un esempio di un diagramma a dispersione è mostrato nella Figura per i dati sull'ansia da statistica e la procrastinazione.
Carichiamo il dataset partendo da un database `SQL`
```R
library(RSQLite)
library(dplyr)
# Connect to the SQLite database
con <- dbConnect(SQLite(), dbname = "datasets_vari.db")
# Retrieve data from the SQLite table
survey <- dbReadTable(con, "survey_data")
dbDisconnect(con)
```
Supponiamo che durante il tuo studio sull'ansia da statistica tu abbia riscontrato che, all'aumentare dell'ansia da statistica, la procrastinazione diminuisse. Cosa pensi che assomigli il diagramma a dispersione risultante? Potresti notare che assomiglia a quello presentato nella Figura. Ora puoi vedere dal diagramma a dispersione nella Figura che, all'aumentare della procrastinazione, diminuisce l'ansia statistica. I punteggi sembrano raggrupparsi attorno a una linea immaginaria che va dall'angolo in alto a sinistra all'angolo in basso a destra del diagramma a dispersione. Chiameremmo questo una relazione negativa.
Ora eseguiamo uno *scatterplot* o diagramma a dispersione utilizzando R.
```{r fig-procastination, fig.width = 10, fig.height = 5, fig.fullwidth = TRUE, fig.cap = "Diagramma a dispersione per l'ansia da statistica e la procrastinazione.", warning=FALSE, message=FALSE, cache=TRUE}
library(ggplot2)
ggplot (survey, aes(x = procrastination, y = statistics_anxiety)) +
geom_point() +
labs(title = "Scatterplot of Statistics Anxiety and Procrastination",
x = "Statistics Anxiety",
y = "Procrastination")
```
Ora possiamo vedere come invertendo i i dati degli assi x e y sia più evidente la correlazione.
```{r fig-scatterplot, fig.width = 10, fig.height = 5, fig.fullwidth = TRUE, fig.cap = "Diagramma a dispersione che indica che, all'aumentare dell'ansia da statistica, la procrastinazione aumenta.", warning=FALSE, message=FALSE, cache=TRUE}
library(ggplot2)
ggplot (survey, aes(x = statistics_anxiety, y = procrastination)) +
geom_point() +
labs(title = "Scatterplot of Statistics Anxiety and Procrastination",
x = "Statistics Anxiety",
y = "Procrastination")
```
# Figures
## Margin Figures
Images and graphics play an integral role in Tufte's work. To place figures in the margin you can use the **knitr** chunk option `fig.margin = TRUE`. For example:
```{r fig-margin, fig.margin = TRUE, fig.cap = "MPG vs horsepower, colored by transmission.", fig.width=3.5, fig.height=3.5, cache=TRUE, message=FALSE}
library(ggplot2)
mtcars2 <- mtcars
mtcars2$am <- factor(
mtcars$am, labels = c('automatic', 'manual')
)
ggplot(mtcars2, aes(hp, mpg, color = am)) +
geom_point() + geom_smooth() +
theme(legend.position = 'bottom')
```
Note the use of the `fig.cap` chunk option to provide a figure caption. You can adjust the proportions of figures using the `fig.width` and `fig.height` chunk options. These are specified in inches, and will be automatically scaled down to fit within the handout margin.
## Arbitrary Margin Content
In fact, you can include anything in the margin using the **knitr** engine named `marginfigure`. Unlike R code chunks ```` ```{r} ````, you write a chunk starting with ```` ```{marginfigure} ```` instead, then put the content in the chunk. See an example on the right about the first fundamental theorem of calculus.
```{marginfigure}
We know from _the first fundamental theorem of calculus_ that for $x$ in $[a, b]$:
$$\frac{d}{dx}\left( \int_{a}^{x} f(u)\,du\right)=f(x).$$
```
For the sake of portability between LaTeX and HTML, you should keep the margin content as simple as possible (syntax-wise) in the `marginefigure` blocks. You may use simple Markdown syntax like `**bold**` and `_italic_` text, but please refrain from using footnotes, citations, or block-level elements (e.g. blockquotes and lists) there.
Note: if you set `echo = FALSE` in your global chunk options, you will have to add `echo = TRUE` to the chunk to display a margin figure, for example ```` ```{marginfigure, echo = TRUE} ````.
## Full Width Figures
You can arrange for figures to span across the entire page by using the chunk option `fig.fullwidth = TRUE`.
```{r fig-fullwidth, fig.width = 10, fig.height = 2, fig.fullwidth = TRUE, fig.cap = "A full width figure.", warning=FALSE, message=FALSE, cache=TRUE}
ggplot(diamonds, aes(carat, price)) + geom_smooth() +
facet_grid(~ cut)
```
Other chunk options related to figures can still be used, such as `fig.width`, `fig.cap`, `out.width`, and so on. For full width figures, usually `fig.width` is large and `fig.height` is small. In the above example, the plot size is $10 \times 2$.
## Arbitrary Full Width Content
Any content can span to the full width of the page. This feature requires Pandoc 2.0 or above. All you need is to put your content in a fenced `Div` with the class `fullwidth`, e.g.,
```md
::: {.fullwidth}
Any _full width_ content here.
:::
```
Below is an example:
::: {.fullwidth}
_R is free software and comes with ABSOLUTELY NO WARRANTY._ You are welcome to redistribute it under the terms of the GNU General Public License versions 2 or 3. For more information about these matters see https://www.gnu.org/licenses/.
:::
## Main Column Figures
Besides margin and full width figures, you can of course also include figures constrained to the main column. This is the default type of figures in the LaTeX/HTML output.
```{r fig-main, fig.cap = "A figure in the main column.", cache=TRUE}
ggplot(diamonds, aes(cut, price)) + geom_boxplot()
```
# Sidenotes
One of the most prominent and distinctive features of this style is the extensive use of sidenotes. There is a wide margin to provide ample room for sidenotes and small figures. Any use of a footnote will automatically be converted to a sidenote. ^[This is a sidenote that was entered using a footnote.]
If you'd like to place ancillary information in the margin without the sidenote mark (the superscript number), you can use the `margin_note()` function from **tufte** in an inline R expression. `r margin_note("This is a margin note. Notice that there is no number preceding the note.")` This function does not process the text with Pandoc, so Markdown syntax will not work here. If you need to write anything in Markdown syntax, please use the `marginfigure` block described previously.
# References
References can be displayed as margin notes for HTML output. For example, we can cite R here [@R-base]. To enable this feature, you must set `link-citations: yes` in the YAML metadata, and the version of Pandoc should at least 2.11 or `pandoc-citeproc` should be available and at least 0.7.2. You can always install your own version of Pandoc from https://pandoc.org/installing.html if the version is not sufficient. To check the version of `pandoc-citeproc` in your system, you may run this in R:
```{r eval=FALSE}
system2('pandoc-citeproc', '--version')
```
If your version of `pandoc-citeproc` is too low, or you did not set `link-citations: yes` in YAML, references in the HTML output will be placed at the end of the output document.
# Tables
You can use the `kable()` function from the **knitr** package to format tables that integrate well with the rest of the Tufte handout style. The table captions are placed in the margin like figures in the HTML output.
```{r}
knitr::kable(
mtcars[1:6, 1:6], caption = 'A subset of mtcars.'
)
```
# Block Quotes
We know from the Markdown syntax that paragraphs that start with `>` are converted to block quotes. If you want to add a right-aligned footer for the quote, you may use the function `quote_footer()` from **tufte** in an inline R expression. Here is an example:
> "If it weren't for my lawyer, I'd still be in prison. It went a lot faster with two people digging."
>
> `r tufte::quote_footer('--- Joe Martin')`
Without using `quote_footer()`, it looks like this (the second line is just a normal paragraph):
> "Great people talk about ideas, average people talk about things, and small people talk about wine."
>
> --- Fran Lebowitz
# Responsiveness
The HTML page is responsive in the sense that when the page width is smaller than 760px, sidenotes and margin notes will be hidden by default. For sidenotes, you can click their numbers (the superscripts) to toggle their visibility. For margin notes, you may click the circled plus signs to toggle visibility.
# More Examples
The rest of this document consists of a few test cases to make sure everything still works well in slightly more complicated scenarios. First we generate two plots in one figure environment with the chunk option `fig.show = 'hold'`:
```{r fig-two-together, fig.cap="Two plots in one figure environment.", fig.show='hold', cache=TRUE, message=FALSE}
p <- ggplot(mtcars2, aes(hp, mpg, color = am)) +
geom_point()
p
p + geom_smooth()
```
Then two plots in separate figure environments (the code is identical to the previous code chunk, but the chunk option is the default `fig.show = 'asis'` now):
```{r fig-two-separate, ref.label='fig-two-together', fig.cap=sprintf("Two plots in separate figure environments (the %s plot).", c("first", "second")), cache=TRUE, message=FALSE}
```
You may have noticed that the two figures have different captions, and that is because we used a character vector of length 2 for the chunk option `fig.cap` (something like `fig.cap = c('first plot', 'second plot')`).
Next we show multiple plots in margin figures. Similarly, two plots in the same figure environment in the margin:
```{r fig-margin-together, fig.margin=TRUE, fig.show='hold', fig.cap="Two plots in one figure environment in the margin.", fig.width=3.5, fig.height=2.5, cache=TRUE}
p
p + geom_smooth(method = 'lm')
```
Then two plots from the same code chunk placed in different figure environments:
```{r fig-margin-separate, fig.margin=TRUE, fig.cap=sprintf("Two plots in separate figure environments in the margin (the %s plot).", c("first", "second")), fig.width=3.5, fig.height=2.5, cache=TRUE}
knitr::kable(head(iris, 15))
p
knitr::kable(head(iris, 12))
p + geom_smooth(method = 'lm')
knitr::kable(head(iris, 5))
```
We blended some tables in the above code chunk only as _placeholders_ to make sure there is enough vertical space among the margin figures, otherwise they will be stacked tightly together. For a practical document, you should not insert too many margin figures consecutively and make the margin crowded.
You do not have to assign captions to figures. We show three figures with no captions below in the margin, in the main column, and in full width, respectively.
```{r fig-nocap-margin, fig.margin=TRUE, fig.width=3.5, fig.height=2, cache=TRUE}
# a boxplot of weight vs transmission; this figure
# will be placed in the margin
ggplot(mtcars2, aes(am, wt)) + geom_boxplot() +
coord_flip()
```
```{r fig-nocap-main, cache=TRUE}
# a figure in the main column
p <- ggplot(mtcars, aes(wt, hp)) + geom_point()
p
```
```{r fig-nocap-fullwidth, fig.fullwidth=TRUE, fig.width=10, fig.height=3, cache=TRUE}
# a fullwidth figure
p + geom_smooth(method = 'lm') + facet_grid(~ gear)
```
# Some Notes on Tufte CSS
There are a few other things in Tufte CSS that we have not mentioned so far. If you prefer `r sans_serif('sans-serif fonts')`, use the function `sans_serif()` in **tufte**. For epigraphs, you may use a pair of underscores to make the paragraph italic in a block quote, e.g.
> _I can win an argument on any topic, against any opponent. People know this, and steer clear of me at parties. Often, as a sign of their great respect, they don't even invite me._
>
> `r quote_footer('--- Dave Barry')`
We hope you will enjoy the simplicity of R Markdown and this R package, and we sincerely thank the authors of the Tufte-CSS and Tufte-LaTeX projects for developing the beautiful CSS and LaTeX classes. Our **tufte** package would not have been possible without their heavy lifting.
You can turn on/off some features of the Tufte style in HTML output. The default features enabled are:
```yaml
output:
tufte::tufte_html:
tufte_features: ["fonts", "background", "italics"]
```
If you do not want the page background to be lightyellow, you can remove `background` from `tufte_features`. You can also customize the style of the HTML page via a CSS file. For example, if you do not want the subtitle to be italic, you can define
```css
h3.subtitle em {
font-style: normal;
}
```
in, say, a CSS file `my_style.css` (under the same directory of your Rmd document), and apply it to your HTML output via the `css` option, e.g.,
```yaml
output:
tufte::tufte_html:
tufte_features: ["fonts", "background"]
css: "my_style.css"
```
There is also a variant of the Tufte style in HTML/CSS named "[Envisoned CSS](https://github.com/nogginfuel/envisioned-css)". This style can be used by specifying the argument `tufte_variant = 'envisioned'` in `tufte_html()`^[The actual Envisioned CSS was not used in the **tufte** package. We only changed the fonts, background color, and text color based on the default Tufte style.], e.g.
```yaml
output:
tufte::tufte_html:
tufte_variant: "envisioned"
```
To see the R Markdown source of this example document, you may follow [this link to Github](https://github.com/rstudio/tufte/raw/main/inst/rmarkdown/templates/tufte_html/skeleton/skeleton.Rmd), use the wizard in RStudio IDE (`File -> New File -> R Markdown -> From Template`), or open the Rmd file in the package:
```{r eval=FALSE}
file.edit(
tufte:::template_resources(
'tufte_html', '..', 'skeleton', 'skeleton.Rmd'
)
)
```
This document is also available in [Chinese](https://rstudio.github.io/tufte/cn/), and its `envisioned` style can be found [here](https://rstudio.github.io/tufte/envisioned/).
```{r bib, include=FALSE}
# create a bib file for the R packages used in this document
knitr::write_bib(c('base', 'rmarkdown'), file = 'skeleton.bib')
```