我做了一些计算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)
3条答案
按热度按时间y1aodyip1#
NumPy有一个内置的方差函数。指定
ddof=1
使用分母N-1,给出样本方差。还有一个内置的sum
。ejk8hzay2#
正如Julien Marrec提到的,我建议对CronbachAlpha进行以下重构:
cclgggtu3#
和其他答案一样,只是有点像Python。
X
是一个数据矩阵--也就是说,行是样本,列是项。X
可以是一个numpy数组或PandasDataFrame。(It不需要指定
ddof
,因为该项出现在分母和分子中,并被取消。)