Export ToxPi GUI Files

This vignette will show how to save a toxpiR model that will be compatible with the ToxPi Java GUI, which can be downloaded from here. The toxpiR package and ToxPi Java GUI are not directly compatible and there are several key differences to keep in mind.

Key differences between Java GUI and toxpiR

Slice weights

The Java GUI only allows weights that are either integers or a ratio of integers whereas the toxpiR package has no restrictions. The txpExportGui() function requires all weights to be integers, so the user may need to change the model weights to acceptable approximations prior to calling the export function.

Transformation/scaling functions

Currently the Java GUI only allows specific scaling functions and applies them independently to every input within a slice. The toxpiR package allows user-defined transformation functions at the input-level and slice-level. To account for these differences, all input-level transformation functions are applied before the data is exported. If slice-level transformations are applied, then the export function will create a data file that has the final slice scores rather than input-level data.

The Java GUI does not allow negative input values and will treat them a missing data. This causes a problem if negative values exist after applying any user-defined transformations. If negative values occur within a slice, then all values of that slice will be shifted up by a constant so that no negative values remain. If a slice has both negative transformed values and missing values, then missing values are replaced with the added constant. In this last case, the toxpi and slice scores will be computed correctly, however, the Java GUI should not be used to compute bootstrapped confidence intervals because replacing missing data during the export process will cause the resampling step to be incorrect.

Metrics in multiple slices

The Java GUI does not allow multiple columns to have the same name, unless the data in those columns matches exactly. If a toxpiR model includes an input column in multiple slices, then the name will be appended with the slice index for each occurrence.

Example use

First create a toxpiR model with accompanying data. Here we’ll load the “Format C” data example using the txpImportGui() function.

library(toxpiR)

# Load example model from "Import ToxPi GUI Files" vignette
data_format_C <- tempfile()
download.file(
  url = "https://raw.githubusercontent.com/ToxPi/ToxPi-example-files/main/format_C.csv",
  destfile = data_format_C,
  quiet = TRUE
)
gui1 <- txpImportGui(data_format_C)
#> Warning in method(object): The following 'input' columns are duplicated in the model:
#>     metric3, metric2, metric3, metric1, metric2

Now we can use to export function to create a new data file. Notice the warnings for negative and missing values.

# Export back into GUI format
data_exported <- tempfile()
txpExportGui(
  fileName = data_exported,
  input = gui1$input,
  model = gui1$model,
  id.var = 'Name',
  fills = gui1$fills
)
#> Warning in txpExportGui(fileName = data_exported, input = gui1$input, model =
#> gui1$model, : Slice "Slice2" contains negative values after applying
#> transformations so all values were increased by x = 5.
#> Warning in txpExportGui(fileName = data_exported, input = gui1$input, model =
#> gui1$model, : Slice "Slice3" contains both missing and negative values after
#> applying transformations so missing values were replaced with 0 and then all
#> values were increased by x = 5.

Compare the data files

Take a moment to observe differences between the original data file (data_format_C) and the exported version (data_exported).

data_format_C

V1 V2 V3 V4 V5 V6 V7 V8
# Slice1!4!0xFF69B4!-log10(x)+6 x x
# Slice2!4!0x6959CD!-ln(x) x
# Slice3!4!0xCDC1C5!-ln(x) x x x
# Slice4!5!0xFF6347!-log10(x)+6 x x x
Row Source CASRN Name metric1 metric2 metric3 metric4
1 source01 11-111-1111 chem01 25 91 NA NA
2 source02 22-222-2222 chem02 NA 46 51 48
3 source03 33-333-3333 chem03 44 NA 9 34
4 source04 44-444-4444 chem04 26 64 27 9
5 source05 55-555-5555 chem05 33 36 69 88
6 source06 66-666-6666 chem06 94 46 NA 54
7 source07 77-777-7777 chem07 37 31 NA 7
8 source08 88-888-8888 chem08 58 29 9 46
9 source09 99-999-9999 chem09 95 24 78 46
10 source10 11-222-3333 chem10 68 54 43 25

data_exported

V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# Slice1!4!0xFF69B4!linear(x) x x
# Slice2!4!0x6959CD!linear(x) x
# Slice3!4!0xCDC1C5!linear(x) x x x
# Slice4!5!0xFF6347!linear(x) x x x
metric2_slice1 metric3_slice1 metric3_slice2 metric1_slice3 metric2_slice3 metric3_slice3 metric1_slice4 metric2_slice4 metric4
chem01 4.0410 NA NA 1.7811 0.4891 5.0000 4.6021 4.0410 NA
chem02 4.3372 4.2924 1.0682 5.0000 1.1714 1.0682 NA 4.3372 4.3188
chem03 NA 5.0458 2.8028 1.2158 5.0000 2.8028 4.3565 NA 4.4685
chem04 4.1938 4.5686 1.7042 1.7419 0.8411 1.7042 4.5850 4.1938 5.0458
chem05 4.4437 4.1612 0.7659 1.5035 1.4165 0.7659 4.4815 4.4437 4.0555
chem06 4.3372 NA NA 0.4567 1.1714 5.0000 4.0269 4.3372 4.2676
chem07 4.5086 NA NA 1.3891 1.5660 5.0000 4.4318 4.5086 5.1549
chem08 4.5376 5.0458 2.8028 0.9396 1.6327 2.8028 4.2366 4.5376 4.3372
chem09 4.6198 4.1079 0.6433 0.4461 1.8219 0.6433 4.0223 4.6198 4.3372
chem10 4.2676 4.3665 1.2388 0.7805 1.0110 1.2388 4.1675 4.2676 4.6021

Compare results

Although the data files are visually different, they will result in the same toxpi and slice scores.

gui2 <- txpImportGui(data_exported)

res1 <- txpCalculateScores(gui1$model, gui1$input)
res2 <- txpCalculateScores(gui2$model, gui2$input)

all.equal(
  txpScores(res1),
  txpScores(res2)
)
#> [1] TRUE

all.equal(
  txpSliceScores(res1),
  txpSliceScores(res2)
)
#> [1] TRUE