AMOC과 NSHF 상관관계 분석 및 미래 예측¶
대서양 열염순환과 해수면열속 간의 관계 규명 프로젝트
개요¶
AMOC Trend 분석의 후속 프로젝트로, AMOC(대서양 열염순환)과 NSHF(해수면열속) 간의 상관관계를 분석하고, 라브라도 해역을 중심으로 바람 속도 변화가 이들 매개변수에 미치는 영향을 조사.
- 수행 기간: 학부 과정
- 데이터 출처: WCRP CMIP6
- 분석 도구: MATLAB
- 블로그: AMOC과 NSHF 상관관계 분석
문제정의¶
NSHF란?¶
NSHF(Net Surface Heat Flux, 해수면열속)은 해양 표면과 대기 사이에서 교환되는 열 에너지의 순 흐름을 나타내는 지표.
- 양수 값 (+): 해양이 대기로부터 열을 흡수
- 음수 값 (-): 해양이 대기로 열을 방출
AMOC과 NSHF의 관계¶
AMOC이 따뜻한 물을 고위도로 수송하면, 그 따뜻한 물은 열을 방출하며 주변 대기를 데운다. 따라서 AMOC 변화는 NSHF에 영향을 미치고, 역으로 NSHF 변화가 AMOC에 피드백을 줄 수 있다.
연구 목표¶
- AMOC과 NSHF 변화 간의 관계 탐구
- 라브라도 해역에서 바람 속도 변화가 NSHF와 AMOC에 미치는 영향 조사
- 1850년~2100년 30개 기후모델 데이터로 분석
가설설정¶
가설 1: AMOC과 NSHF 역상관 관계¶
- AMOC 강도와 NSHF 변화는 역관계
가설 2: 풍속이 NSHF와 AMOC에 영향¶
- 라브라도 해에서 풍속 변화가 NSHF와 AMOC 변화에 기여
가설 3: 공간적 분포 패턴 존재¶
- 풍속 변화의 공간적 분포가 NSHF와 AMOC에 유의미한 영향
데이터¶
CMIP6 모델 데이터¶
| 데이터 | 형식 | 모델 수 | 기간 |
|---|---|---|---|
| AMOC | txt | 30개 | 1980-2060 |
| NSHF | NetCDF | 30개 | 1980-2060 |
| sfcWind (지표면 바람) | NetCDF | 30개 | 1980-2060 |
| 해수 염분 | NetCDF | - | - |
| 잠재 수온 | NetCDF | - | - |
| 북위 50도 heat_transport | NetCDF | - | - |
NetCDF 데이터 사용 이유¶
- 물리적 메커니즘 분석: 단순 시계열 상관관계가 아닌 구동력 분석
- 다차원 데이터 처리: 공간적 분포 분석 필요
- 효율적 처리: 위도, 경도, 시간 등 다차원 인덱싱
데이터 불러오기¶
amocFiles = dir(fullfile(folderPath, 'AMOC*.txt'));
nshfFiles = dir(fullfile(folderPath, 'nshf*.nc'));
numModels = length(amocFiles);
% AMOC 데이터 로드
for i = 1:numModels
currentFile = amocFiles(i).name;
amocData = load(fullfile(folderPath, currentFile));
if any(isnan(amocData(:)))
amocData = fillmissing(amocData, 'linear');
end
amocAnnual = mean(reshape(amocData, 12, []), 1);
end
% NSHF 데이터 로드 (NetCDF)
for i = 1:numModels
currentFile = nshfFiles(i).name;
nshfData = ncread(fullfile(folderPath, currentFile), 'nshf');
if any(isnan(nshfData(:)))
nshfData = fillmissing(nshfData, 'linear', 'EndValues', 'nearest');
end
end
데이터 스무딩¶
10년 이동평균으로 노이즈 제거.
windowSize = 10; % 10년
for i = 1:numModels
amocAnnual = mean(reshape(amocData, 12, []), 1);
amocSmoothed = movmean(amocAnnual, windowSize);
plot(1980:2060, amocSmoothed);
end
분석/모델링¶
Grid별 상관계수 계산¶
correlations = zeros(31, 121);
pValues = zeros(31, 121);
for lat = 1:31
for lon = 1:121
nshfAvg = squeeze(mean(nshfAnnualMeans(lat, lon, :), 1));
[R, P] = corrcoef(nshfAvg, amocTrends);
correlations(lat, lon) = R(1, 2);
pValues(lat, lon) = P(1, 2);
end
end
% 유의수준 0.05 이하 지역 표시
figure;
imagesc(pValues < 0.05);
colormap([1 1 1; 0 0 0]);
title('Significant Correlations (p < 0.05)');
변화량 계산 (1990-2050)¶
장기 추세 분석을 위해 10년 단위 평균 변화량 계산.
decadeLength = 10;
startYear = 1990;
endYear = 2050;
damoc = zeros(numModels, 1);
dnshf = zeros(121, 31, numModels);
dWind = zeros(121, 31, numModels);
for i = 1:numModels
% AMOC 변화량
amoc_data = load(fullfile(folderPath, amocFiles(i).name));
startDecadeMean = mean(amoc_data((startYear-1980):(startYear-1980+decadeLength-1)));
endDecadeMean = mean(amoc_data((endYear-1980-decadeLength+1):(endYear-1980)));
damoc(i) = endDecadeMean - startDecadeMean;
% NSHF 변화량
nshfData = ncread(nshfPath, 'nshf');
startYearIndex = (startYear - 1980) * 12 + 1;
endYearIndex = (endYear - 1980) * 12;
startNshf = mean(nshfData(:, :, startYearIndex:startYearIndex + decadeLength*12 - 1), 3);
endNshf = mean(nshfData(:, :, endYearIndex - decadeLength*12 + 1:endYearIndex), 3);
dnshf(:, :, i) = endNshf - startNshf;
end
고상관 지역 식별¶
상관계수 |r| >= 0.6인 지역 추출.
high_corr_indices = [];
for lat = 1:31
for lon = 1:121
dnshf_squeeze = squeeze(dnshf(lon, lat, :));
corr_value = corr(dnshf_squeeze, damoc, 'Rows', 'complete');
if abs(corr_value) >= 0.6
high_corr_indices = [high_corr_indices; [lon, lat]];
end
end
end
% 라브라도 해역: r ≈ -0.8로 가장 강한 상관성
라브라도 해역 분석¶
% 라브라도 해역의 NSHF 평균
avg_nshf_high_corr = zeros(numModels, 1);
for i = 1:numModels
nshf_values = [];
for idx = 1:size(high_corr_indices, 1)
lon = high_corr_indices(idx, 1);
lat = high_corr_indices(idx, 2);
nshf_values = [nshf_values, dnshf(lon, lat, i)];
end
avg_nshf_high_corr(i) = mean(nshf_values);
end
% 회귀분석
p = polyfit(avg_nshf_high_corr, damoc, 1);
fprintf('Regression Line: y = %.2fx + %.2f\n', p(1), p(2));
풍속-NSHF-AMOC 관계 분석¶
% 풍속 변화와 NSHF 변화 상관관계
correlation_matrix_wind_nshf = zeros(31, 121);
for lat = 1:31
for lon = 1:121
wind_changes = squeeze(dWind(lon, lat, :));
nshf_changes = squeeze(dnshf(lon, lat, :));
validIdx = ~isnan(wind_changes) & ~isnan(nshf_changes);
if any(validIdx)
correlation_matrix_wind_nshf(lat, lon) = ...
corr(wind_changes(validIdx), nshf_changes(validIdx));
end
end
end
결과¶
주요 발견¶
- AMOC-NSHF 역상관: 북대서양에서 유의미한 상관 패턴 확인
- 라브라도 해역 중요성: 상관계수 r ≈ -0.8로 가장 강한 상관성
- 풍속 영향: 라브라도 해역에서 풍속 변화가 NSHF와 AMOC에 유의미한 영향
물리적 해석¶
라브라도 해역은 심층수 형성의 주요 지역으로, 이 지역의 열 플럭스 변화가 AMOC 전체에 영향.
주의사항¶
- 인과관계 해석 주의: 상관관계가 인과관계를 의미하지 않음
- 양방향 피드백: AMOC 약화 → 해수 온도 하강 → 대기로부터 열 흡수 증가
- 차원 축소 영향: 2차원→1차원 축소 시 상관계수 과대평가 가능
- Time-lag 고려: 시차 상관분석(lag correlation) 추가 필요
추가 분석 필요 사항¶
- Bulk Surface Evaporation Equation 활용
- Sensible Heat Flux (SHF), Latent Heat Flux (LHF) 개별 분석
- 시차 상관분석으로 선행/후행 관계 규명
배운 점¶
- NetCDF 데이터 처리: 다차원 기후 데이터 효율적 처리
- 공간 상관분석: Grid별 상관계수 계산 및 매핑
- 복합 시스템 이해: 대기-해양 상호작용의 복잡성
- 피드백 메커니즘: 일방향 해석의 위험성, 양방향 피드백 고려 필요
- 시차 분석: 기후 시스템에서 time-lag의 중요성
기술 스택¶
| 분류 | 도구 |
|---|---|
| 언어 | MATLAB |
| 데이터 | NetCDF (.nc), txt |
| 함수 | ncread, corrcoef, polyfit, movmean |
| 시각화 | imagesc, scatter, plot |
| 분석 | 상관분석, 회귀분석, 이동평균 |