ADNI4 visits?

94 views
Skip to first unread message

Ramiro Magno

unread,
Apr 22, 2025, 2:27:29 PMApr 22
to Alzheimer's Disease Neuroimaging Initiative (ADNI) Data
Is the VISITS data set supposed to include ADNI4 visits?

This is data from 12 Mar 2025.

> visits() |> print(n = Inf)
# A tibble: 59 × 5
   PHASE     ID VISCODE VISNAME                                VISORDER
   <chr>  <int> <chr>   <chr>                                     <int>
 1 ADNI1      1 sc      Screening                                     1
 2 ADNI1      2 bl      Baseline                                      2
 3 ADNI1      3 m06     Month 6                                       3
 4 ADNI1      4 m12     Month 12                                      4
 5 ADNI1      5 m18     Month 18                                      5
 6 ADNI1      6 m24     Month 24                                      6
 7 ADNI1      7 m30     Month 30                                      7
 8 ADNI1      8 m36     Month 36                                      8
 9 ADNI1      9 m42     Month 42                                      9
10 ADNI1     10 m48     Month 48                                     10
11 ADNI1     11 m54     Month 54                                     11
12 ADNI1     12 uns1    Unscheduled                                  NA
13 ADNI1     13 f       Screen Fail                                  NA
14 ADNI1     14 nv      No Visit Defined                             NA
15 ADNIGO     1 sc      Screening                                     1
16 ADNIGO     2 scmri   Screening MRI                                 2
17 ADNIGO     3 bl      Baseline                                      3
18 ADNIGO     4 m03     Month 3 MRI                                   4
19 ADNIGO     5 m06     Month 6                                       5
20 ADNIGO     6 m12     Month 12                                      6
21 ADNIGO     7 m18     Month 18                                      7
22 ADNIGO     8 m36     Month 36                                      8
23 ADNIGO     9 m42     Month 42                                      9
24 ADNIGO    10 m48     Month 48                                     10
25 ADNIGO    11 m54     Month 54                                     11
26 ADNIGO    12 m60     Month 60                                     12
27 ADNIGO    13 m66     Month 66                                     13
28 ADNIGO    14 m72     Month 72                                     14
29 ADNIGO    15 m78     Month 78                                     15
30 ADNIGO    16 nv      No Visit Defined                             NA
31 ADNI2      1 v01     Screening - New Pt                            1
32 ADNI2      2 v02     Screening MRI - New Pt                        2
33 ADNI2      3 v03     Baseline - New Pt                             3
34 ADNI2      4 v04     Month 3 MRI - New Pt                          4
35 ADNI2      5 v05     Month 6 - New Pt                              5
36 ADNI2      6 v06     ADNI2 Initial Visit - Continuing Pt           6
37 ADNI2      7 v07     ADNI2 Initial TelCheck - Continuing Pt        7
38 ADNI2      8 v11     ADNI2 Year 1 Visit                            8
39 ADNI2      9 v12     ADNI2 Year 1 TelCheck                         9
40 ADNI2     10 v21     ADNI2 Year 2 Visit                           10
41 ADNI2     11 v22     ADNI2 Year 2 TelCheck                        11
42 ADNI2     12 v31     ADNI2 Year 3 Visit                           12
43 ADNI2     13 v32     ADNI2 Year 3 TelCheck                        13
44 ADNI2     14 v41     ADNI2 Year 4 Visit                           14
45 ADNI2     15 v42     ADNI2 Year 4 TelCheck                        15
46 ADNI2     16 v51     ADNI2 Year 5 Visit                           16
47 ADNI2     17 v52     ADNI2 Year 5 TelCheck                        17
48 ADNI2     18 nv      No Visit Defined                             NA
49 ADNI2     19 tau     ADNI2 Tau-only visit                         NA
50 ADNI3      1 reg     Participant Registration                      1
51 ADNI3      2 sc      Screening - New Pt                            2
52 ADNI3      3 bl      Baseline - New Pt                             3
53 ADNI3      4 init    ADNI3 Initial Visit - Continuing Pt           4
54 ADNI3      5 y1      ADNI3 Year 1 Visit                            5
55 ADNI3      6 y2      ADNI3 Year 2 Visit                            6
56 ADNI3      7 y3      ADNI3 Year 3 Visit                            7
57 ADNI3      8 y4      ADNI3 Year 4 Visit                            8
58 ADNI3      9 y5      ADNI3 Year 5 Visit                            9
59 ADNI3     10 y6      ADNI3 Year 6 Visit                           10

Ramiro Magno

unread,
Apr 22, 2025, 2:33:43 PMApr 22
to Alzheimer's Disease Neuroimaging Initiative (ADNI) Data
From the REGISTRY I get these many more PHASE-VISCODE2 combinations:


library(adni.clinical)
registry() |>
  dplyr::count(PHASE, VISCODE2)  |>
  dplyr::mutate(PHASE = factor(PHASE, levels = enum_adni_phases())) |>
  dplyr::arrange(PHASE) |>
  print(n = Inf)
#> # A tibble: 123 × 3
#>     PHASE  VISCODE2     n
#>     <fct>  <chr>    <int>
#>   1 ADNI1  bl         822
#>   2 ADNI1  f          564
#>   3 ADNI1  m06        819
#>   4 ADNI1  m12        818
#>   5 ADNI1  m18        813
#>   6 ADNI1  m24        797
#>   7 ADNI1  m30        661
#>   8 ADNI1  m36        619
#>   9 ADNI1  m42        414
#>  10 ADNI1  m48        248
#>  11 ADNI1  m54        137
#>  12 ADNI1  sc         822
#>  13 ADNI1  uns1         1
#>  14 ADNIGO bl         136
#>  15 ADNIGO m03        125
#>  16 ADNIGO m06        121
#>  17 ADNIGO m12         31
#>  18 ADNIGO m18         15
#>  19 ADNIGO m36          9
#>  20 ADNIGO m42          9
#>  21 ADNIGO m48        147
#>  22 ADNIGO m54        137
#>  23 ADNIGO m60         92
#>  24 ADNIGO m66         67
#>  25 ADNIGO m72          6
#>  26 ADNIGO m78          5
#>  27 ADNIGO sc         616
#>  28 ADNIGO scmri      153
#>  29 ADNI2  bl         804
#>  30 ADNI2  m03        769
#>  31 ADNI2  m06        765
#>  32 ADNI2  m102       192
#>  33 ADNI2  m108       184
#>  34 ADNI2  m114       114
#>  35 ADNI2  m12        863
#>  36 ADNI2  m120        99
#>  37 ADNI2  m126        28
#>  38 ADNI2  m132         6
#>  39 ADNI2  m138         2
#>  40 ADNI2  m18        824
#>  41 ADNI2  m24        796
#>  42 ADNI2  m30        656
#>  43 ADNI2  m36        623
#>  44 ADNI2  m42        531
#>  45 ADNI2  m48        503
#>  46 ADNI2  m54        230
#>  47 ADNI2  m60        349
#>  48 ADNI2  m66        229
#>  49 ADNI2  m72        282
#>  50 ADNI2  m78        258
#>  51 ADNI2  m84        242
#>  52 ADNI2  m90        222
#>  53 ADNI2  m96        218
#>  54 ADNI2  sc        1289
#>  55 ADNI2  scmri      890
#>  56 ADNI2  <NA>        41
#>  57 ADNI3  bl         695
#>  58 ADNI3  m102        95
#>  59 ADNI3  m108        98
#>  60 ADNI3  m114        68
#>  61 ADNI3  m12        490
#>  62 ADNI3  m120        81
#>  63 ADNI3  m126        60
#>  64 ADNI3  m132        88
#>  65 ADNI3  m138        39
#>  66 ADNI3  m144        54
#>  67 ADNI3  m150        25
#>  68 ADNI3  m156        33
#>  69 ADNI3  m162        23
#>  70 ADNI3  m168        29
#>  71 ADNI3  m174        13
#>  72 ADNI3  m18         29
#>  73 ADNI3  m180        27
#>  74 ADNI3  m186        15
#>  75 ADNI3  m192        13
#>  76 ADNI3  m198         8
#>  77 ADNI3  m204         3
#>  78 ADNI3  m24        278
#>  79 ADNI3  m30         66
#>  80 ADNI3  m36        224
#>  81 ADNI3  m42         51
#>  82 ADNI3  m48        185
#>  83 ADNI3  m54         65
#>  84 ADNI3  m60        114
#>  85 ADNI3  m66        113
#>  86 ADNI3  m72        131
#>  87 ADNI3  m78        128
#>  88 ADNI3  m84        128
#>  89 ADNI3  m90        120
#>  90 ADNI3  m96        112
#>  91 ADNI3  sc        1102
#>  92 ADNI3  <NA>       369
#>  93 ADNI4  bl         281
#>  94 ADNI4  m12         30
#>  95 ADNI4  m126         2
#>  96 ADNI4  m132        16
#>  97 ADNI4  m138        18
#>  98 ADNI4  m144        21
#>  99 ADNI4  m150        22
#> 100 ADNI4  m156        28
#> 101 ADNI4  m162         8
#> 102 ADNI4  m168         4
#> 103 ADNI4  m18          5
#> 104 ADNI4  m204         3
#> 105 ADNI4  m210         4
#> 106 ADNI4  m216         7
#> 107 ADNI4  m222         6
#> 108 ADNI4  m228         2
#> 109 ADNI4  m24         23
#> 110 ADNI4  m30         21
#> 111 ADNI4  m36         40
#> 112 ADNI4  m42         15
#> 113 ADNI4  m48          9
#> 114 ADNI4  m54         16
#> 115 ADNI4  m60         33
#> 116 ADNI4  m66         38
#> 117 ADNI4  m72         88
#> 118 ADNI4  m78         55
#> 119 ADNI4  m84         24
#> 120 ADNI4  m90          4
#> 121 ADNI4  m96          1
#> 122 ADNI4  sc         562
#> 123 ADNI4  <NA>         7


Danielle J Harvey

unread,
Apr 22, 2025, 2:38:55 PMApr 22
to adni...@googlegroups.com

Hi Ramiro,

 

VISCODE2 is not the same as VISCODE (though the ADNIMERGE file uses VISCODE in place of VISCODE2). The VISITS table gave a list of visits one might expect for the different phases of ADNI along with the tracking visit code (VISCODE)…that tracking VISCODE wasn’t always meaningful, so VISCODE2 was created to be a bit more interpretable by the user. I don’t know if the Clinical Core will add the expected visits to the VISITS table…

 

Danielle

--
You received this message because you are subscribed to the Google Groups "Alzheimer's Disease Neuroimaging Initiative (ADNI) Data" group.
To unsubscribe from this group and stop receiving emails from it, send an email to adni-data+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/adni-data/307860e7-e2fb-44f5-8da4-f86ab6151fc5n%40googlegroups.com.

**CONFIDENTIALITY NOTICE** This e-mail communication and any attachments are for the sole use of the intended recipient and may contain information that is confidential and privileged under state and federal privacy laws. If you received this e-mail in error, be aware that any unauthorized use, disclosure, copying, or distribution is strictly prohibited. If you received this e-mail in error, please contact the sender immediately and destroy/delete all copies of this message.

Ramiro Magno

unread,
Apr 22, 2025, 2:50:21 PMApr 22
to adni...@googlegroups.com
Hi Danielle,

Thanks for the quick response.

I think I got the difference between VISCODE and VISCODE2.

I'm not referring to expected visits but visits that already took place, as can be seen, they show up in the registry.

How can I access all valid visits, i.e. PHASE / VISCODE2 combinations? I thought VISITS provided that but it's not complete, as it misses ADNI4 (at least).

You received this message because you are subscribed to a topic in the Google Groups "Alzheimer's Disease Neuroimaging Initiative (ADNI) Data" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adni-data/jyEqRCsfoxY/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adni-data+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/adni-data/SN7PR08MB85666EA5148458F807F13F6EC0BB2%40SN7PR08MB8566.namprd08.prod.outlook.com.

Danielle J Harvey

unread,
Apr 22, 2025, 4:59:39 PMApr 22
to adni...@googlegroups.com

Hi Ramiro,

 

I usually think of REGISTRY as giving the complete list of visits that occurred (I believe there is a variable that indicates whether the visit happened or not, so you will want to filter on that). That being said, imaging and blood draws may not occur at the same time as the clinical visit (and the clinical visit may happen over a few days), so dates of visits/scans/blood may not all align.

Ramiro Magno

unread,
Apr 22, 2025, 5:25:38 PMApr 22
to adni...@googlegroups.com
Thanks Danielle.

I think my mental model of these datasets might be wrong.

I'm trying to create an ordered factor for VISCODE2 that spans all PHASEs.

Danielle J Harvey

unread,
Apr 22, 2025, 5:40:34 PMApr 22
to adni...@googlegroups.com

Hi Ramiro,

 

At one point, VISCODE2 mapped the VISCODE to the visit (generally in terms of months since baseline…so the VISCODE representing the m24 visit would get m24). I believe more recently, VISCODE2 has been updated to be in 6 month intervals, using the dates of the initial visit and the current visit and then rounding to the closest half-year/year(s). So, other than sc, scmri, bl, f, and uns1, the number following “m” in VISCODE2 will represent the months since baseline rounded to the nearest 6 months. “sc” and “scmri” are for the screening visit and screening MRI (so they happen first). “bl” is for the baseline visit and would come next. Some information is collected as the screening visit and then additional information is collected at the baseline visit, if someone passes screening…so you will find “initial” information in both “sc” and “bl”. “f” represents someone failing screening, so they didn’t actually end up enrolling in the study. “uns1”, I believe was used in ADNI1 to refer to “visits” that didn’t seem to correspond to a known visit.

 

Does that help?

Ramiro Magno

unread,
Apr 22, 2025, 6:01:25 PMApr 22
to adni...@googlegroups.com
Yes, definitely! Thank you for your patience.

Ramiro Magno

unread,
Apr 22, 2025, 6:26:23 PMApr 22
to adni...@googlegroups.com
So I guess that if I want a global VISCODE to sort longitudinal datasets, this viscode3 of mine would be it, right?

# A tibble: 118 × 3
    PHASE  VISCODE2 viscode3      
    <chr>  <chr>    <chr>         
  1 ADNI1  sc       ADNI1 - sc    
  2 ADNI1  bl       ADNI1 - bl    
  3 ADNI1  m06      ADNI1 - 006   
  4 ADNI1  m12      ADNI1 - 012   
  5 ADNI1  m18      ADNI1 - 018   
  6 ADNI1  m24      ADNI1 - 024   
  7 ADNI1  m30      ADNI1 - 030   
  8 ADNI1  m36      ADNI1 - 036   
  9 ADNI1  m42      ADNI1 - 042   
 10 ADNI1  m48      ADNI1 - 048   
 11 ADNI1  m54      ADNI1 - 054   
 12 ADNIGO sc       ADNIGO - sc   
 13 ADNIGO scmri    ADNIGO - scmri
 14 ADNIGO bl       ADNIGO - bl   
 15 ADNIGO m03      ADNIGO - 003  
 16 ADNIGO m06      ADNIGO - 006  
 17 ADNIGO m12      ADNIGO - 012  
 18 ADNIGO m18      ADNIGO - 018  
 19 ADNIGO m36      ADNIGO - 036  
 20 ADNIGO m42      ADNIGO - 042  
 21 ADNIGO m48      ADNIGO - 048  
 22 ADNIGO m54      ADNIGO - 054  
 23 ADNIGO m60      ADNIGO - 060  
 24 ADNIGO m66      ADNIGO - 066  
 25 ADNIGO m72      ADNIGO - 072  
 26 ADNIGO m78      ADNIGO - 078  
 27 ADNI2  sc       ADNI2 - sc    
 28 ADNI2  scmri    ADNI2 - scmri 
 29 ADNI2  bl       ADNI2 - bl    
 30 ADNI2  m03      ADNI2 - 003   
 31 ADNI2  m06      ADNI2 - 006   
 32 ADNI2  m12      ADNI2 - 012   
 33 ADNI2  m18      ADNI2 - 018   
 34 ADNI2  m24      ADNI2 - 024   
 35 ADNI2  m30      ADNI2 - 030   
 36 ADNI2  m36      ADNI2 - 036   
 37 ADNI2  m42      ADNI2 - 042   
 38 ADNI2  m48      ADNI2 - 048   
 39 ADNI2  m54      ADNI2 - 054   
 40 ADNI2  m60      ADNI2 - 060   
 41 ADNI2  m66      ADNI2 - 066   
 42 ADNI2  m72      ADNI2 - 072   
 43 ADNI2  m78      ADNI2 - 078   
 44 ADNI2  m84      ADNI2 - 084   
 45 ADNI2  m90      ADNI2 - 090   
 46 ADNI2  m96      ADNI2 - 096   
 47 ADNI2  m102     ADNI2 - 102   
 48 ADNI2  m108     ADNI2 - 108   
 49 ADNI2  m114     ADNI2 - 114   
 50 ADNI2  m120     ADNI2 - 120   
 51 ADNI2  m126     ADNI2 - 126   
 52 ADNI2  m132     ADNI2 - 132   
 53 ADNI2  m138     ADNI2 - 138   
 54 ADNI3  sc       ADNI3 - sc    
 55 ADNI3  bl       ADNI3 - bl    
 56 ADNI3  m12      ADNI3 - 012   
 57 ADNI3  m18      ADNI3 - 018   
 58 ADNI3  m24      ADNI3 - 024   
 59 ADNI3  m30      ADNI3 - 030   
 60 ADNI3  m36      ADNI3 - 036   
 61 ADNI3  m42      ADNI3 - 042   
 62 ADNI3  m48      ADNI3 - 048   
 63 ADNI3  m54      ADNI3 - 054   
 64 ADNI3  m60      ADNI3 - 060   
 65 ADNI3  m66      ADNI3 - 066   
 66 ADNI3  m72      ADNI3 - 072   
 67 ADNI3  m78      ADNI3 - 078   
 68 ADNI3  m84      ADNI3 - 084   
 69 ADNI3  m90      ADNI3 - 090   
 70 ADNI3  m96      ADNI3 - 096   
 71 ADNI3  m102     ADNI3 - 102   
 72 ADNI3  m108     ADNI3 - 108   
 73 ADNI3  m114     ADNI3 - 114   
 74 ADNI3  m120     ADNI3 - 120   
 75 ADNI3  m126     ADNI3 - 126   
 76 ADNI3  m132     ADNI3 - 132   
 77 ADNI3  m138     ADNI3 - 138   
 78 ADNI3  m144     ADNI3 - 144   
 79 ADNI3  m150     ADNI3 - 150   
 80 ADNI3  m156     ADNI3 - 156   
 81 ADNI3  m162     ADNI3 - 162   
 82 ADNI3  m168     ADNI3 - 168   
 83 ADNI3  m174     ADNI3 - 174   
 84 ADNI3  m180     ADNI3 - 180   
 85 ADNI3  m186     ADNI3 - 186   
 86 ADNI3  m192     ADNI3 - 192   
 87 ADNI3  m198     ADNI3 - 198   
 88 ADNI3  m204     ADNI3 - 204   
 89 ADNI4  sc       ADNI4 - sc    
 90 ADNI4  bl       ADNI4 - bl    
 91 ADNI4  m12      ADNI4 - 012   
 92 ADNI4  m18      ADNI4 - 018   
 93 ADNI4  m24      ADNI4 - 024   
 94 ADNI4  m30      ADNI4 - 030   
 95 ADNI4  m36      ADNI4 - 036   
 96 ADNI4  m42      ADNI4 - 042   
 97 ADNI4  m48      ADNI4 - 048   
 98 ADNI4  m54      ADNI4 - 054   
 99 ADNI4  m60      ADNI4 - 060   
100 ADNI4  m66      ADNI4 - 066   
101 ADNI4  m72      ADNI4 - 072   
102 ADNI4  m78      ADNI4 - 078   
103 ADNI4  m84      ADNI4 - 084   
104 ADNI4  m90      ADNI4 - 090   
105 ADNI4  m96      ADNI4 - 096   
106 ADNI4  m126     ADNI4 - 126   
107 ADNI4  m132     ADNI4 - 132   
108 ADNI4  m138     ADNI4 - 138   
109 ADNI4  m144     ADNI4 - 144   
110 ADNI4  m150     ADNI4 - 150   
111 ADNI4  m156     ADNI4 - 156   
112 ADNI4  m162     ADNI4 - 162   
113 ADNI4  m168     ADNI4 - 168   
114 ADNI4  m204     ADNI4 - 204   
115 ADNI4  m210     ADNI4 - 210   
116 ADNI4  m216     ADNI4 - 216   
117 ADNI4  m222     ADNI4 - 222   
118 ADNI4  m228     ADNI4 - 228

Danielle J Harvey

unread,
Apr 22, 2025, 6:47:18 PMApr 22
to adni...@googlegroups.com

Hi Ramiro,

 

It might be a little bit more complex than that, since we have “roll-overs” from one phase to another phase in ADNI, so their “months” don’t restart at the next phase. For example, someone might go from ADNI-1 m36 to ADNI-GO m60 (if they also missed some visits). What are you trying to do with this list of visits?

Ramiro Magno

unread,
Apr 22, 2025, 6:59:18 PMApr 22
to adni...@googlegroups.com
Oh... are the levels of VISCODE2 (e.g., "m06", "m12", etc.) already global across phases? However, values like "sc", "scmri", and "bl" seem to be local to each PHASE, right?

What I'm looking for is a globally ordered factor of visits that excludes records that are not actual visits — such as "uns1" or "f". Essentially, given a long-format longitudinal dataset, I want to create a new ordered factor variable that correctly arranges all realized visits across the full study timeline.

It seems that VISCODE2 almost does the job, except for the values like "sc", "scmri", and "bl", which are phase-specific and therefore not globally comparable.

Danielle J Harvey

unread,
Apr 22, 2025, 7:05:10 PMApr 22
to adni...@googlegroups.com

Hi Ramiro,

 

Within participant, VISCODE2 should already be in order (other than making sc, scmri and bl come first) across phases. That said, we often encourage researchers to use the EXAMDATE variable (and EXAMDATE from bl or sc visit) to get the actual time since the initial visit.

Ramiro Magno

unread,
Apr 22, 2025, 7:31:57 PMApr 22
to adni...@googlegroups.com
Hi Danielle,

Thank you for bearing with me — I was really making a mess of it!

I now understand that VISCODE2 is exactly what I need. I’ll also make use of EXAMDATE from either bl or sc.

These are the helpers I'm adding to my code:

#' VISCODE2 codes
#'
#' [viscode2_codes()] returns a fixed, standardized character vector of ADNI
#' `VISCODE2` visit labels. It includes early visits such as `"sc"` and `"bl"`,
#' as well as month-based follow-up visits (e.g., `"m03"`, `"m06"`, ..., `"m228"`),
#' ordered chronologically.
#'
#' This function is used to define a consistent factor level ordering for visit codes
#' across ADNI phases and datasets.
#'
#' @returns
#' A character vector of visit codes:
#' \itemize{
#'   \item `"sc"`, `"scmri"`: screening visits
#'   \item `"bl"`: baseline
#'   \item `"m03"`, `"m06"`, ..., `"m228"`: follow-up months
#' }
#'
#' @examples
#' viscode2_codes()
#'
#' @export
viscode2_codes <- function() {
  c(
    "sc", "scmri", "bl",
    "m03", "m06", "m12", "m18", "m24", "m30", "m36", "m42", "m48", "m54", "m60", "m66",
    "m72", "m78", "m84", "m90", "m96", "m102", "m108", "m114", "m120", "m126", "m132",
    "m138", "m144", "m150", "m156", "m162", "m168", "m174", "m180", "m186", "m192",
    "m198", "m204", "m210", "m216", "m222", "m228"
  )
}

#' Convert VISCODE2 to factor
#'
#' [as_viscode2_fct()] converts a character vector of ADNI `VISCODE2` visit labels
#' into an ordered factor using a standardized level set, so that visits are arranged
#' chronologically for plotting or modeling purposes.
#'
#' Visit codes not present in the level set will be returned as `NA`.
#'
#' @param viscode2 A character vector of visit codes (e.g., `"bl"`, `"m06"`, `"m12"`).
#'
#' @returns
#' An factor with chronological levels defined by [viscode2_codes()].
#'
#' @examples
#' as_viscode2_fct(c("bl", "m06", "m12", "sc", "m03"))
#'
#' @export
as_viscode2_fct <- function(viscode2) {
  factor(viscode2, levels = viscode2_codes())
}





Reply all
Reply to author
Forward
0 new messages