def _update_x_transforms(self):
        """
        Compute a new set of x-transform functions phik.

        phik(xk) = theta(y) - sum of phii(xi) over i!=k

        This is the first of the eponymous conditional expectations. The conditional
        expectations are computed using the SuperSmoother.
        """
        # start by subtracting all transforms
        theta_minus_phis = self.y_transform - numpy.sum(self.x_transforms, axis=0)

        # add one transform at a time so as to exclude it from the subtracted sum
        for xtransform_index in range(len(self.x_transforms)):
            xtransform = self.x_transforms[xtransform_index]
            sorted_data_indices = self._xi_sorted[xtransform_index]
            xk_sorted = sort_vector(self.x[xtransform_index], sorted_data_indices)
            xtransform_sorted = sort_vector(xtransform, sorted_data_indices)
            theta_minus_phis_sorted = sort_vector(theta_minus_phis, sorted_data_indices)

            # minimize sums by just adding in the phik where i!=k here.
            to_smooth = theta_minus_phis_sorted + xtransform_sorted

            smoother = perform_smooth(xk_sorted, to_smooth, smoother_cls=self._smoother_cls)
            updated_x_transform_smooth = smoother.smooth_result
            updated_x_transform_smooth -= numpy.mean(updated_x_transform_smooth)

            # store updated transform in the order of the original data
            unsorted_xt = unsort_vector(updated_x_transform_smooth, sorted_data_indices)
            self.x_transforms[xtransform_index] = unsorted_xt

            # update main expession with new smooth. This was done in the original FORTRAN
            tmp_unsorted = unsort_vector(to_smooth, sorted_data_indices)
            theta_minus_phis = tmp_unsorted - unsorted_xt
Compute a new set of x-transform functions phik.

        phik(xk) = theta(y) - sum of phii(xi) over i!=k

        This is the first of the eponymous conditional expectations. The conditional
        expectations are computed using the SuperSmoother.