Can i get Pearson R value out of xcorr()

조회 수: 14 (최근 30일)
Mike Wilson
Mike Wilson 2016년 5월 15일
댓글: Mike Wilson 2016년 5월 15일
I am trying to compare vectors that sample across two spatial fields. One is divergence in wind field. Other is rainfall intensity. There appears to be a correlation in the two fields but with a notable spatial lag between peak value in one sample vector and peak value in the other. We want to quantify this and xcorr would seem to be the logical choice.
If I am interpreting the docs for xcorr correctly, it gives us the cross correlation between the two curves at every possible offset. In our case, the offset is spatial vs. temporal, but that should not matter?
The result we generate is confusing. We do get a reasonable lag value from xcorr, but the correlation values do not make sense to us. In particular, they are not the expected Pearson's R values in range between -1 and 1.
As a baseline test we run xcorr comparing one of our curves to itself. We do get the expected 0 value for lag, but the correlation value generated at zero lag is also near zero. In that case what we'd expect would be perfect correlation of 1.0.
When we run the same tests using the MATLAB corr and corrcoef functions, we do get the expected 1.0 value. We could use either of those functions for our testing, but neither accounts for the spatial lag in our input vectors.
So the questions: 1) what is xcorr generating for its correlation values, and 2) is there some way to get xcorr to generate standard Pearson Product Moment Correlation (R) values?
Mike Wilson

채택된 답변

Wayne King
Wayne King 2016년 5월 15일
Hi Mike, if the vectors are the same length, then you can use the 'coeff' option to give you values between -1 and 1
dt = 0.001;
t = 0:dt:2;
x = cos(2*pi*100*t)+0.1*randn(size(t));
y = cos(2*pi*100*t-pi)+0.05*randn(size(t));
[xc,lags] = xcorr(x,y,200,'coeff');
If you are dealing with zero-mean signals (remove the mean), then you will find that the value of xcorr() with the 'coeff' option at zero lag is very close to the result obtained with say, corr(), in MATLAB.
x = randn(16,1);
y = randn(16,1);
x = detrend(x,0);
y = detrend(y,0);
[xc,lags] = xcorr(x,y,1,'coeff');
rho = corr(x,y);
  댓글 수: 1
Mike Wilson
Mike Wilson 2016년 5월 15일
Excellent! Yes, vectors are same length. My tests of the 'coeff' option were early on and I did not interpret the result correctly. I thought I was getting a normalized value (forced to max of 1.0).
Thanks very much Wayne.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)


Help CenterFile Exchange에서 Correlation and Convolution에 대해 자세히 알아보기


Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by