Phase 4 Analysis Layer: Similarity to Model-Ready Export

This vignette demonstrates the first true analysis-layer workflow in PubChemR:

  1. Similarity retrieval around a seed compound.
  2. Assay activity extraction in long format.
  3. Activity matrix construction.
  4. Feature retrieval and model-matrix assembly.
  5. Model-ready export.
library(PubChemR)
library(dplyr)
library(tibble)

1) Similar compounds from a seed structure

# Aspirin SMILES as seed
seed_smiles <- "CC(=O)OC1=CC=CC=C1C(=O)O"

sim <- pc_similarity_search(
  identifier = seed_smiles,
  namespace = "smiles",
  threshold = 90,
  max_records = 200,
  cache = TRUE
)

sim_tbl <- as_tibble(sim) %>%
  filter(!is.na(CID)) %>%
  mutate(CID = as.character(CID)) %>%
  distinct(CID)

sim_tbl
#> # A tibble: 200 × 1
#>    CID  
#>    <chr>
#>  1 2244 
#>  2 4133 
#>  3 5161 
#>  4 8361 
#>  5 8365 
#>  6 9458 
#>  7 16330
#>  8 61151
#>  9 11370
#> 10 15109
#> # ℹ 190 more rows

2) Fetch assay activity in long format

assay_long <- pc_assay_activity_long(
  identifier = sim_tbl$CID,
  namespace = "cid",
  chunk_size = 25,
  cache = TRUE
)

assay_long %>%
  select(CID, AID, ActivityOutcome, ActivityValue_uM) %>%
  head()
#> # A tibble: 6 × 4
#>   CID   AID   ActivityOutcome ActivityValue_uM
#>   <chr> <chr> <chr>                      <dbl>
#> 1 2244  1     Inactive                      NA
#> 2 2244  3     Inactive                      NA
#> 3 2244  9     Inactive                      NA
#> 4 2244  15    Inactive                      NA
#> 5 2244  19    Inactive                      NA
#> 6 2244  21    Inactive                      NA

3) Build activity matrix (compound x assay)

activity_mat <- pc_activity_matrix(
  assay_long,
  cid_col = "CID",
  aid_col = "AID",
  outcome_col = "ActivityOutcome",
  aggregate = "max",
  fill = NA_real_
)

activity_mat
#> # A tibble: 117 × 4,043
#>    CID   AID_1 AID_3 AID_9 AID_15 AID_19 AID_21 AID_23 AID_25 AID_29 AID_31
#>    <chr> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
#>  1 2244      0     0     0      0      0      0      0      0      0      0
#>  2 4133     NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#>  3 5161     NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#>  4 8361     NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#>  5 8365     NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#>  6 9458     NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#>  7 16330    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#>  8 61151    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#>  9 11370    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#> 10 15109    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
#> # ℹ 107 more rows
#> # ℹ 4,032 more variables: AID_33 <dbl>, AID_35 <dbl>, AID_37 <dbl>,
#> #   AID_39 <dbl>, AID_41 <dbl>, AID_43 <dbl>, AID_45 <dbl>, AID_47 <dbl>,
#> #   AID_49 <dbl>, AID_53 <dbl>, AID_55 <dbl>, AID_59 <dbl>, AID_65 <dbl>,
#> #   AID_67 <dbl>, AID_71 <dbl>, AID_73 <dbl>, AID_79 <dbl>, AID_81 <dbl>,
#> #   AID_83 <dbl>, AID_85 <dbl>, AID_87 <dbl>, AID_89 <dbl>, AID_91 <dbl>,
#> #   AID_93 <dbl>, AID_99 <dbl>, AID_103 <dbl>, AID_105 <dbl>, AID_107 <dbl>, …

4) Add chemical features and prepare model matrix

feature_tbl <- pc_feature_table(
  identifier = sim_tbl$CID,
  properties = c(
    "MolecularWeight",
    "XLogP",
    "TPSA",
    "HBondDonorCount",
    "HBondAcceptorCount"
  ),
  namespace = "cid",
  cache = TRUE
) %>%
  mutate(CID = as.character(CID))

model_tbl <- feature_tbl %>%
  left_join(activity_mat, by = "CID")

mm <- pc_model_matrix(
  x = model_tbl,
  id_cols = "CID",
  na_fill = 0,
  scale = TRUE
)

mm
#> 
#>  PubChemModelMatrix 
#> 
#>   - Rows: 200
#>   - Features: 4047
#>   - Outcome: None

5) Export model-ready artifact

out_csv <- file.path(tempdir(), "phase4_similarity_activity_model.csv")
out_rds <- file.path(tempdir(), "phase4_similarity_activity_model.rds")

pc_export_model_data(mm, path = out_csv, format = "csv")
pc_export_model_data(mm, path = out_rds, format = "rds")

out_csv
#> [1] "/tmp/RtmprF1Cix/phase4_similarity_activity_model.csv"
out_rds
#> [1] "/tmp/RtmprF1Cix/phase4_similarity_activity_model.rds"

This workflow is intended for reproducible discovery pipelines where structure-driven retrieval, bioactivity reshaping, and model preparation are performed within one package.