ScRAT를 활용하여, scRNA 데이터를 분석해 보았다.
2025.03.20 - [AI 및 Data Analysis/Code] - [ScRAT] scRNA Analysis
[ScRAT] scRNA Analysis
Paper : Phenotype prediction from single-cell RNA-seq data using attention-based neural networks https://academic.oup.com/bioinformatics/article/40/2/btae067/7613064 본 논문에서 언급된 ScRAT 방법으로 scRNA 분석하기 https://github.com/yuzhen
doraemin.tistory.com
데이터에 대해 살펴보자.
COMBAT와 Haniffa 데이터는 → covid 인지 아닌지에 대한 데이터다.
SC4 데이터는 → 경증인지 중증인지에 대한 데이터다. 또한, 회복인지 진행인지를 나타내는 데이터다.
For COMBAT and Haniffa datasets, we perform the task of disease diagnosis
COVID versus Non-COVID
For SC4 which includes mostly COVID samples
mild/moderate versus severe/critical (경증/중등증 vs. 중증/위중증)
convalescence versus progression (회복 vs. 진행)
데이터의 파일 형태
파일 이름 | 역할 및 내용 |
COMBAT_X_pca.npy / Haniffa_X_pca.npy | PCA 차원 축소된 세포별 유전자 발현 데이터 (numpy 배열) |
labels.pkl | 표현형(Phenotype) 라벨 (COVID/Non-COVID) |
patient_id.pkl | 샘플에 대한 환자 ID 정보 |
cell_type_large.pkl | 세포 유형(cell type) 정보 (상세한 라벨 포함) |
cell_type.pkl | 간략한 세포 유형 정보 |
COMBAT 데이터셋
총 세포 수: 836,148개
총 환자 수: 124명
Unique Labels (8, object)
- ['COVID_SEV', 'COVID_MILD', 'COVID_HCW_MILD', 'COVID_CRIT', 'COVID_LDN', 'Sepsis', 'HV', 'Flu']
- COVID_SEV → 중증 COVID-19 환자
- COVID_MILD → 경증 COVID-19 환자
- COVID_HCW_MILD → 경증 COVID-19 환자(보건의료 종사자)
- COVID_CRIT → 위중증 COVID-19 환자
- COVID_LDN → 런던 COVID-19 환자군
- Sepsis → 패혈증(Sepsis) 환자
- HV → 건강한 대조군(Healthy Volunteers)
- Flu → 인플루엔자(Flu) 환자
Unique Cell Types Large (41, object)
- ['NK.CD16hi', 'CD8.TEMRA', 'nan', 'ncMono', 'cMono', ..., 'GDT.VD2', 'CD8.TREG', 'PLT', 'RET', 'Mast’]
Unique Cell Types (18, object)
- ['NK', 'CD8', 'nan', 'ncMono', 'cMono', ..., 'HSC', 'DC', 'PLT', 'RET', 'Mast']
Haniffa 데이터셋
총 세포 수: 647,366개
총 환자 수: 130명
Unique Labels (10, object) : ['Moderate', 'Healthy', 'Death', 'Mild', 'Severe', 'LPS', 'Critical ', 'Non-covid', 'Asymptomatic', 'nan']
- Moderate → 중등증 COVID-19 환자
- Mild → 경증 COVID-19 환자
- Severe → 중증 COVID-19 환자
- Critical → 위중증 COVID-19 환자
- Asymptomatic → 무증상 COVID-19 환자
- Non-covid → COVID-19 감염되지 않은 환자
- Healthy → 건강한 대조군(Healthy Control)
- LPS → LPS(lipopolysaccharide) 염증 반응 실험군
- Death → 사망자 데이터
- nan → 결측값(missing value) 포함
Unique Cell Types Large (51, object)
- ['CD8.TE', 'CD4.IL22', 'CD8.Naive', 'CD4.Naive', 'CD8.EM', ..., 'HSC_CD38neg', 'HSC_myeloid', 'HSC_MK', 'CD4.Th17', 'B_malignant’]
Unique Cell Types (18, object)
- ['CD8', 'CD4', 'CD14', 'B_cell', 'NK_16hi', ..., 'gdT', 'HSC', 'pDC', 'RBC', 'Mono_prolif']
ScRAT 모델 실험에서 사용된 COMBAT 및 Haniffa 데이터셋의 labels.pkl과 patient_id.pkl 파일을 분석해보자.
import pickle
import pandas as pd
# 파일 경로 목록
file_paths = {
"COMBAT_labels": "data/COMBAT/labels.pkl",
"COMBAT_patient_id": "data/COMBAT/patient_id.pkl",
"Haniffa_labels": "data/Haniffa/labels.pkl",
"Haniffa_patient_id": "data/Haniffa/patient_id.pkl",
}
# 데이터 로드 및 출력
for key, file in file_paths.items():
with open(file, 'rb') as f:
data = pickle.load(f)
print(f"📂 {file} 데이터 타입: {type(data)}")
# pandas.Series인 경우 개수 및 고유값 출력
if isinstance(data, pd.Series):
print(f" 📊 샘플 개수: {data.shape[0]}")
print(f" 🔍 예제 데이터: {data.head(5).to_dict()}")
# 고유한 값 확인
unique_values = data.unique()
num_unique_values = len(unique_values)
print(f" 🏷️ Unique 값 개수: {num_unique_values}")
# 고유한 label 또는 환자 ID 출력
if "labels" in key:
print(f" 🔹 Unique Labels: {unique_values}")
print(f" 📈 Label별 세포 수: {data.value_counts()}")
elif "patient_id" in key:
print(f" 🔹 Unique Patient IDs 개수: {num_unique_values}")
# list나 dict인 경우 개수 출력
elif isinstance(data, list) or isinstance(data, dict):
print(f" 📊 샘플 개수: {len(data)}")
print(f" 🔍 예제 데이터: {data[:5] if isinstance(data, list) else list(data.items())[:5]}")
print("-" * 50)
실행 >
kim89@ailab-System-Product-Name:~/ScRAT$ python data_pkl.py
📂 data/COMBAT/labels.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 836148
🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'COVID_SEV', 'AAACCTGAGCGGATCA-1-gPlexA1': 'COVID_MILD', 'AAACCTGAGGACATTA-1-gPlexA1': 'COVID_HCW_MILD', 'AAACCTGAGGCGACAT-1-gPlexA1': 'COVID_CRIT', 'AAACCTGAGGGAACGG-1-gPlexA1': 'COVID_SEV'}
🏷️ Unique 값 개수: 8
🔹 Unique Labels: ['COVID_SEV', 'COVID_MILD', 'COVID_HCW_MILD', 'COVID_CRIT', 'COVID_LDN', 'Sepsis', 'HV', 'Flu']
Categories (8, object): ['HV', 'COVID_MILD', 'COVID_SEV', 'COVID_CRIT', 'COVID_HCW_MILD',
'COVID_LDN', 'Sepsis', 'Flu']
📈 Label별 세포 수: Source
COVID_SEV 247799
Sepsis 164128
COVID_MILD 114418
COVID_CRIT 93982
HV 92205
COVID_HCW_MILD 88898
Flu 19233
COVID_LDN 15485
Name: count, dtype: int64
--------------------------------------------------
📂 data/COMBAT/patient_id.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 836148
🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'S00109', 'AAACCTGAGCGGATCA-1-gPlexA1': 'S00112', 'AAACCTGAGGACATTA-1-gPlexA1': 'G05153', 'AAACCTGAGGCGACAT-1-gPlexA1': 'S00005', 'AAACCTGAGGGAACGG-1-gPlexA1': 'S00061'}
🏷️ Unique 값 개수: 124
🔹 Unique Patient IDs 개수: 124
--------------------------------------------------
📂 data/Haniffa/labels.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 647366
🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'Moderate', 'AAACCTGAGAGTAATC-MH9179824': 'Moderate', 'AAACCTGAGAGTGAGA-MH9179824': 'Moderate', 'AAACCTGAGGAATCGC-MH9179824': 'Moderate', 'AAACCTGAGTGTTGAA-MH9179824': 'Moderate'}
🏷️ Unique 값 개수: 10
🔹 Unique Labels: ['Moderate', 'Healthy', 'Death', 'Mild', 'Severe', 'LPS', 'Critical ', 'Non-covid', 'Asymptomatic', 'nan']
Categories (10, object): ['Asymptomatic', 'Critical ', 'Death', 'Healthy', ..., 'Moderate', 'Non-covid',
'Severe', 'nan']
📈 Label별 세포 수: Worst_Clinical_Status
Moderate 179012
Healthy 97039
Mild 93835
nan 74913
Critical 63854
Death 41836
Severe 40235
Asymptomatic 33601
Non-covid 15157
LPS 7884
Name: count, dtype: int64
--------------------------------------------------
📂 data/Haniffa/patient_id.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 647366
🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'MH9179824', 'AAACCTGAGAGTAATC-MH9179824': 'MH9179824', 'AAACCTGAGAGTGAGA-MH9179824': 'MH9179824', 'AAACCTGAGGAATCGC-MH9179824': 'MH9179824', 'AAACCTGAGTGTTGAA-MH9179824': 'MH9179824'}
🏷️ Unique 값 개수: 130
🔹 Unique Patient IDs 개수: 130
--------------------------------------------------
ScRAT 모델 실험에서 사용된 COMBAT 및 Haniffa 데이터셋의 cell_type_large.pkl과 cell_type.pkl 파일을 분석해보자.
import pickle
import pandas as pd
# 파일 경로 목록 (세포 타입 관련 파일)
cell_type_files = {
"COMBAT_cell_type_large": "data/COMBAT/cell_type_large.pkl",
"COMBAT_cell_type": "data/COMBAT/cell_type.pkl",
"Haniffa_cell_type_large": "data/Haniffa/cell_type_large.pkl",
"Haniffa_cell_type": "data/Haniffa/cell_type.pkl",
}
# 데이터 로드 및 출력
for key, file in cell_type_files.items():
try:
with open(file, 'rb') as f:
data = pickle.load(f)
print(f"📂 {file} 데이터 타입: {type(data)}")
# pandas.Series인 경우 개수 및 고유값 출력
if isinstance(data, pd.Series):
print(f" 📊 샘플 개수: {data.shape[0]}")
print(f" 🔍 예제 데이터: {data.head(5).to_dict()}")
# 고유한 세포 타입 확인
unique_values = data.unique()
num_unique_values = len(unique_values)
print(f" 🏷️ Unique 세포 타입 개수: {num_unique_values}")
print(f" 🔹 Unique Cell Types: {unique_values}")
# list나 dict인 경우 개수 출력
elif isinstance(data, list) or isinstance(data, dict):
print(f" 📊 샘플 개수: {len(data)}")
print(f" 🔍 예제 데이터: {data[:5] if isinstance(data, list) else list(data.items())[:5]}")
except FileNotFoundError:
print(f"⚠️ 파일을 찾을 수 없음: {file}")
print("-" * 50)
실행 >
(scrat) kim89@ailab-System-Product-Name:~/ScRAT$ python data_celltype_pkl.py
📂 data/COMBAT/cell_type_large.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 836148
🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'NK.CD16hi', 'AAACCTGAGCGGATCA-1-gPlexA1': 'CD8.TEMRA', 'AAACCTGAGGACATTA-1-gPlexA1': 'nan', 'AAACCTGAGGCGACAT-1-gPlexA1': 'ncMono', 'AAACCTGAGGGAACGG-1-gPlexA1': 'cMono'}
🏷️ Unique 세포 타입 개수: 41
🔹 Unique Cell Types: ['NK.CD16hi', 'CD8.TEMRA', 'nan', 'ncMono', 'cMono', ..., 'GDT.VD2', 'CD8.TREG', 'PLT', 'RET', 'Mast']
Length: 41
Categories (41, object): ['B.INT', 'B.MEM', 'B.NAIVE', 'CD4.NAIVE', ..., 'iNKT', 'nan', 'ncMono',
'pDC']
--------------------------------------------------
📂 data/COMBAT/cell_type.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 836148
🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'NK', 'AAACCTGAGCGGATCA-1-gPlexA1': 'CD8', 'AAACCTGAGGACATTA-1-gPlexA1': 'nan', 'AAACCTGAGGCGACAT-1-gPlexA1': 'ncMono', 'AAACCTGAGGGAACGG-1-gPlexA1': 'cMono'}
🏷️ Unique 세포 타입 개수: 18
🔹 Unique Cell Types: ['NK', 'CD8', 'nan', 'ncMono', 'cMono', ..., 'HSC', 'DC', 'PLT', 'RET', 'Mast']
Length: 18
Categories (18, object): ['B', 'CD4', 'CD8', 'DC', ..., 'cMono', 'iNKT', 'nan', 'ncMono']
--------------------------------------------------
📂 data/Haniffa/cell_type_large.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 647366
🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'CD8.TE', 'AAACCTGAGAGTAATC-MH9179824': 'CD4.IL22', 'AAACCTGAGAGTGAGA-MH9179824': 'CD8.Naive', 'AAACCTGAGGAATCGC-MH9179824': 'CD4.Naive', 'AAACCTGAGTGTTGAA-MH9179824': 'CD8.EM'}
🏷️ Unique 세포 타입 개수: 51
🔹 Unique Cell Types: ['CD8.TE', 'CD4.IL22', 'CD8.Naive', 'CD4.Naive', 'CD8.EM', ..., 'HSC_CD38neg', 'HSC_myeloid', 'HSC_MK', 'CD4.Th17', 'B_malignant']
Length: 51
Categories (51, object): ['ASDC', 'B_exhausted', 'B_immature', 'B_malignant', ..., 'RBC', 'Treg',
'gdT', 'pDC']
--------------------------------------------------
📂 data/Haniffa/cell_type.pkl 데이터 타입: <class 'pandas.core.series.Series'>
📊 샘플 개수: 647366
🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'CD8', 'AAACCTGAGAGTAATC-MH9179824': 'CD4', 'AAACCTGAGAGTGAGA-MH9179824': 'CD4', 'AAACCTGAGGAATCGC-MH9179824': 'CD4', 'AAACCTGAGTGTTGAA-MH9179824': 'CD4'}
🏷️ Unique 세포 타입 개수: 18
🔹 Unique Cell Types: ['CD8', 'CD4', 'CD14', 'B_cell', 'NK_16hi', ..., 'gdT', 'HSC', 'pDC', 'RBC', 'Mono_prolif']
Length: 18
Categories (18, object): ['B_cell', 'CD4', 'CD8', 'CD14', ..., 'RBC', 'Treg', 'gdT', 'pDC']
--------------------------------------------------
ScRAT 모델 실험에서 사용된 COMBAT 및 Haniffa 데이터셋의 pca.npy 파일을 분석해보자.
import numpy as np
# 데이터 로드
combat_pca = np.load("data/COMBAT/COMBAT_X_pca.npy")
haniffa_pca = np.load("data/Haniffa/Haniffa_X_pca.npy")
# 데이터 형태 확인
print(f"COMBAT 데이터 크기: {combat_pca.shape}") # (세포 개수, PCA 차원)
print(f"Haniffa 데이터 크기: {haniffa_pca.shape}") # (세포 개수, PCA 차원)
실행 >
(scrat) kim89@ailab-System-Product-Name:~/ScRAT$ python data_npy.py
COMBAT 데이터 크기: (836148, 50)
Haniffa 데이터 크기: (647366, 50)
'AI 및 Data Analysis > Code' 카테고리의 다른 글
[Hierarchical MIL] scRNA Analysis (0) | 2025.03.24 |
---|---|
[Hierarchical MIL] Exploratory Data (Summary) (0) | 2025.03.22 |
[ScRAT] STEP 2. Attention layer (0) | 2025.03.20 |
[ScRAT] utils.py _ mixup() (0) | 2025.03.20 |
[ScRAT] Code Demo (0) | 2025.03.20 |