设Cronbach系数为alpha,则
式中,k为用于测量的题目数,![]()
![]()
为第i个题目得分(测量值)的方差,![]()
![]()
为量表总得分的方差。
方差计算公式
计算![]()
![]()
时,先算出每一列的平均值,然后算每一列的方差,最后把所有列的方差加在一起即为
![]()
。
计算![]()
![]()
时,先算出量表中每一行的总分,把这个总分当作一个数据,把所有行的总分放在一起,组成新的数据集。对这个新的数据集计算平均值和方差,最后得到的方差即为![]()
![]()
。
若量表中某一行有缺失值,则在计算时忽略这一行的数据,只计算没有缺失值的有效行。
计算代码:
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int Max_Cnt = 55;
double d[Max_Cnt][Max_Cnt];
double col_ave[Max_Cnt], col_var[Max_Cnt], col_sum[Max_Cnt], std_dev[Max_Cnt], row_sum[Max_Cnt], row_ave[Max_Cnt];
const int row = 27;
const int col = 52; //行和列的值根据自己的要求自行调整
int main() {
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
memset(col_ave, 0, sizeof(col_ave));
memset(col_var, 0, sizeof(col_var));
memset(col_sum, 0, sizeof(col_sum));
memset(row_sum, 0, sizeof(row_sum));
double sum = 0;
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
scanf("%lf", &d[i][j]);
sum += d[i][j];
col_sum[j] += d[i][j];
row_sum[i] += d[i][j];
}
}
double row_ave = sum / row;
double row_var = 0;
for(int i = 0; i < row; i++)
row_var += (row_sum[i] - row_ave) * (row_sum[i] - row_ave);
row_var /= (row - 1);
double row_std_dev = sqrt(row_var);
printf("row_ave = %lf, row_var = %lf, row_std_dev = %lf\n", row_ave, row_var, row_std_dev);
for(int i = 0; i < col; i++)
col_ave[i] = col_sum[i] / row;
for(int i = 0; i < col; i++) {
for(int j = 0; j < row; j++) {
col_var[i] += (d[j][i] - col_ave[i]) * (d[j][i] - col_ave[i]);
}
}
for(int i = 0; i < col; i++) {
col_var[i] /= (row - 1);
std_dev[i] = sqrt(col_var[i]);
}
double var_sum = 0;
for(int i = 0; i < col; i++)
var_sum += col_var[i];
double alpha = col * (1 - (var_sum / row_var)) / (col - 1);
printf("alpha = %lf\n", alpha);
for(int i = 0; i < col; i++)
printf("ave[%d] = %lf, var[%d] = %lf, std_dev[%d] = %lf\n", i + 1, col_ave[i], i + 1, col_var[i], i+1, std_dev[i]);
return 0;
}