Converting rice microarray probe IDs with OryzaProbe

OryzaProbe converts expression-matrix row names from three rice microarray platforms: GPL6864, GPL2025, and GPL8852. Version 0.2.0 preserves the input row order and records how each probe was resolved.

library(OryzaProbe)
supported_platforms()
#> [1] "GPL6864" "GPL2025" "GPL8852"

Convert and merge probes

The two GPL6864 probes below map to the same RAP-DB gene. Supplying the platform explicitly is recommended for reproducible analysis.

expression <- matrix(
  c(2, 4, 6, 8),
  nrow = 2,
  dimnames = list(c("36144", "37310"), c("sample_1", "sample_2"))
)

converted <- probe_convert(
  expression,
  platform = "GPL6864",
  merge_by = "mean"
)
#> GPL6864: 2 input row(s) -> 1 output row(s); 2 RAP, 0 multi-mapped, 0 unmapped, 0 non-RAP, 0 dropped.
converted
#>              sample_1 sample_2
#> Os01g0100700        3        7

The result is a numeric matrix. The report links every input probe to its annotation, resolution policy, and output row.

probe_conversion_report(converted)
#>   input_index probe_id    target_id resolved_target_id     status   resolution
#> 1           1    36144 Os01g0100700       Os01g0100700 mapped_rap as_annotated
#> 2           2    37310 Os01g0100700       Os01g0100700 mapped_rap as_annotated
#>   kept    output_id
#> 1 TRUE Os01g0100700
#> 2 TRUE Os01g0100700
probe_conversion_summary(converted)
#> $platform
#> [1] "GPL6864"
#> 
#> $input_rows
#> [1] 2
#> 
#> $output_rows
#> [1] 1
#> 
#> $mapped_rap
#> [1] 2
#> 
#> $multi_mapped
#> [1] 0
#> 
#> $unmapped
#> [1] 0
#> 
#> $non_rap
#> [1] 0
#> 
#> $dropped_input_rows
#> [1] 0
#> 
#> $merge_by
#> [1] "mean"

Automatic platform detection

Automatic detection scores every input row. It therefore works for valid subsets that do not contain one particular sentinel probe.

subset_expression <- matrix(
  c(13, 14),
  ncol = 1,
  dimnames = list(c("13", "14"), "sample")
)
probe_convert(subset_expression)
#> GPL6864: 2 input row(s) -> 2 output row(s); 2 RAP, 0 multi-mapped, 0 unmapped, 0 non-RAP, 0 dropped.
#>              sample
#> Os01g0721700     13
#> Os06g0215600     14

Detection raises an error if fewer than half of the probe IDs match a supported platform or if the result is ambiguous.

Unmapped, non-RAP, and multi-target annotations

Platform annotations contain controls, miRNA identifiers, probes without a RAP target, and a few one-to-many mappings. These are not silently discarded.

The unmapped and non_rap arguments accept "keep", "drop", or "error". The multi_mapping argument accepts "keep", "first", "expand", "drop", or "error".

multi <- matrix(
  10,
  dimnames = list("Os.19863.1.S1_a_at", "sample")
)
probe_convert(
  multi,
  platform = "GPL2025",
  multi_mapping = "expand"
)
#> GPL2025: 1 input row(s) -> 2 output row(s); 0 RAP, 1 multi-mapped, 0 unmapped, 0 non-RAP, 0 dropped.
#>              sample
#> Os02g0558100     10
#> Os04g0442700     10

Annotation provenance

The GPL6864 and GPL2025 mappings are the tables published with OryzaProbe 0.1.0. They remain identifiable as a legacy snapshot rather than being presented as a current RAP-DB release.

probe_annotation_metadata()
#>   platform                                                 source_url
#> 1  GPL6864 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL6864
#> 2  GPL2025 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL2025
#> 3  GPL8852 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL8852
#>             annotation_snapshot  snapshot_date
#> 1 OryzaProbe 0.1.0 legacy table     2022-10-15
#> 2 OryzaProbe 0.1.0 legacy table     2022-10-15
#> 3      Composite probe row name not applicable
#>                         mapping_method  rows
#> 1                Exact probe-ID lookup 45151
#> 2                Exact probe-ID lookup 57381
#> 3 Text before the first pipe character     0
head(probe_annotation("GPL6864"))
#>   probe_id target_id   status
#> 1        1         1 unmapped
#> 2        2         2 unmapped
#> 3        3         3 unmapped
#> 4        4         4 unmapped
#> 5        5         5 unmapped
#> 6        6         6 unmapped

The original probeConvert() function remains available for existing scripts, but new work should use probe_convert() so mapping policies are visible.