二维分布的列联表分析
立即解锁
发布时间: 2025-08-21 02:03:55 阅读量: 1 订阅数: 6 


C语言中的数值计算艺术:科学计算必备指南
### 二维分布的列联表分析
在数据分析中,我们常常会遇到需要研究两个分布之间关联的情况。每个数据点可能关联着两个或更多不同的量,我们想知道了解其中一个量是否能在预测另一个量的值时提供明显的优势。接下来,我们将深入探讨如何衡量两个分布之间的关联。
#### 变量类型
不同类型的变量在数据分析中有着不同的作用,我们可以将变量分为以下几类:
- **名义变量**:其值属于某个无序集合。例如,“居住州”(在美国有 50 个取值);在天体物理学中,“星系类型”有“螺旋”“椭圆”和“不规则”三种取值。
- **顺序变量**:其值属于离散但有序的集合。比如学校的年级、行星离太阳的顺序(水星 = 1,金星 = 2,依此类推)、后代数量等。顺序变量的值之间不需要有“相等的度量距离”概念,只需内在有序即可。
- **连续变量**:其值为实数,如时间、距离、温度等。社会科学家有时会区分区间连续变量和比率连续变量,但这种区分并非十分必要。
连续变量可以通过分箱转化为顺序变量,如果忽略分箱的顺序,还能进一步转化为名义变量。名义变量是变量层次结构中最基础、最通用的类型。例如,一组连续或顺序变量可以通过粗略分箱,将每个不同的分箱组合作为一个名义值,从而转化为一个单一的名义变量。当多维数据稀疏时,这往往是唯一可行的处理方法。
#### 列联表分析
对于任意一对名义变量,数据可以用列联表展示。列联表的行由一个名义变量的值标记,列由另一个名义变量的值标记,表中的条目为非负整数,表示每个行和列组合的观测事件数量。下面是一个关于性别和颜色两个名义变量的列联表示例:
| | 红色 | 绿色 | 总计 |
| --- | --- | --- | --- |
| 男性 | \(N_{11}\) | \(N_{12}\) | \(N_{1\cdot}\) |
| 女性 | \(N_{21}\) | \(N_{22}\) | \(N_{2\cdot}\) |
| 总计 | \(N_{\cdot1}\) | \(N_{\cdot2}\) | \(N\) |
名义变量之间关联的分析称为列联表分析或交叉表分析。我们将介绍两种不同的方法:
- **基于卡方统计量的方法**:能很好地刻画关联的显著性,但作为关联强度的度量效果一般,主要是因为其数值没有非常直接的解释。
- **基于熵的信息论概念的方法**:对关联的显著性没有任何说明(显著性用卡方统计量衡量),但能非常优雅地刻画已知显著关联的强度。
#### 基于卡方统计量的关联度量
在介绍具体方法之前,我们先明确一些符号:
- \(N_{ij}\):表示第一个变量 \(x\) 取第 \(i\) 个值,第二个变量 \(y\) 取第 \(j\) 个值时发生的事件数量。
- \(N\):所有 \(N_{ij}\) 的总和,即事件的总数。
- \(N_{i\cdot}\):表示第一个变量 \(x\) 取第 \(i\) 个值时的事件数量,无论 \(y\) 取何值。
- \(N_{\cdot j}\):表示第二个变量 \(y\) 取第 \(j\) 个值时的事件数量,无论 \(x\) 取何值。
我们有以下关系:
\[
\begin{align*}
N_{i\cdot}&=\sum_{j}N_{ij}\\
N_{\cdot j}&=\sum_{i}N_{ij}\\
N&=\sum_{i}N_{i\cdot}=\sum_{j}N_{\cdot j}
\end{align*}
\]
零假设是两个变量 \(x\) 和 \(y\) 没有关联。在这种情况下,给定 \(y\) 的某个特定值时 \(x\) 取某个特定值的概率,应与不考虑 \(y\) 时 \(x\) 取该值的概率相同。因此,在零假设下,任何 \(N_{ij}\) 的期望数量 \(n_{ij}\) 可以仅根据行和列的总和计算得出:
\[n_{ij}=\frac{N_{i\cdot}N_{\cdot j}}{N}\]
如果某一列或某一行的总和为零,则该列或该行中所有条目的期望数量也为零,此时应将 \(x\) 或 \(y\) 中从未出现的类别从分析中移除。
卡方统计量由以下公式给出:
\[\chi^{2}=\sum_{i,j}\frac{(N_{ij}-n_{ij})^{2}}{n_{ij}}\]
自由度等于列联表中条目的数量(行数与列数的乘积)减去由于使用数据本身来确定 \(n_{ij}\) 而产生的约束数量。每个行总和和列总和都是一个约束,但会多计算一个,因为列总和的总和与行总和的总和都等于 \(N\)(数据点的总数)。因此,如果列联表的大小为 \(I\times J\),则自由度为 \(IJ - I - J + 1\)。结合卡方概率函数,我们可以得到变量 \(x\) 和 \(y\) 之间关联的显著性。
若存在显著关联,我们如何量化其强度以便比较不同关联的强度呢?思路是对 \(\chi^{2}\) 进行重新参数化,将其映射到一个方便的区间,如 \(0\) 到 \(1\),使得结果不依赖于我们碰巧采样的数据量,而仅取决于数据所来自的总体。常见的两种方法是 Cramer's V 和列联系数 \(C\):
- **Cramer's V**:公式为
\[V = \sqrt{\frac{\chi^{2}}{N\min(I - 1, J - 1)}}\]
其中 \(I\) 和 \(J\) 分别是行数和列数,\(N\) 是事件的总数。Cramer's V 的取值范围在 \(0\) 到 \(1\) 之间,\(0\) 表示无关联,\(1\) 表示完全关联(即任何一行的所有事件都位于一个唯一的列中,反之亦然)。当 \(I = J = 2\) 时,Cramer's V 也称为 phi 统计量。
- **列联系数 \(C\)**:定义为
\[C = \sqrt{\frac{\chi^{2}}{\chi^{2} + N}}\]
其取值也在 \(0\) 到 \(1\) 之间,但无法达到上限。虽然可以用于比较具有相同 \(I\) 和 \(J\) 的两个列联表的关联强度,但其上限取决于 \(I\) 和 \(J\),因此不能用于比较不同大小的列联表。
下面是一个计算卡方统计量、自由度、显著性水平以及 Cramer's V 和列联系数 \(C\) 的 C 语言代码:
```c
#include <math.h>
#include "nrutil.h"
#define TINY 1.0e-30
// A small number.
void cntab1(int **nn, int ni, int nj, float *chisq, float *df, float *prob,
float *cramrv, float *ccc)
{
float gammq(float a, float x);
int nnj, nni, j, i, minij;
float sum = 0.0, expctd, *sumi, *sumj, temp;
sumi = vector(1, ni);
sumj = vector(1, nj);
nni = ni; // Number of rows
nnj = nj; // and columns.
for (i = 1; i <= ni; i++)
{
// Get the row totals.
sumi[i] = 0.0;
for (j = 1; j <= nj; j++)
{
sumi[i] += nn[i][j];
sum += nn[i][j];
}
if (sumi[i] == 0.0)
--nni; // Eliminate any zero rows by reducing the num-
// ber.
}
for (j = 1; j <= nj; j++)
{
// Get the column totals.
sumj[j] = 0.0;
for (i = 1; i <= ni; i++)
sumj[j] += nn[i][j];
if (sumj[j] ==
```
0
0
复制全文
相关推荐










