Abstract

Body-focused repetitive behaviors and their related conditions, like skin picking disorder and trichotillomania, affect millions of people around the world. Existing solutions focus on behavioral therapy, medication, or reactive wearable devices that notify you after a behavior has already started. Developing research in peripheral nerve stimulation treatments seems promising, though, opening the door to closed-loop systems that predict when to intervene rather than just react. Over the past few weeks, I built a closed-loop wearable that attempts to predict compulsive body-focused repetitive behaviors (BFRBs) from physiological signals and then intervene with median nerve stimulation (MNS) before the behavior starts. The hardware, consisting of an IMU, PPG, thermal, and EMG controlled by a Seeed Xiao ESP32S3, streams raw sensor data over serial to a Python pipeline that extracts window features of varying lengths. Simple ML models (logistic regression, random forest, gradient-boosted trees) of varying feature configurations were then trained on the self-collected dataset.

Findings showed that an enriched, multi-horizon feature set with a 3-second buffer leading up to the event, paired with heart rate variability, was the most promising configuration. Heart rate variability was the only feature to achieve 95% significance in paired bootstrap testing. Point estimates reached an AUC of 0.868. However, given the dataset’s small size, this is more of a ceiling than a stable operating value. Population-level priors also seemed to hurt performance relative to personalization, suggesting that BFRBs are sufficiently individualized that N=1 modeling is more effective. This write-up covers the prediction side of the closed-loop.

Why

If you’ve ever popped a pimple, bitten a nail, or plucked an eyebrow, odds are that you’ve never really thought twice about it.

But for one in every 20 people, body-focused repetitive behaviors (BFRBs) like skin picking, hair pulling, or nail and cheek biting cause harm in ways often hidden from others. Upwards of 20 million people in the US alone experience dermatillomania (excoriation/skin picking disorder) and trichotillomania (hair pulling disorder).

Dermatillomania is characterized by “the repetitive and compulsive picking of skin,” which can lead to tissue damage. While occasional picking at skin is fairly common, the clinical distinction between normal picking and more pathological forms is that the diagnostic criteria require recurrent picking that results from impairment or feeling distressed and results in skin lesions. Trichotillomania is characterized by the repetitive pulling out of one’s own hair, leading to hair loss and often functional impairment. The most common pull sites are the scalp, eyebrows, and eyelashes, but “any bodily site with hair… can be affected.” Pulling episodes often last from a few minutes to several hours. Both disorders often co-occur with depression, anxiety, ADHD, and obsessive-compulsive disorders.

The physical impact on health is real, with open wounds, scarring, and bald spots. But the impact is also emotional, with immense feelings of low self-esteem, embarrassment to go outside, shame after behavior sessions, and a loss of control over actions.

I personally grew up with BFRBs—frequently picking at my lips, face, and hands—since I was seven. And for the longest time, I was told just to stop, that it was only a bad habit. But there was more to it: I couldn’t just stop. It peaked around high school. My lip was constantly scarred from picking. My face was affected more by picking than by hormonal acne, and it didn’t matter what skincare product I bought, because picking always made it worse.

By senior year of high school, I kept thinking about what I could do to help me stop. Throughout college, I returned to this problem every time I worked on side projects. In sophomore year of college, I built a web app that played a randomly selected meme audio if it caught you picking at your lip.

amber

In junior year, I started building a mirror attachment device that would turn my mirror off if it caught me picking at my face. This January, I spent a week working on it a bit more before getting whisked away on some side quests.

dot

I tested that device for the mirror in my dorm room. But I found that while it stopped me from picking in my room, I’d often just stop by the bathroom mirror next to my room. I planned to make something robust this summer. A wearable, perhaps, so that the intervention would exist on-body rather than in-environment.

Some wearables for a version of this already exist, most notably HabitAware and Pavlok. But aside from some mixed reviews and high false positive rates, these mostly vibrate or shock the user to notify them of the behavior. They don’t actually stop the behavior at the moment.

habitaware marketing pic

Research exists that shows a potential way to stop these behaviors before they start. Morera-Maiquez et al. from the University of Nottingham found that median nerve stimulation (MNS) could significantly reduce the urge to tic in people with severe tics or Tourette’s Syndrome. MNS involves noninvasively applying gentle electrical pulses to the median nerve at the wrist—which serves as a gateway to the brain’s sensorimotor control networks—thereby indirectly influencing brain activity. MNS at around 10-13Hz (the mu rhythm frequency band) modifies brain activity via mu-band entrainment, in which rhythmic brain signals synchronize with the external signals. This syncing up can help regulate activity in the sensorimotor cortex by boosting inhibitory oscillatory power, suppressing overall neuronal firing, and synchronizing local neural networks. One of the brain circuits influenced is the cortico-striato-thalamo-cortical (CSTC) circuit, which is involved in movement, habits, learning, impulse control, and more.

Both Tourette’s and BFRBs seem to be influenced by the CSTC circuit. If BFRBs were also caused by dysregulation of the circuit and if MNS helped regulate it, I was curious whether entrainment would help BFRBs as well. Some conversations, including one with Prof. Stephen Jackson at the University of Nottingham, suggested that the idea held. (I was told in numerous conversations that we often don’t know why these things work, just that they do and that they can often be cross-applied to other conditions).

cstc circuit

MNS, however, only helps regulate the circuit when it is actively on. When you turn off the stimulation, users typically return to their baseline behavior. I thought it’d be difficult to manually turn the stimulation on every time, especially since I’m often not even consciously aware of my picking, so I wanted to see if there was a way to trigger it.

This closed-loop approach seemed interesting. Despite both being affected by the CSTC circuit, BFRBs and tics also share a common structure. There’s usually a physiological ramp-up (restlessness and/or autonomic arousal) before the behavior itself. I found joint research from Searle et al. at the University of Cambridge and Nokia showing that hand-crafted features plus classical ML on wrist sensors could achieve an AUC of 0.89-0.94 for predicting these episodes on a small dataset across 10 people using five-minute lookback windows before the behaviors. That research was the inspiration for what this project became.

This hypothesis then involved two parts: a sensing side and a stimulation side.

On the stimulation side, I bought a TENS unit. If it worked on myself, I’d recreate the stimulation with a biphasic circuit. Biphasic circuits work by delivering current in two opposing directions such that the polarity changes to reverse the direction mid-pulse. This way, it can balance net electrical charge and prevent harmful charge accumulation in tissues. In the meantime, it was time for an informal lab-rat test (unfortunately, it was difficult to test this on myself, especially when the condition/event is often subconscious). I ran it in Normal mode at 10Hz, 200μS, in 2-minute bursts each time based on the findings of Maiquez et al. and Iverson et al.

tens unit

On the sensing side, this is what I built.

Hardware Spinup

The overall flow of the sensing module is as follows:

flowchart

The prototype is built around a Seeed XIAO ESP32-S3. I used the following sensors, selected based on ones used in the Cambridge paper. They’re quite standard for a classic white-label health/wrist wearable, and they give the extra flexibility I wanted with raw sensor data.

  • IMU (MPU6050): this gives data on wrist motion and is the primary signal for the physical movement itself
  • PPG (MAX30102): this gives heart rate data and, calculated downstream, heart-rate-variability (HRV) as a proxy of autonomic-arousal.
  • Thermal (MLX90614): this gives data on the surrounding temperature of what the hand is pointed towards. I designed a small holder for the sensor to better position it on my wrist.

thermal sensor holder

These sensors share a single I2C bus and are read together on every tick.

I also tried adding two other sensors for more information:

  • EMG (MyoWare 2.0 + Kendall electrodes, thenar placement) as a more accurate labeling instrument for the future. This was partially inspired by my previous project on EMG sensing. It ran on its own separate I2C bus so that its timing doesn’t mess with the shared IMU/PPG/thermal bus.
  • Because the EMG outputs an analog signal, and because the Xiao ESP32S3 internal 12-bit ADC is too noisy and low-resolution to read it, I routed it through a 16-bit ADS1115 ADC. Note: I’d recommend buying Myoware Cable Shield along with the sensor cable (that splits into three snap connectors). This makes it much easier to place the electrodes on your hand for the thenar placement.
  • EDA (electrodermal activity/skin conductance) as a fourth channel of info, also with its own 16-bit ADC. Unfortunately, this never became that clear of a signal, and I wound up pulling it back out for the 3-sensor IMU+PPG+thermal setup. It’s still in git history, commented out, in case it’s worth revisiting once there’s a clearer signal.

board setup

To keep the hardware side light, the firmware sends raw sensor data in framed packets over serial with no inference or filtering logic. This way, I could keep things simple on the microcontroller side and focus on the model side, while collecting as much data as possible. Two packet types share a line. Both have a version byte and are framed with 0xAA start and 0xBB end bytes so that old and new sessions don’t get ambiguous later.

  • The IMU + PPG + thermal packet: has type 0x01 with 37 bytes; since the 3 sensors share a bus and get read together, they’re packed into a single packet per tick at 50 Hz. The accelerometer/gyroscope is packed as a scaled int16s, PPG IR/RED as raw 32-bit FIFO values, ambient and skin temperature as floats, along with an XOR checksum and the end marker.
  • The EMG packet: has type 0x02 with 11 bytes; the EMG sensor is packed at 500 Hz, with a single raw ADS1115 reading per packet. For now, this isn’t streamed live (it’s used offline with emg_candidate_flagger.py) (see Data Collection), since the labeling hardware wouldn’t ship on a later version of the device.

Both packets ride the 921600-baud serial line. The host-side receiver scans the serial stream for the 0xAA start bytes, reads the type byte, and decides which parsing function to call next. With the framing bytes and fixed-length binary brackets riding the baud line, there’s the risk of a dropped byte, torn packet, or a stray start byte. The XOR checksum is a cheap integrity check for this: a packet is dropped if it doesn’t match. The sensors that share a clock domain are packed into a single packet so that the host doesn’t have to reconcile independent timestamps afterward.

This data is sent over a wired USB serial connection to minimize connectivity issues and focus on the sensing/modeling side. The host-side receiver.py opens the port, decodes packets, and writes three files per session: a raw .bin of concatenated packet bytes, a .meta.json with session timing/counts, and a .markers.csv of any keypress events during recording.

Pipeline and Training Approach

My Procedure

To collect data, I taped the device to myself (in the same place each time), recorded a session, logged ground-truth events during the session, reviewed afterward, retrained, and repeated over about a week and a half. For each session, I’d mark where I placed the setup on my arm with Sharpie for reference the next time. I also used masking tape to cover any exposed solder/pin headers—I found that recording extended sessions without doing this left some parts of my arm scarred.

arm with scars lol

I recorded sessions whenever I had extended periods of time at my desk. If I ever needed to walk around, I’d bring my laptop with me (functionally the battery for this setup). I averaged ~17.5 picking events/session (range: 8 to 27) at around ~16.5 events/hour across 245 windows over 5 days of data collection.

setup

During the session, I set specific hotkeys for three different BFRB behaviors ([ = skin picking, hand; ] = lip picking; \ = skin picking, face) to log which behavior happened. Every timestamp—across sensor data and keypress markers—is in the ESP32’s millis() clock domain, not the laptop’s host wall-clock time. This way, there’s only ever one clock in play, which prevents the possibility of any drift, timing errors that creep into the labeled windows, or the need for lining up two independent clocks afterward.

There are two ways labeling can happen: the faster self-report path (keypress markers during free-living wear) and a slower, more objective path. For the latter, emg_candidate_flagger.py scans a session’s EMG channel, builds a smoothed, rectified envelope, and thresholds it to obtain candidate windows. review_tool.py then plots each candidate against the IMU/PPG/EMG traces and asks for a human accept/reject/adjust. The keypress timing is still the default, though, while there wasn’t time to review every session by hand. The EMG-flagger approach only surfaces candidate windows for a quick human accept/reject, which would be at least slightly smaller per-session review burden.

I had thought about collecting data the same way the Cambridge paper had by video recording and retroactive labeling. But doing so was even more time- and storage-intensive and would have required watching every session video in full length while building and iterating on this solo.

From there, everything is read from a single shared module (host/pipeline/).

  • The data was segmented into positive and negative windows. Positive windows were anticipatory lookback windows of {30, 60, 180} seconds, extending a {3, 5, 7}- second buffer prior to the event, so the model could learn to recognize pre-event states. The buffer was added to absorb any lag from the self-reported keypresses. Negative windows were sampled separately from data that didn’t overlap any positive interval, count-matched to the number of positives to keep the classes balanced.
  • Features were extracted from the raw data: per-axis time-domain values (mean, std, min, max, RMS, zero-crossing rate) and frequency-domain values (dominant frequency, band power) on the 6 axes of the IMU, plus PPG-derived heart rate (mean/std/min/max via bandpass-filtered beat detection). HRV (RMSSD) was also computed.

Model Training

Based on research in this space, I started with simple models: logistic regression, random forest, and gradient-boosted trees, compared via day-based leave-one-group-out cross-validation. Each fold leaves out a full calendar day so that random splits wouldn’t leak across overlapping windows from the same session and inflate scores. And since day-specific factors like mood, sleep, caffeine intake, sensor placement, and stress are constant within a day, excluding entire days helps prevent those factors from correlating with the label across the split, which scattered-window splits wouldn’t guarantee.

Each fold also fits its own StandardScaler, which normalizes the features, on that fold’s training data only. This way, the mean/std values used to scale each feature were computed exclusively from training days within each fold, to prevent cross-day leakage into the normalization statistics. The best model, by mean CV AUC, is fit on all days except the most recent, evaluated once on that held-out day, and saved.

Then, build_dataset.py walks through every recorded session, expands each marker into its anticipatory lookback window, extracts features, and writes a single flat features.npz file (X, y, day-group labels) for training.

The reproducible baseline—logistic regression, full feature set, day-based CV—sits at an AUC of 0.596 ± 0.104, barely better than chance.

From there, the following four feature sets were tested: Baseline: compute_features()’s accel/gyro output unchanged (54 features: mean/std/min/max/rms/zcr/dominant_freq/power_05hz/power_5_15hz per axis) in a single 60-second window. Multi-horizon: (A)’s feature computation applied independently at three window lengths (30s/60s/180s), all ending at the same anticipation point (event_start - buffer_ms), concatenated into a 162-feature vector per sample Enriched single-window: (A) + jerk (d(accel)/dt) time-domain stats (mean/std/min/max/rms/zcr per axis, 18 features) in a 60-second window, 72 total. Enriched multi-horizon: (B) + jerk at each of the three window lengths, 216 features total (72 x 3, w30/w60/w180 prefixed).

Across nearly 170 tested configurations over the course of this project—different model types, window splits, feature variants, and attempts to augment data—the best cross-validation point estimate came from random forest on a richer feature set, landing at 0.868 AUC. The feature set consisted of the following:

  • Feature set D
  • 3-second pre-event buffer
  • Clean-early-segment HRV (RMSSD/SDNN computed from the first 90 seconds of the 180s window) added on top.

But given the relatively small amount of data, I’d take this more as a snapshot than a real operating point.

What the data showed & Learnings

Here’s how the most relevant configurations compare, each compared against its own baseline via paired day-block bootstrapping (resampling calendar days, refitting each time, and comparing the same day-draws across both sides of a comparison):

Configuration Model CV AUC Compared against 95% CI of the difference % resamples favoring it Significant at 95%?
Baseline — full feature set, no additions LR 0.596 ± 0.104 — (reference floor)
Highest point estimate — Set D (multi-horizon + jerk), 3s buffer, + HRV RF 0.868 ± 0.083 baseline overlaps baseline’s CI ❌ not confirmed
Best statistically-supported config — Set D, 3s buffer, + HRV LR 0.821 ± 0.091 same config, HRV vs. no HRV [+0.0048, +0.0482] 100% ✅ yes
+ HRV — Set B (multi-horizon), 3s buffer LR 0.820 ± 0.061 same config, HRV vs. no HRV [+0.0055, +0.0412] 98.0% ✅ yes
+ Clean-segment HRV — original single-window baseline LR 0.732 → 0.761 same config, HRV vs. no HRV [+0.0045, +0.1173] 98.6% ✅ yes (first to clear the bar)
Shorter pre-event buffer, 7s → 3s — single-window baseline GBT 0.641 → 0.669 7s buffer [−0.050, +0.162] 94.8% ❌ just short
+ Thermal channel GBT 0.641 → 0.550 no thermal [−0.117, +0.108] 26.8% ❌ no (leans toward hurting)
+ Thermal channel LR 0.632 → 0.569 no thermal [−0.135, +0.087] 31.4% ❌ no (leans toward hurting)
Population-prior shrinkage, λ=1 → 1000 LR 0.580 → 0.443 36-feature baseline (0.571 ± 0.092, no prior) overlaps at every λ (e.g. λ=1 bootstrap: [0.384, 0.698] vs. baseline’s [0.374, 0.740]) ❌ no benefit, and gets monotonically worse as λ increases

Paired bootstrapping yielded a clearer comparison than looking at each config’s confidence interval separately. Comparing the baseline against each candidate on the same resampled days—instead of independently—canceled out shared noise, and there was a slightly more directional signal underneath (77–95% win rates for several candidates) that was not captured by the marginal CI’s. But in the original sweep, only one candidate actually met the 95% significance threshold: heart rate.

Computing HR/HRV features from just the first 90 seconds of the 180-second lookback window—instead of the whole thing—kept 95.5% of windows usable, as opposed to near-chance performance elsewhere when motion artifact was involved. Adding RMSSD/SDNN on top of that moved CV AUC from 0.732 to 0.761, and the paired bootstrap put the improvement’s 95% CI at [+0.0045, +0.117]—the only comparison in the original sweep to exclude zero, even if barely. This was promising!

The cardiac-HRV lead also held up under follow-up. Stacking the sweep’s best feature sets (multi-horizon 30s/60s/180s windows, with and without jerk) on top of the 3s buffer, then adding the same clean-segment RMSSD/SDNN features back in, pushed the best point estimate to 0.868 AUC (up from the sweep’s original 0.819). The HRV addition itself achieved 95% significance again, independently, across both multi-horizon feature sets, specifically for logistic regression (CIs [+0.0055, +0.0412] and [+0.0048, +0.0482]; 98–100% of paired resamples favored it). This does seem to be specific to the linear model, though: adding HRV did not clear significance for random forest.

A shorter pre-event buffer also seemed like a second promising signal. When I swept across 7, 5, and 3 seconds, 3s came out ahead at an AUC of 0.669 vs. the 0.641 AUC for a paired bootstrap against the 7s baseline. This put 94.8% of resamples in favor of 3 seconds, just short of the 95% significance line, with a CI of [−0.050, +0.162] that still (barely) spans zero.

Thermal data unfortunately doesn’t help—it’s likely too slow and noisy a signal. Adding it in dropped CV AUC in both GBT (0.641 → 0.550) and LR (0.632 → 0.569). A paired bootstrap yielded the difference [−0.117, +0.108], so it’s neither a confirmed regression nor a helpful signal, with only 27–31% of resamples favoring keeping it in. Skin temperature likely lags autonomic arousal too slowly to be useful in a seconds-to-minutes anticipatory window.

Personalized data also seems slightly better suited to this use case than generic data. I ran a separate experiment fitting a population prior on the public 10-subject BFRB dataset from the Cambridge/Nokia paper, then tried shrinking my personal model toward it. Performance degraded monotonically as I strengthened the prior. After aligning on sensor direction and orientation, performance remained flat (0.61–0.65 across all λ values) rather than degrading to 0.44. This was one of the closer-to-significance results in the project outside of HRV. Still, BFRBs are likely specific enough to the individual (and data collection methods too unstandardized) that building for one person is better and more accurate than building for a population.

Running a data collection and model-training pipeline on myself was interesting (and difficult), especially given what I was collecting. It’s hard and very noisy/biased, obviously. Hotkey-pressing after a behavior I’m often not even aware of was difficult. They’re fast to collect, but the timing isn’t precise, and I’m sure it added some extra behaviors and biases I wouldn’t have had otherwise, and I’m sure I missed some presses too. When there’s time to run it at scale, I suspect the EMG-flagger-plus-human-review pipeline would produce cleaner ground truth.

On the hardware side, being precise about signal integrity mattered more than I expected going in—putting EMG on its own bus kept its 500 Hz poll from stepping on everything else, and adding the ADS1115 ADCs helped clean the signal. That said, in the long run, I don’t think reinventing the hardware layer is where the real moat is. If my only goals for this project were to get raw sensor data and achieve low latency, I likely could’ve bought a device with this sensor suite and built the ML on top of its output. Devices like the Polar Verity Sense currently stream raw PPG and IMU data over BLE in real time with an open SDK, and for anticipatory windows measured in seconds to minutes, that latency likely wouldn’t be the bottleneck. Past the ceiling of an optimized, off-the-shelf sensor stack, I think any further speed gains lie in software, not hardware.

The one place custom hardware might still matter is flexibility—specifically, being able to close the loop the way I actually want it closed. In this case, the existing wearables that pair sensing with stimulation tend to be reactive, catching the behavior after it’s started and notifying the user via vibration or shock. They don’t pair anticipatory physiological sensing with nerve stimulation, and none intervene before the behavior begins. Building the sensing hardware from scratch means being able to fold a specific combination into a single device, rather than gluing together an external sensing SDK with a stimulation unit built for a different kind of intervention. It also means not being boxed in by an API while figuring out what is needed. For instance, I have the flexibility to switch mid-prototyping if I realize I want a different sample rate, a different buffer scheme, or a way to flag a specific packet for debugging.

What’s Next

There’s a lot more that can be done with this project. On the sensing side, there’s always more data to collect and more sensor refinement to be done. After more data is collected, it would be helpful to prioritize testing the best-performing configuration (Set D (multi-horizon + jerk), 3s buffer, + HRV) and the hypothesis that early-window HRV improves AUC over the baseline feature set. The sensor refinement can happen either by condensing them onto a PCB with cleaner wiring to reduce lossiness, or by creating a case/form factor for the whole jig so that data collection can be more standardized each session.

Furthermore, more work can be done on the labeling pipeline before scaling up data collection. Self-reported keypress labels are easy to collect, but the timing isn’t precise, and more data would likely make the data noisier. The EMG-with-human-review approach would likely produce cleaner ground truth and would be worth the extra setup cost if this gets built on at larger scale.

On the stimulation side, the next step would be a custom GPIO-triggered, biphasic, current-limited circuit that replaces the commercial TENS unit (currently set to Normal mode at 200μs and 10Hz) and takes its trigger input directly from the sensing module’s output. A battery-powered, current-limited biphasic H-bridge stimulator (with a boost converter, H-bridge switching driven by microcontroller GPIO, and a DC-blocking coupling capacitor in series with the electrodes) should be sufficient. If someone does build on the stimulation side, make sure to bench-test into a resistive load before any skin contact.

For me, I’m also wrapping up V2 of my prototype mirror attachment device to address how I experience my skin picking now. You can find more about that here.

References

Benjamin Lucas Searle, Dimitris Spathis, Marios Constantinides, Daniele Quercia, and Cecilia Mascolo. 2021. Anticipatory Detection of Compulsive Body-focused Repetitive Behaviors with Wearables. In Proceedings of the 23rd International Conference on Mobile Human-Computer Interaction (MobileHCI ‘21). Association for Computing Machinery, New York, NY, USA, Article 17, 1–15. https://doi.org/10.1145/3447526.3472061

Feyba Jijimon, Sonam Fathima Mehak, Zameel Mohammed, Samir Kumar Praharaj, Gireesh Gangadharan, Rewiring the OCD brain: Insights beyond cortico-striatal networks, Neurobiology of Disease, Volume 218, 2026, 107216, ISSN 0969-9961, https://doi.org/10.1016/j.nbd.2025.107216.

Grant JE, Chamberlain SR. Trichotillomania and Skin-Picking Disorder: An Update. Focus (Am Psychiatr Publ). 2021 Oct;19(4):405-412. doi: 10.1176/appi.focus.20210013. Epub 2021 Nov 5. PMID: 35747295; PMCID: PMC9063575.

Iverson AM, Arbuckle AL, Song DY, Bihun EC, Black KJ. Median Nerve Stimulation for Treatment of Tics: A 4-Week Open Trial with Ecological Momentary Assessment. J Clin Med. 2023 Mar 28;12(7):2545. doi: 10.3390/jcm12072545. PMID: 37048629; PMCID: PMC10095435.

Maiquez BM, Sigurdsson HP, Dyke K, Clarke E, McGrath P, Pasche M, Rajendran A, Jackson GM, Jackson SR. Entraining Movement-Related Brain Oscillations to Suppress Tics in Tourette Syndrome. Curr Biol. 2020 Jun 22;30(12):2334-2342.e3. doi: 10.1016/j.cub.2020.04.044. Epub 2020 Jun 4. PMID: 32502412; PMCID: PMC7308804.

Maiquez BM, Smith C, Dyke K, Chou CP, Kasbia B, McCready C, Wright H, Jackson JK, Farr I, Badinger E, Jackson GM, Jackson SR. A double-blind, sham-controlled, trial of home-administered rhythmic 10-Hz median nerve stimulation for the reduction of tics, and suppression of the urge-to-tic, in individuals with Tourette syndrome and chronic tic disorder. J Neuropsychol. 2023 Sep;17(3):540-563. doi: 10.1111/jnp.12313. Epub 2023 May 3. PMID: 37133932; PMCID: PMC10947020.

Peters SK, Dunlop K, Downar J. Cortico-Striatal-Thalamic Loop Circuits of the Salience Network: A Central Pathway in Psychiatric Disease and Treatment. Front Syst Neurosci. 2016 Dec 27;10:104. doi: 10.3389/fnsys.2016.00104. PMID: 28082874; PMCID: PMC5187454.

Rădulescu, A., Herron, J., Kennedy, C. et al. Global and local excitation and inhibition shape the dynamics of the cortico-striatal-thalamo-cortical pathway. Sci Rep 7, 7608 (2017). https://doi.org/10.1038/s41598-017-07527-8