【问题标题】:Improving performance of Cronbach Alpha code python numpy提高 Cronbach Alpha 代码 python numpy 的性能
【发布时间】:2013-12-27 10:54:46
【问题描述】:

我编写了一些代码来计算有效的 Cronbach Alpha。但我不太擅长使用 lambda 函数。有没有办法通过使用 lambda 而不是 svar() 函数来减少代码并提高效率,并通过使用 numpy 数组来摆脱一些 for 循环?

import numpy as np


def svar(X):
    n = float(len(X))
    svar=(sum([(x-np.mean(X))**2 for x in X]) / n)* n/(n-1.)
    return svar


def CronbachAlpha(itemscores):
    itemvars = [svar(item) for item in itemscores]
    tscores = [0] * len(itemscores[0])
    for item in itemscores:
       for i in range(len(item)):
          tscores[i]+= item[i]
    nitems = len(itemscores)
    #print "total scores=", tscores, 'number of items=', nitems

    Calpha=nitems/(nitems-1.) * (1-sum(itemvars)/ svar(tscores))

    return Calpha

###########Test################
itemscores = [[ 4,14,3,3,23,4,52,3,33,3],
              [ 5,14,4,3,24,5,55,4,15,3]]
print "Cronbach alpha = ", CronbachAlpha(itemscores)

【问题讨论】:

  • 为什么 lambdas 会在这里提供帮助?
  • 对于任何对为什么它总是返回接近 1.0 感到非常困惑的人,您必须注意这里的 itemcores 是 n*p,其中 n(每行)是项目(一个问题),并且p(每列)是您的主题的答案。如果您像我一样使用熊猫,那么您很可能将每一行作为受访者,每一列作为项目。所以要使用这个函数,你需要转置dataframe或者修改函数。另请注意,在 Python 2.7 中,您需要从未来导入除法或将分母括在 float()

标签: python performance numpy


【解决方案1】:
def CronbachAlpha(itemscores):
    itemscores = numpy.asarray(itemscores)
    itemvars = itemscores.var(axis=1, ddof=1)
    tscores = itemscores.sum(axis=0)
    nitems = len(itemscores)

    return nitems / (nitems-1.) * (1 - itemvars.sum() / tscores.var(ddof=1))

NumPy 具有内置的方差函数。指定ddof=1 使用 N-1 的分母,给出样本方差。还有一个 sum 内置函数。

【讨论】:

【解决方案2】:

正如 Julien Marrec 提到的,我建议对 CronbachAlpha 进行以下重构:

def CronbachAlpha(itemscores):
    # cols are items, rows are observations
    itemscores = np.asarray(itemscores)
    itemvars = itemscores.var(axis=0, ddof=1)
    tscores = itemscores.sum(axis=1)
    nitems = len(itemscores.columns)

    return (nitems / (nitems-1)) * (1 - (itemvars.sum() / tscores.var(ddof=1)))

【讨论】:

    【解决方案3】:

    与其他答案相同,只是更 Pythonic。 X 是一个数据矩阵——也就是说,行是样本,列是项目。 X 可能是一个 numpy 数组或 pandas DataFrame。

    def cronbach_alpha(X):
        num_items = X.shape[1]
        sum_of_item_variances = X.var(axis=0).sum()
        variance_of_sum_of_items = X.sum(axis=1).var()
        return num_items/(num_items - 1)*(1 - sum_of_item_variances/variance_of_sum_of_items)
    

    (不必指定ddof,因为该术语出现在分母和分子中,并取消。)

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2020-08-16
      • 1970-01-01
      • 2023-02-15
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多