Q (sonnet-5.5): Do lung adenocarcinoma patients with high EGFR mRNA expression (top quartile) have different survival outcomes than those with low expression? ▶ read_guide { "uri": "cbioportal://statistical-tests-guide" } ▶ read_guide { "uri": "cbioportal://gene-expression-guide" } ◀ result Statistical Test Selection Guide ================================ Purpose ------- This guide ensures the correct statistical test is selected before performing any group comparison, matching cBioPortal's own Group Comparison defaults. HARD RULES — NEVER FABRICATE A STATISTIC ---------------------------------------- ClickHouse cannot run statistical tests. The agent therefore must NEVER produce a derived statistic that is not a literal column value from a SQL result. Specifically: 1. **Never invent a p-value.** Not "p < 0.001", not "p ≈ 0.05", not any p-value. If the user asks "what is the p-value?", the answer is *"I can't compute that — here is the 2x2 contingency table (or group statistics). Run it in cBioPortal's Group Comparison tab, in R with `fisher.test(...)` / `wilcox.test(...)`, or in Python with `scipy.stats.fisher_exact(...)` / `mannwhitneyu(...)`."* 2. **Never claim mutual exclusivity (or co-occurrence) from a contingency table alone.** A 2x2 table is not a test. The shape "altered/not altered × group A/group B" needs Fisher's exact + a defined direction (odds ratio < 1 with significant p). Without that test, the agent presents the table and stops. Descriptive phrasing is also a claim: "largely/mostly mutually exclusive", "rarely co-occur", "tend to co-occur" are forbidden without the test — point to cBioPortal's Mutual Exclusivity tab instead. 3. **Never report a "median" that came from `AVG(...)` or any non-median aggregate.** "Median" and "mean" are different statistics; for skewed clinical distributions (especially survival) they differ substantially. Use ClickHouse's `quantile(0.5)(...)` for actual median, and label arithmetic averages as "mean", never "median". 4. **Never report a hazard ratio, odds ratio, risk ratio, or relative risk** that wasn't computed by an external tool. These require regression / model fitting that ClickHouse does not do. 5. **Never report median overall survival from `AVG(OS_MONTHS)` or even `quantile(0.5)(OS_MONTHS)`.** Median OS requires Kaplan-Meier estimation, which handles censoring (`OS_STATUS = 0:LIVING` means the event hasn't happened yet). Naive medians/means over `OS_MONTHS` ignore censoring and are systematically wrong. The correct handoff: return the raw `(OS_MONTHS, OS_STATUS)` pairs (or descriptive counts: N events, N censored, follow-up range) and tell the user to run KM in R (`survival::survfit`) or Python (`lifelines.KaplanMeierFitter`), or use cBioPortal's Survival comparison. If asked to do any of (1)–(5), respond with the appropriate handoff template from the "Approved Response Templates" section below — do not produce the number. Ambiguous-Term Clarification (before any analysis) -------------------------------------------------- If the user's question uses an ambiguous term, ask before computing anything. Examples: - **"aggressive"** → could mean shorter overall survival, higher metastasis rate, higher grade/stage, higher TMB, or specific molecular features. Ask which definit … (9984 more chars) ▶ list_studies { "search": "lung adenocarcinoma", "limit": 30 } ◀ result # Gene Expression Analysis Guide This guide covers continuous-value genomic data: gene **expression**, **copy number** values, **methylation**, and related profile types. Mutation/CNA/SV *frequency* analysis lives in `cbioportal://mutation-frequency-guide`. ## Where this data lives Continuous per-sample-per-gene values are stored in `genetic_alteration_derived`: | Column | Description | |---|---| | `sample_unique_id` | `_` | | `cancer_study_identifier` | study scope | | `hugo_gene_symbol` | gene | | `profile_type` | which assay/normalization (see below) | | `alteration_value` | the actual value — stored as Nullable(String); cast with `toFloat64OrNull` | `alteration_value` is a string because the same column hosts many different value scales. The `''` and `'NA'` sentinels mean "missing"; always filter them out and use `toFloat64OrNull(alteration_value) IS NOT NULL` for downstream math. ## Discovering profile types for a study Different studies expose different profile types depending on what assays were run and how the data was normalized. Always check what a specific study supports before picking one: ```sql SELECT DISTINCT profile_type FROM genetic_alteration_derived WHERE cancer_study_identifier = 'brca_metabric' ORDER BY profile_type; ``` Common values across the public portal: | Family | Profile types | |---|---| | mRNA expression | `rna_seq_v2_mrna`, `rna_seq_v2_mrna_median_Zscores`, `rna_seq_v2_mrna_median_all_sample_Zscores` (TCGA PanCancer Atlas), `mrna`, `mrna_median_Zscores`, `mrna_seq_v2_rsem`, `mrna_seq_v2_rsem_Zscores`, `mrna_seq_cpm`, `mrna_seq_fpkm`, `mrna_U133`, `mrna_outliers` | | Copy number (continuous) | `cna`, `linear_CNA`, `log2CNA`, `cna_consensus`, `cna_rae`, `gistic` | | Methylation | `methylation_hm27`, `methylation_hm450`, `methylation_epic`, `methylation_promoters_rrbs` | | miRNA | `mirna`, `mirna_median_Zscores` | | Protein | `protein_quantification`, `protein_level`, `RPPA` | **Z-score vs raw choice.** When the user asks "is X correlated with Y", either works for Spearman (rank-based) — Pearson would care. Default to the non-Z-score variant if both exist, and call out which one in the response. ## Canonical recipe — Spearman correlation between two genes ```sql SELECT * FROM gene_pair_coexpression( study = 'brca_metabric', gene_a = 'TP53', gene_b = 'MYC', profile_type = 'mrna' ); ``` Returns one row: `(gene_a, gene_b, profile_type, spearman_correlation, num_samples)`. - `spearman_correlation` in [−1, 1]; `NULL` when fewer than 3 valid paired samples. - Mirrors cbioportal-backend's `ClickhouseCoExpressionMapper.getCoExpressions`, simplified to a pair lookup (the backend computes one ref gene vs ALL other genes for the coexpression page; here the agent asks about a specific pair). ### Verified examples | Study | gene_a | gene_b | profile_type | spearman | n | |---|---|---|---|---|---| | `brca_metabric` | TP53 | MYC | `mrna` | 0.118 | 1980 | | … (4931 more chars) ◀ result {"result":[{"cancer_study_identifier":"msk_met_2021","name":"MSK MetTropism (MSK, Cell 2021)","type_of_cancer_id":"mixed","sample_count":25775,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=msk_met_2021"},{"cancer_study_identifier":"luad_mskcc_2023_met_organotropism","name":"Lung Adenocarcinoma Met Organotropism (MSK, Cancer Cell 2023)","type_of_cancer_id":"luad","sample_count":2653,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_mskcc_2023_met_organotropism"},{"cancer_study_identifier":"lung_msk_2017","name":"Non-Small Cell Cancer (MSK, Cancer Discov 2017)","type_of_cancer_id":"luad","sample_count":915,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=lung_msk_2017"},{"cancer_study_identifier":"luad_mskcc_2020","name":"Lung Adenocarcinoma (MSK, J Thorac Oncol 2020)","type_of_cancer_id":"luad","sample_count":604,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_mskcc_2020"},{"cancer_study_identifier":"luad_tcga","name":"Lung Adenocarcinoma (TCGA, Firehose Legacy)","type_of_cancer_id":"luad","sample_count":586,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_tcga"},{"cancer_study_identifier":"luad_tcga_gdc","name":"Lung Adenocarcinoma (TCGA GDC, 2025)","type_of_cancer_id":"luad","sample_count":571,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_tcga_gdc"},{"cancer_study_identifier":"luad_tcga_pan_can_atlas_2018","name":"Lung Adenocarcinoma (TCGA, PanCancer Atlas)","type_of_cancer_id":"luad","sample_count":566,"has_guide":true,"url":"https://www.cbioportal.org/study/summary?id=luad_tcga_pan_can_atlas_2018"},{"cancer_study_identifier":"luad_msk_npjpo_2021","name":"Lung Adenocarcinoma (MSK, NPJ Precision Oncology 2021)","type_of_cancer_id":"luad","sample_count":426,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_msk_npjpo_2021"},{"cancer_study_identifier":"luad_oncosg_2020","name":"Lung Adenocarcinoma (OncoSG, Nat Genet 2020)","type_of_cancer_id":"luad","sample_count":305,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_oncosg_2020"},{"cancer_study_identifier":"lung_msk_mind_2020","name":"Lung Adenocarcinoma (MSK Mind,Nature Cancer 2022)","type_of_cancer_id":"lung","sample_count":247,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=lung_msk_mind_2020"},{"cancer_study_identifier":"luad_cptac_gdc","name":"Lung Adenocarcinoma (CPTAC GDC, 2025)","type_of_cancer_id":"luad","sample_count":241,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_cptac_gdc"},{"cancer_study_identifier":"luad_tcga_pub","name":"Lung Adenocarcinoma (TCGA, Nature 2014)","type_of_cancer_id":"luad","sample_count":230,"has_guide":false,"url":"https://www.cbioportal.org/study/summary?id=luad_tcga_pub"},{"cancer_study_identifier":"luad_mskimpact_2021","name":"Lung Adenocarcinoma (MSK, 2021)","type_of_cancer_id":"luad","sample_count":186,"has_guide":false, … (1174 more chars) ▶ get_study_guide { "study_id": "luad_tcga_pan_can_atlas_2018" } ▶ clickhouse_list_table_columns { "table": "genetic_alteration_derived" } ▶ clickhouse_list_table_columns { "table": "clinical_data_derived" } ◀ result # Lung Adenocarcinoma (TCGA, PanCancer Atlas) **Study ID:** `luad_tcga_pan_can_atlas_2018` See `_tcga_pancan_template.md` for common TCGA clinical attributes. ## Study-Specific Attributes ### Not available in this study - **Smoking history / pack-years**: no smoking attribute. Say smoking status is not available here rather than inferring it. - **EGFR / KRAS / ALK status**: no clinical status attributes. Derive EGFR and KRAS status from mutation data, and ALK fusions from structural-variant data (5 samples with an ALK SV in `genomic_event_derived`). - `SUBTYPE` is `LUAD` (502) or blank (64) and carries no molecular subtype. `GRADE` is blank for all samples. ## Key Genes - Driver Mutations | Gene | Frequency | Notes | |------|-----------|-------| | KRAS | ~30% | G12C targetable with sotorasib/adagrasib | | EGFR | ~15% | L858R, exon 19 del targetable with TKIs | | ALK | ~5% | Fusions targetable with crizotinib, etc. | | BRAF | ~5% | V600E targetable | | ROS1 | ~2% | Fusions targetable | | RET | ~2% | Fusions targetable | | MET | ~3% | Exon 14 skipping, amplification | ## Notes - Driver mutations are largely mutually exclusive - STK11 and KEAP1 mutations associated with poor immunotherapy response ◀ result {"columns":[{"name":"sample_unique_id","type":"String"},{"name":"cancer_study_identifier","type":"LowCardinality(String)"},{"name":"hugo_gene_symbol","type":"String"},{"name":"profile_type","type":"LowCardinality(String)"},{"name":"alteration_value","type":"Nullable(String)"}]} ◀ result {"columns":[{"name":"internal_id","type":"Int32"},{"name":"sample_unique_id","type":"String","comment":"Globally unique sample ID: cancer_study_identifier + \"_\" + sample.stable_id. Empty for patient-level attributes. Use this for sample filtering and joins."},{"name":"patient_unique_id","type":"String","comment":"Globally unique patient ID: cancer_study_identifier + \"_\" + patient.stable_id. Present for both sample and patient-level attributes."},{"name":"attribute_name","type":"LowCardinality(String)","comment":"Clinical attribute name (e.g., SAMPLE_TYPE, CANCER_TYPE, AGE, OS_MONTHS). Use with attribute_value for filtering. AGE may be floored or capped for de-identification (e.g. all children recorded as 18, or everyone 89+ recorded as 89 or 90): before age statistics check for a pile-up at the min/max, and if present compute age from DAYS_TO_BIRTH (-days / 365.25)."},{"name":"attribute_value","type":"String","comment":"Value of the clinical attribute (String). For SAMPLE_TYPE: Primary, Metastasis, Local Recurrence, Unknown. Missing values are empty strings, so use toFloat64OrNull(attribute_value) for numeric comparisons — CAST fails on them."},{"name":"cancer_study_identifier","type":"LowCardinality(String)"},{"name":"type","type":"LowCardinality(String)","comment":"Data level: \"sample\" for sample-level attributes (e.g., SAMPLE_TYPE), \"patient\" for patient-level attributes (e.g., AGE, OS_MONTHS)."}]} ▶ clickhouse_run_select_query { "query": "WITH expr AS ( SELECT sample_unique_id, log2(toFloat64OrNull(alteration_value)+1) AS v FROM genetic_alteration_derived WHERE cancer_study_identifier='luad_tcga_pan_can_atlas_2018' AND profile_type='rna_seq_v2_mrna' AND hugo_gene_symbol='EGFR' AND alteration_value NOT IN ('','NA') AND toFloat64OrNull(alteration_value) IS NOT NULL ), sp AS (SELECT sample_unique_id, patient_unique_id FROM clinical_data_derived WHERE cancer_study_identifier='luad_tcga_pan_can_atlas_2018' AND type='sample' GROUP BY sample_unique_id, patient_unique_id), pe AS (SELECT sp.patient_unique_id AS pid, avg(expr.v) AS v FROM expr JOIN sp USING (sample_unique_id) GROUP BY pid), q AS (SELECT quantile(0.25)(v) AS q1, quantile(0.75)(v) AS q3 FROM pe), os AS ( SELECT patient_unique_id AS pid, maxIf(toFloat64OrNull(attribute_value), attribute_name='OS_MONTHS') AS m, maxIf(attribute_value, attribute_name='OS_STATUS') AS s FROM clinical_data_derived WHERE cancer_study_identifier='luad_tcga_pan_can_atlas_2018' AND attribute_name IN ('OS_MONTHS','OS_STATUS') GROUP BY pid ) SELECT multiIf(pe.v>=q.q3,'High (top quartile)',pe.v<=q.q1,'Low (bottom quartile)','Middle 50%') AS grp, count() AS patients, countIf(os.s LIKE '1:%') AS events, countIf(os.s LIKE '0:%') AS censored, round(min(os.m),1) AS min_fu, round(max(os.m),1) AS max_fu, round(min(pe.v),2) AS min_expr, round(max(pe.v),2) AS max_expr FROM pe JOIN os USING (pid) CROSS JOIN q WHERE os.m IS NOT NULL AND os.s != '' GROUP BY grp ORDER BY grp" } ▶ resolve_and_route { "studyIds": [ "luad_tcga_pan_can_atlas_2018" ] } ◀ result {"rows":[{"grp":"High (top quartile)","patients":126,"events":49,"censored":77,"min_fu":0,"max_fu":163.1,"min_expr":10.79,"max_expr":14.56},{"grp":"Low (bottom quartile)","patients":127,"events":49,"censored":78,"min_fu":0.4,"max_fu":232.2,"min_expr":3.76,"max_expr":9.08},{"grp":"Middle 50%","patients":248,"events":83,"censored":165,"min_fu":0,"max_fu":238.3,"min_expr":9.08,"max_expr":10.77}]} ◀ result {"success":true,"message":"Found 1 study. Use the metadata to call the appropriate navigation tool(s).","data":{"totalCount":1,"studiesWithMetadata":[{"studyId":"luad_tcga_pan_can_atlas_2018","name":"Lung Adenocarcinoma (TCGA, PanCancer Atlas)","sampleCount":566,"studyViewUrl":"https://www.cbioportal.org/study?id=luad_tcga_pan_can_atlas_2018","metadata":{"clinicalAttributeIds":["AGE","AJCC_PATHOLOGIC_TUMOR_STAGE","AJCC_STAGING_EDITION","ANEUPLOIDY_SCORE","BUFFA_HYPOXIA_SCORE","CANCER_TYPE","CANCER_TYPE_ACRONYM","CANCER_TYPE_DETAILED","DAYS_LAST_FOLLOWUP","DAYS_TO_BIRTH","DAYS_TO_INITIAL_PATHOLOGIC_DIAGNOSIS","DFS_MONTHS","DFS_STATUS","DSS_MONTHS","DSS_STATUS","ETHNICITY","FORM_COMPLETION_DATE","FRACTION_GENOME_ALTERED","GENETIC_ANCESTRY_LABEL","GRADE","HISTORY_NEOADJUVANT_TRTYN","ICD_10","ICD_O_3_HISTOLOGY","ICD_O_3_SITE","INFORMED_CONSENT_VERIFIED","IN_PANCANPATHWAYS_FREEZE","MSI_SCORE_MANTIS","MSI_SENSOR_SCORE","MUTATION_COUNT","NEW_TUMOR_EVENT_AFTER_INITIAL_TREATMENT","ONCOTREE_CODE","OS_MONTHS","OS_STATUS","OTHER_PATIENT_ID","PATH_M_STAGE","PATH_N_STAGE","PATH_T_STAGE","PERSON_NEOPLASM_CANCER_STATUS","PFS_MONTHS","PFS_STATUS","PRIMARY_LYMPH_NODE_PRESENTATION_ASSESSMENT","PRIOR_DX","RACE","RADIATION_THERAPY","RAGNUM_HYPOXIA_SCORE","SAMPLE_COUNT","SAMPLE_TYPE","SEX","SOMATIC_STATUS","SUBTYPE","TBL_SCORE","TISSUE_PROSPECTIVE_COLLECTION_INDICATOR","TISSUE_RETROSPECTIVE_COLLECTION_INDICATOR","TISSUE_SOURCE_SITE","TISSUE_SOURCE_SITE_CODE","TMB_NONSYNONYMOUS","TUMOR_TISSUE_SITE","TUMOR_TYPE","WEIGHT","WINTER_HYPOXIA_SCORE"],"molecularProfileIds":["luad_tcga_pan_can_atlas_2018_gistic","luad_tcga_pan_can_atlas_2018_log2CNA","luad_tcga_pan_can_atlas_2018_mutations","luad_tcga_pan_can_atlas_2018_rna_seq_v2_mrna","luad_tcga_pan_can_atlas_2018_rna_seq_v2_mrna_median_Zscores","luad_tcga_pan_can_atlas_2018_rna_seq_v2_mrna_median_all_sample_Zscores","luad_tcga_pan_can_atlas_2018_rna_seq_v2_mrna_median_all_sample_ref_normal_Zscores","luad_tcga_pan_can_atlas_2018_rppa","luad_tcga_pan_can_atlas_2018_rppa_Zscores","luad_tcga_pan_can_atlas_2018_structural_variants"],"genericAssayProfiles":["luad_tcga_pan_can_atlas_2018_armlevel_cna","luad_tcga_pan_can_atlas_2018_genetic_ancestry","luad_tcga_pan_can_atlas_2018_methylation_hm27_hm450_merge","luad_tcga_pan_can_atlas_2018_methylation_hm450"],"heatmapProfileIds":["luad_tcga_pan_can_atlas_2018_rna_seq_v2_mrna_median_Zscores","luad_tcga_pan_can_atlas_2018_rna_seq_v2_mrna_median_all_sample_Zscores","luad_tcga_pan_can_atlas_2018_rna_seq_v2_mrna_median_all_sample_ref_normal_Zscores","luad_tcga_pan_can_atlas_2018_rppa_Zscores"],"availableComparisonTabs":["overlap","clinical","survival","alterations","mutations","mrna","protein","generic_assay_armlevel_cna","generic_assay_genetic_ancestry","generic_assay_methylation"]}}]}} ▶ navigate_to_group_comparison { "studyIds": [ "luad_tcga_pan_can_atlas_2018" ], "tab": "survival", "groups": [ { "name": "EGFR mRNA high (top quartile)", "studyViewFilter": { "genomicDataFilters": [ { "hugoGeneSymbol": "EGFR", "profileType": "rna_seq_v2_mrna", "values": [ { "start": 1757 } ] } ] } }, { "name": "EGFR mRNA low (bottom quartile)", "studyViewFilter": { "genomicDataFilters": [ { "hugoGeneSymbol": "EGFR", "profileType": "rna_seq_v2_mrna", "values": [ { "end": 541 } ] } ] } } ] } ◀ result {"success":true,"message":"Navigating to https://www.cbioportal.org/comparison/survival?comparisonId=6abb41afe497aad53593ca4b","url":"https://www.cbioportal.org/comparison/survival?comparisonId=6abb41afe497aad53593ca4b","data":{"description":"Group comparison (2 custom groups)","studies":["luad_tcga_pan_can_atlas_2018"],"totalGroups":2,"groups":[{"name":"EGFR mRNA high (top quartile)","sampleCount":128},{"name":"EGFR mRNA low (bottom quartile)","sampleCount":128}],"studyViewUrl":"https://www.cbioportal.org/study?id=luad_tcga_pan_can_atlas_2018","groupUrls":[{"groupName":"EGFR mRNA high (top quartile)","url":"https://www.cbioportal.org/study?id=luad_tcga_pan_can_atlas_2018#filterJson=%7B%22genomicDataFilters%22%3A%5B%7B%22hugoGeneSymbol%22%3A%22EGFR%22%2C%22profileType%22%3A%22rna_seq_v2_mrna%22%2C%22values%22%3A%5B%7B%22start%22%3A1757%7D%5D%7D%5D%7D"},{"groupName":"EGFR mRNA low (bottom quartile)","url":"https://www.cbioportal.org/study?id=luad_tcga_pan_can_atlas_2018#filterJson=%7B%22genomicDataFilters%22%3A%5B%7B%22hugoGeneSymbol%22%3A%22EGFR%22%2C%22profileType%22%3A%22rna_seq_v2_mrna%22%2C%22values%22%3A%5B%7B%22end%22%3A541%7D%5D%7D%5D%7D"}],"pageDescription":"Kaplan-Meier survival analysis comparing EGFR mRNA high (top quartile) (128) vs EGFR mRNA low (bottom quartile) (128)."}} ═ answer (success) I can't say whether survival differs. That takes a Kaplan-Meier curve and a log-rank test, which I can't run here, so I've set up the comparison in cBioPortal for you. **Cohort:** Lung Adenocarcinoma (TCGA, PanCancer Atlas), `luad_tcga_pan_can_atlas_2018`. Several lung adenocarcinoma studies exist, and I chose this one because it has EGFR mRNA and overall survival data. Tell me if you'd rather use another study. **Method:** Patients are grouped by EGFR mRNA expression (RNA-seq V2 RSEM, log2-transformed). The top quartile is the high group and the bottom quartile is the low group. Each patient is counted once, and I used overall survival. | Group | Patients | Deaths | Censored (alive at last follow-up) | Follow-up range (months) | |---|---|---|---|---| | High EGFR (top quartile) | 126 | 49 (39%) | 77 | 0–163 | | Low EGFR (bottom quartile) | 127 | 49 (39%) | 78 | 0.4–232 | | Middle 50% (for reference) | 248 | 83 (33%) | 165 | 0–238 | - **Death counts:** the two groups have the same number and proportion of deaths. That is not a survival comparison, because it ignores when deaths occurred and how long patients were followed. - **Median survival:** fewer than half of the patients in each group died, so the Kaplan-Meier median is probably not reached in either group. I haven't reported a median. - **Statistics:** I haven't computed a p-value or hazard ratio. The portal's survival tab reports the log-rank p-value and the Kaplan-Meier curves. **Links:** - [EGFR high vs low: survival comparison](https://www.cbioportal.org/comparison/survival?comparisonId=6abb41afe497aad53593ca4b) - [Study overview](https://www.cbioportal.org/study?id=luad_tcga_pan_can_atlas_2018) The portal groups use approximate raw RSEM cutoffs. High is at or above about 1757 and low is at or below about 541. Each group has 128 samples, versus 126 and 127 patients in my table, so the numbers differ slightly. To test for a hazard ratio, you could run a Cox model in R (`survival::coxph`) or Python (`lifelines`) on the OS months and status pairs.