我制作了一些计算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)
答案 0 :(得分:6)
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
内置。
答案 1 :(得分:1)
与其他答案相同,只是更加 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
,因为该术语出现在分母和分子中,并取消。)
答案 2 :(得分:0)
正如朱利安·马雷克(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)))