-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtongue-imaging.Rmd
193 lines (143 loc) · 6.88 KB
/
tongue-imaging.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
---
title: "Import and plot UTI and EMA data"
author: "Stefano Coretta"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Import and plot UTI and EMA data}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, echo=FALSE, include=FALSE}
knitr::opts_chunk$set(out.width = "300px", fig.align = "center", dpi = 300)
library(readr)
library(dplyr)
library(stringr)
library(ggplot2)
theme_set(theme_bw())
library(rticulate)
```
The package `rticulate` facilitates import in R of the following data:
- Deep Lab Cut (DLC) spline data from Articulate Assistant Advanced™. [Paper](https://www.mdpi.com/1424-8220/22/3/1133)
- `.pos` files from the Carstens AG500 electro-magnetic-articulographer.
- (Legacy) fan-line spline data from [Articulate Assistant Advanced™](https://www.articulateinstruments.com/aaa/).
To use the package, attach it as usual.
```{r attach, eval=FALSE}
library(rticulate)
```
The following sections illustrate how to import the three types of data.
# Import DLC spline data from AAA
The `read_aaa()` function can read DLC spline data exported from AAA. It assumes that the X/Y coordinates are in the rightmost columns of the exported data (i.e., when exporting they should be selected last). We recommend to include a header when exporting DLC data from AAA for a smooth experience.
The example file we will read can be inspected [here](https://github.com/stefanocoretta/rticulate/blob/main/inst/extdata/it01-dlc.tsv). This file contains a header (see the section on importing fan-line spline data below on how to import legacy fan-line data files without a header).
With `format = "wide"`, the file is read as is and a `frame_id` index column is added to index each tongue contour frame (normally, each row in the exported data is one ultrasound frame).
```{r dlc}
# system.file() is needed here because the example files reside in the package.
# You can just include the file path directly in read_aaa, like
# read_aaa("~/Desktop/splines.tsv", columns)
file_path <- system.file("extdata", "it01-dlc.tsv", package = "rticulate")
dlc <- read_aaa(file_path, format = "wide")
dlc
```
For plotting and analysis, it is useful to have the data in a long format. By default, `read_aaa()` pivots the data from wide to long. The resulting tibble has X and Y coordinates for each knot of each spline in each row. DLC knots are numbered from 0, as they are in the exported data. A further column, `displ_id`, indexes a knot displacement trajectory in time if multiple time points are exported.
```{r dlc-2}
dlc <- read_aaa(file_path)
dlc
```
You can then proceed to plot the data as you would with any other data.
```{r dlc-plot}
dlc |>
ggplot(aes(X, Y)) +
geom_point(alpha = 0.1, size = 0.5) +
coord_fixed()
```
To plot tongue contours, use the `frame_id` column to group points from the same contour (we need to filter the data to include only `DLC_Tongue` data).
```{r dlc-plot-2}
dlc |>
filter(spline == "DLC_Tongue") |>
ggplot(aes(X, Y, group = frame_id)) +
geom_path(alpha = 0.1, linewidth = 0.1) +
coord_fixed()
```
You can also plot the X or Y displacement of the knots along time.
```{r dlc-displ, fig.asp=2}
dlc |>
filter(
`Date Time of recording` == "29/11/2016 15:10:52",
spline == "DLC_Tongue"
) |>
ggplot(aes(`Time of sample in annot`, Y, group = displ_id)) +
geom_path() +
facet_grid(rows = vars(knot), scales = "free_y")
```
Check out `vignette("kinematics", package = "rticulate")` and `vignette("filter-signals", package = "rticulate")`.
# Import `.pos` files from the Carstens AG500 EMA
You can import binary `.pos` files from the Carstens AG500 electro-magnetic articulographer using the `read_ag500_pos()` function. In most contexts, the defaults of the function will suffice. Due to CRAN not accepting binary files, the following code is not run, but you can test it by downloading the `.pos` file provided here: <https://github.com/stefanocoretta/rticulate/blob/vignettes/data-raw/ema/0025.pos>.
```{r ema, eval=FALSE}
ema <- read_ag500_pos("0025.pos")
```
You can plot the antero-posterior and vertical displacement of a sensor (here the tongue tip sensor, channel 5).
```{r ema-plot, eval=FALSE}
ema |>
filter(chn == 5) |>
ggplot(aes(x, z)) +
geom_point(size = 0.1)
```
Or, for example, just the vertical displacement along time.
```{r ema-plot-2, eval=FALSE}
ema |>
filter(chn == 5) |>
ggplot(aes(time, z)) +
geom_point(size = 0.1)
```
# (LEGACY) Import fan-line spline data from AAA
The function `read_aaa()` can import legacy fan-line spline data from AAA and transform it into a longer format (where each observation is a point on a fan line and the coordinates values are two variables, `X` and `Y`, see `?tongue` for more details).
The following code will show how to import a file without the header that has legacy fan-line spline data. You can inspect the file we will read [here](https://github.com/stefanocoretta/rticulate/blob/main/inst/extdata/it01.tsv). The X/Y coordinates are stored in the rightmost columns.
When the file does not contain a header like in this case, you must create a vector with the column names for all columns except the X/Y coordinates columns.
```{r columns}
columns <- c(
"speaker",
"seconds",
"rec_date",
"prompt",
"label",
"TT_displacement",
"TT_velocity",
"TT_abs_velocity",
"TD_displacement",
"TD_velocity",
"TD_abs_velocity"
)
```
Now we can use `read_aaa()` to import the spline data as a tibble. The function requires a string with the file path and name, and a vector with the names of the columns. It is necessary to specify the number of fan lines with the `fan_lines` argument.
```{r read-aaa}
# system.file() is needed here because the example files reside in the package.
# You can just include the file path directly in read_aaa, like
# read_aaa("~/Desktop/splines.tsv", columns)
file_path <- system.file("extdata", "it01.tsv", package = "rticulate")
tongue <- read_aaa(file_path, fan_lines = 42, column_names = columns)
```
To check the head of the tibble, just do:
```{r tibble}
tongue
```
Sometimes is useful to add extra information for each prompt (like vowel, consonant place, phonation, etc.). We can do so by using functions from the `dplyr` package (`word()` is from the `stringr` package).
```{r join}
stimuli <- read_csv(system.file("extdata", "stimuli.csv", package = "rticulate"))
tongue <- mutate(tongue, word = word(prompt, 2)) %>%
left_join(y = stimuli) %>%
mutate_if(is.character, as.factor)
```
Let's check `tongue` again.
```{r tibble-2}
tongue
```
# Import multiple files
To import multiple files with AAA data, simply use a list of paths with `read_aaa`, for example using `list.files`.
```{r read-multiple}
tongue2 <- list.files(
path = system.file("extdata", package = "rticulate"),
pattern = "*\\d{2}.tsv",
full.names = TRUE
) %>%
read_aaa(., fan_lines = 42, column_names = columns)
```