Intraclass Correlation in Python Module?

前端 未结 5 1358
抹茶落季
抹茶落季 2021-02-07 14:19

I\'m looking to calculate intraclass correlation (ICC) in Python. I haven\'t been able to find an existing module that has this feature. Is there an alternate name, or should I

5条回答
  •  傲寒
    傲寒 (楼主)
    2021-02-07 15:18

    Based on Brain_Data, I modified the code in order to calculate the correlation coefficients ICC(2,1), ICC(2,k), ICC(3,1) or ICC(3,k) for data input as a table Y (subjects in rows and repeated measurements in columns).

    import os
    import numpy as np
    from numpy import ones, kron, mean, eye, hstack, dot, tile
    from numpy.linalg import pinv
    
    def icc(Y, icc_type='ICC(2,1)'):
        ''' Calculate intraclass correlation coefficient
    
        ICC Formulas are based on:
        Shrout, P. E., & Fleiss, J. L. (1979). Intraclass correlations: uses in
        assessing rater reliability. Psychological bulletin, 86(2), 420.
        icc1:  x_ij = mu + beta_j + w_ij
        icc2/3:  x_ij = mu + alpha_i + beta_j + (ab)_ij + epsilon_ij
        Code modifed from nipype algorithms.icc
        https://github.com/nipy/nipype/blob/master/nipype/algorithms/icc.py
    
        Args:
            Y: The data Y are entered as a 'table' ie. subjects are in rows and repeated
                measures in columns
            icc_type: type of ICC to calculate. (ICC(2,1), ICC(2,k), ICC(3,1), ICC(3,k)) 
        Returns:
            ICC: (np.array) intraclass correlation coefficient
        '''
    
        [n, k] = Y.shape
    
        # Degrees of Freedom
        dfc = k - 1
        dfe = (n - 1) * (k-1)
        dfr = n - 1
    
        # Sum Square Total
        mean_Y = np.mean(Y)
        SST = ((Y - mean_Y) ** 2).sum()
    
        # create the design matrix for the different levels
        x = np.kron(np.eye(k), np.ones((n, 1)))  # sessions
        x0 = np.tile(np.eye(n), (k, 1))  # subjects
        X = np.hstack([x, x0])
    
        # Sum Square Error
        predicted_Y = np.dot(np.dot(np.dot(X, np.linalg.pinv(np.dot(X.T, X))),
                                    X.T), Y.flatten('F'))
        residuals = Y.flatten('F') - predicted_Y
        SSE = (residuals ** 2).sum()
    
        MSE = SSE / dfe
    
        # Sum square column effect - between colums
        SSC = ((np.mean(Y, 0) - mean_Y) ** 2).sum() * n
        MSC = SSC / dfc  # / n (without n in SPSS results)
    
        # Sum Square subject effect - between rows/subjects
        SSR = SST - SSC - SSE
        MSR = SSR / dfr
    
        if icc_type == 'icc1':
            # ICC(2,1) = (mean square subject - mean square error) /
            # (mean square subject + (k-1)*mean square error +
            # k*(mean square columns - mean square error)/n)
            # ICC = (MSR - MSRW) / (MSR + (k-1) * MSRW)
            NotImplementedError("This method isn't implemented yet.")
    
        elif icc_type == 'ICC(2,1)' or icc_type == 'ICC(2,k)':
            # ICC(2,1) = (mean square subject - mean square error) /
            # (mean square subject + (k-1)*mean square error +
            # k*(mean square columns - mean square error)/n)
            if icc_type == 'ICC(2,k)':
                k = 1
            ICC = (MSR - MSE) / (MSR + (k-1) * MSE + k * (MSC - MSE) / n)
    
        elif icc_type == 'ICC(3,1)' or icc_type == 'ICC(3,k)':
            # ICC(3,1) = (mean square subject - mean square error) /
            # (mean square subject + (k-1)*mean square error)
            if icc_type == 'ICC(3,k)':
                k = 1
            ICC = (MSR - MSE) / (MSR + (k-1) * MSE)
    
        return ICC
    

提交回复
热议问题