This is a test version of Biostars. For the public version, visit https://www.biostars.org.
interpretation of the results obtained with digital PCR

I'm using non-droplet digital PCR to identify the presence or absence of an RNA using the cDNA made from that RNA. I wanted to ask if the threshold can be set based on the internal negative control or the NTC. I need this because each sample has its own threshold, different from the others, and I can't interpret the data.

I'd also like to know if I can consider a sample positive with just one distribution, or if there must be a specific number of multiple distributions.

Thank you for your attention.

dpcr

1 answer

Hello,

Thanks for the details on your setup. I'll keep this concise, focusing on standard dPCR practices (e.g., per dMIQE guidelines).

Threshold Setting

Yes, set a global threshold based on NTC or internal negative controls—place it just above the negative cluster in the NTC to separate signal from noise. Avoid per-sample thresholds; use controls for consistency across wells. If software auto-varies them, switch to manual mode and check for issues like matrix effects or contamination.

Positive Calls

For presence/absence, require at least 3 positive partitions for a confident positive (to exceed false-positive risk per Poisson stats). A single positive is often ambiguous—treat as negative or re-test, especially if NTCs are clean.

Example R Analysis Code

If you're analyzing raw partition data (e.g., fluorescence amplitudes), use the dpcR package in R for thresholding and calling. Install via install.packages("dpcR") if needed. Here's a basic script assuming you have a CSV with columns: sample_id, partition_id, amplitude.

library(dpcR)

# Load your data (replace with your file)
data <- read.csv("your_dPCR_data.csv")

# Subset NTC for threshold estimation
ntc_data <- data[data$sample_id == "NTC", "amplitude"]

# Set threshold as mean + 3*SD of NTC negatives (adjust as needed)
threshold <- mean(ntc_data) + 3 * sd(ntc_data)

# Apply to all samples and count positives
data$positive <- data$amplitude > threshold
positives_per_sample <- aggregate(positive ~ sample_id, data, sum)

# Print results; e.g., call positive if >=3
print(positives_per_sample)
positives_per_sample$call <- ifelse(positives_per_sample$positive >= 3, "Positive", "Negative")

# For Poisson-based confidence, use built-in functions
poisson_test(positives_per_sample$positive[1], total_partitions = nrow(data[data$sample_id == unique(data$sample_id)[1], ]))

Adapt this to your platform's output (e.g., QuantStudio exports). For more advanced fits, check ddpcr package too.

Kevin

Log in to answer this question.