<br><br><div class="gmail_quote">On Tue, Jan 19, 2010 at 1:47 PM, Gael Varoquaux <span dir="ltr"><<a href="mailto:gael.varoquaux@normalesup.org">gael.varoquaux@normalesup.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">On Tue, Jan 19, 2010 at 02:22:30PM -0600, Robert Kern wrote:<br>
> > y = y - np.dot(confounds.T, linalg.lstsq(confounds.T, y)[0])<br>
<br>
> > with np = numpy and linalg = scipy.linalg where scipy calls ATLAS.<br>
<br>
> For clarification, are you trying to find the components of the y<br>
> vectors that are perpendicular to the space spanned by the 10<br>
> orthonormal vectors in confounds?<br>
<br>
</div>Yes. Actually, what I am doing is calculating partial correlation between<br>
x and y conditionally to confounds, with the following code:<br>
<br>
def cond_partial_cor(y, x, confounds=[]):<br>
    """ Returns the partial correlation of y and x, conditionning on<br>
        confounds.<br>
    """<br>
    # First orthogonalise y and x relative to confounds<br>
    if len(confounds):<br>
<div class="im">        y = y - np.dot(confounds.T, linalg.lstsq(confounds.T, y)[0])<br>
</div>        x = x - np.dot(confounds.T, linalg.lstsq(confounds.T, x)[0])<br>
    return np.dot(x, y)/sqrt(np.dot(y, y)*np.dot(x, x))<br>
<br>
I am not sure that what I am doing is optimal.<br>
<div class="im"><br>
> > Most of the time is spent in linalg.lstsq. The length of the vectors is<br>
> > 810, and there are about 10 confounds.<br>
<br>
> Exactly what are the shapes? y.shape = (810, N); confounds.shape = (810, 10)?<br>
<br>
</div>Sorry, I should have been more precise:<br>
<br>
y.shape = (810, )<br>
confounds.shape = (10, 810)<br>
<br></blockquote><div><br>Column stack the bunch so that the last column is y, then do a qr decomposition. The last column of q is the (normalized) orthogonal vector and its amplitude is the last (bottom right) component of r.<br>
<br>Chuck  <br></div><br></div>