ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

抽样调查课后答案怎么用?分层与多阶段抽样方差估计的代码复现与避坑指南

抽样调查课后答案怎么用?分层与多阶段抽样方差估计的代码复现与避坑指南 简介这份资源是冯士雍《抽样调查理论与方法》第二版的课后习题参考答案面向统计学、数学及相关专业的学生与备考人员用于核对课后练习、梳理抽样调查的核心概念与计算思路。内容覆盖随机原则、概率估计、总体与样本、抽样误差与置信区间、分层抽样、系统抽样、整群抽样、多阶段抽样、比估计与回归估计、方差分析等章节要点并配有填空、单项选择与简答题的完整解答便于对照教材逐章复习。资源包共1个doc文件约192KB以文档形式集中呈现全部答案结构紧凑、便于检索与打印。目前已有3228人学习下载适合需要系统巩固抽样理论、查漏补缺或准备课程考核的读者参考使用。1. 抽样调查课后答案怎么用从对答案到真正吃透分层与多阶段抽样很多人拿到《抽样调查理论与方法-第二版-冯士雍》这本教材第一反应是去搜课后答案想快速核对习题结果。但真正做过抽样项目的人都知道这本书的价值不在答案本身而在于它把分层抽样、整群抽样、多阶段抽样、比率估计、回归估计这些方法背后的方差公式和样本量分配逻辑讲透了。课后答案如果只用来对数字基本等于浪费。它真正该起的作用是帮你验证自己对方差推导、估计量构造、自由度计算的理解是否到位。这篇笔记面向两类人一是正在学这门课、被习题卡住的学生二是工作中需要设计抽样方案、但对方差估计和样本分配没把握的从业者。我会按“理论怎么立住、公式怎么落地、代码怎么复现、坑在哪”这条线把这本书里最核心的几类题型拆开讲清楚。2. 分层抽样习题的复现路径从比例分配到 Neyman 分配2.1 先分清估计量类型再谈答案对不对冯士雍这本书里分层抽样的习题最容易让人翻车的地方不是计算而是估计量选错。分层随机抽样中总体均值估计量分两种一种是按层权加权另一种是先算各层均值再按 (W_h) 加权。教材里通常用后者[ \bar{y}{st}\sum{h1}^{L} W_h \bar{y}_h ]其中 (W_hN_h/N) 是层权(\bar{y}_h) 是第 (h) 层的样本均值。很多课后答案只给最终数值不写中间量导致你根本不知道自己错在层权算错还是方差算错。我的习惯是先把每层的 (N_h)、(n_h)、(\bar{y}_h)、(s_h^2) 列成表再代公式。这样即使答案对不上也能定位到具体哪一层。方差估计量为[ \hat{V}(\bar{y}{st})\sum{h1}^{L} W_h^2 \left(1-\frac{n_h}{N_h}\right)\frac{s_h^2}{n_h} ]这里 (1-n_h/N_h) 是有限总体校正系数。教材习题里经常给 (N_h) 很大、(n_h) 很小的情况这时校正系数接近 1但考试和实际项目中都不能随便省略尤其是层内抽样比超过 5% 时。2.2 比例分配、最优分配和 Neyman 分配的代码实现下面这段 Python 代码把三种分配方式放在一起对比输入是各层的 (N_h) 和 (S_h)总体层标准差未知时用样本 (s_h) 代替输出是各层样本量和对应的方差估计。import numpy as np def stratified_allocation(N_h, S_h, n_total, methodneyman): N_h: 各层总体单元数list 或 np.array S_h: 各层总体标准差估计list 或 np.array n_total: 总样本量 method: proportional | neyman | optimal N_h np.array(N_h, dtypefloat) S_h np.array(S_h, dtypefloat) W_h N_h / N_h.sum() if method proportional: # 比例分配n_h n * W_h n_h n_total * W_h elif method neyman: # Neyman 分配n_h 正比于 N_h * S_h n_h n_total * (N_h * S_h) / np.sum(N_h * S_h) elif method optimal: # 最优分配考虑费用n_h 正比于 N_h * S_h / sqrt(c_h) # 这里假设每层费用 c_h 相同退化为 Neyman n_h n_total * (N_h * S_h) / np.sum(N_h * S_h) else: raise ValueError(method 必须是 proportional / neyman / optimal) # 取整并保证每层至少 2 个样本方差估计需要 n_h np.maximum(np.round(n_h).astype(int), 2) # 调整使总和等于 n_total diff n_total - n_h.sum() if diff ! 0: # 按小数部分大小调整 frac n_total * (N_h * S_h) / np.sum(N_h * S_h) - np.floor(n_total * (N_h * S_h) / np.sum(N_h * S_h)) order np.argsort(-frac) for i in range(abs(diff)): idx order[i % len(order)] n_h[idx] 1 if diff 0 else -1 return n_h # 示例三层总体 N_h [5000, 3000, 2000] S_h [10, 20, 30] n_total 300 for m in [proportional, neyman]: n_h stratified_allocation(N_h, S_h, n_total, methodm) print(m, n_h, 总和:, n_h.sum())这段代码的关键参数是S_h。教材习题里有时直接给总体标准差有时只给样本标准差后者需要你自己判断是否可以用 (s_h) 代替 (S_h)。当层内样本量小于 30 时用 (s_h) 代替 (S_h) 会引入额外误差Neyman 分配的结果会偏。我的做法是如果习题明确说“根据预调查”或“根据历史资料”就用给定的 (S_h)如果只给一组样本先算 (s_h)再在答案里注明这是估计值。比例分配和 Neyman 分配的差别在考试里经常考比例分配只依赖 (W_h)Neyman 分配还依赖 (S_h)。当各层标准差差异大时Neyman 分配能显著降低方差。教材里有一道经典题三层 (N_h) 相同但 (S_h) 分别为 1、2、3Neyman 分配下样本量比例约为 1:2:3而比例分配是 1:1:1。课后答案如果只给一个总数你根本看不出这个差别。2.3 用教材习题验证一道分层抽样题的完整复现假设教材某题给出(N_11000, N_22000, N_33000)(n_120, n_230, n_350)样本均值 (\bar{y}_110, \bar{y}_212, \bar{y}_315)样本方差 (s_1^24, s_2^29, s_3^216)。要求总体均值估计和方差估计。手工计算步骤层权(W_11000/60000.1667)(W_20.3333)(W_30.5)估计值(\bar{y}_{st}0.1667\times100.3333\times120.5\times151.66747.513.167)方差每层 (W_h^2(1-n_h/N_h)s_h^2/n_h)第1层(0.0278\times(1-0.02)\times4/200.0278\times0.98\times0.20.00545)第2层(0.1111\times(1-0.015)\times9/300.1111\times0.985\times0.30.0328)第3层(0.25\times(1-0.0167)\times16/500.25\times0.9833\times0.320.0787)合计(0.005450.03280.07870.1169)标准差(\sqrt{0.1169}0.342)用代码验证W np.array([1000, 2000, 3000]) / 6000 y_bar np.array([10, 12, 15]) s2 np.array([4, 9, 16]) n np.array([20, 30, 50]) N np.array([1000, 2000, 3000]) y_st np.sum(W * y_bar) var_st np.sum(W**2 * (1 - n/N) * s2 / n) print(估计值:, y_st) print(方差:, var_st, 标准差:, np.sqrt(var_st))输出与手工一致。如果你手里的课后答案方差是 0.12 或 0.11大概率是某层校正系数漏乘或层权算错。这种题在教材里反复出现练三遍就能形成肌肉记忆。3. 多阶段抽样与整群抽样方差公式怎么不翻车3.1 多阶段抽样的方差分解逻辑多阶段抽样是这本书的难点也是实际项目中最常用的设计。教材里通常以两阶段抽样为例第一阶段抽初级单元PSU第二阶段从抽中的 PSU 中抽次级单元SSU。总体均值估计量还是加权平均但方差要分两部分初级单元之间的方差和初级单元内部的方差。对于两阶段抽样当第一阶段用简单随机抽样抽 (n) 个 PSU第二阶段在每个抽中的 PSU 中抽 (m_i) 个 SSU总体均值估计量为[ \bar{y} \frac{1}{n}\sum_{i1}^{n} \bar{y}_i ]其中 (\bar{y}_i) 是第 (i) 个 PSU 的样本均值。方差估计量为[ \hat{V}(\bar{y}) \left(1-\frac{n}{N}\right)\frac{s_b^2}{n} \frac{1}{nN}\sum_{i1}^{n}\left(1-\frac{m_i}{M_i}\right)\frac{s_i^2}{m_i} ]这里 (s_b^2) 是 PSU 均值的样本方差(s_i^2) 是第 (i) 个 PSU 内部的样本方差。教材习题经常给一个两阶段抽样的数据表要求你算这个方差。很多人只算了第一项漏掉第二项答案就偏小。3.2 整群抽样为什么容易把方差算小整群抽样可以看作多阶段抽样的特例抽中群后调查群内所有单元。这时第二阶段抽样比 (m_i/M_i1)第二项消失方差只取决于群间方差。但整群抽样的设计效应通常大于 1因为群内单元往往相似。教材里有一道经典题群内相关系数 (\rho) 越大整群抽样的方差越大。课后答案如果只给方差数值不解释设计效应你很难理解为什么同样的样本量整群抽样比简单随机抽样精度低。我的经验是做整群抽样习题时先算群间方差 (s_b^2)再算设计效应 (deff 1(M-1)\rho)其中 (M) 是群大小(\rho) 是群内相关系数。如果题目没给 (\rho)可以用方差分析估计(\rho (MSB-MSW)/(MSB(M-1)MSW))。这个公式在教材的方差分析章节有推导但很多课后答案直接跳过。3.3 用 Python 复现两阶段抽样方差下面代码模拟一个两阶段抽样数据集并计算方差估计。import numpy as np # 模拟N100 个 PSU抽 n10 个每个 PSU 有 M50 个 SSU抽 m10 个 np.random.seed(42) N, n 100, 10 M, m 50, 10 # 生成 PSU 均值存在群间差异 psu_means np.random.normal(50, 5, N) # 抽中的 PSU selected_psu np.random.choice(N, n, replaceFalse) # 每个抽中 PSU 内生成 SSU 数据 data [] for i in selected_psu: ssu np.random.normal(psu_means[i], 10, m) data.append(ssu) # 计算 y_bar_i np.array([d.mean() for d in data]) s_i2 np.array([d.var(ddof1) for d in data]) y_bar y_bar_i.mean() s_b2 y_bar_i.var(ddof1) # 方差估计 term1 (1 - n/N) * s_b2 / n term2 np.sum((1 - m/M) * s_i2 / m) / (n * N) var_est term1 term2 print(总体均值估计:, y_bar) print(第一项PSU间:, term1) print(第二项PSU内:, term2) print(总方差:, var_est, 标准差:, np.sqrt(var_est))这段代码的关键是term2的分母是 (nN)不是 (n)。教材里有些习题答案把第二项写成 (\frac{1}{n}\sum(1-m_i/M_i)s_i^2/m_i)这是错的因为那样会重复计算 PSU 的权重。正确的做法是第二项要除以 (N)因为每个 PSU 代表 (N/n) 个未抽中的 PSU。这个细节在课后答案里经常被忽略导致方差偏大。4. 比率估计与回归估计课后答案里最容易被省略的偏差项4.1 比率估计的近似方差什么时候不能用比率估计量 (\hat{R}\bar{y}/\bar{x}) 在教材里通常给近似方差[ \hat{V}(\hat{R}) \approx \frac{1-f}{n\bar{X}^2}(s_y^2 - 2\hat{R}s_{xy} \hat{R}^2 s_x^2) ]其中 (fn/N)(\bar{X}) 是辅助变量总体均值。这个公式成立的前提是样本量足够大使得 (\hat{R}) 的偏差可以忽略。教材习题里经常给 (n20) 甚至更小的数据这时近似方差会偏小。课后答案如果直接套这个公式你算出来的置信区间会偏窄。我的做法是当 (n30) 或 (CV(x)) 大于 0.1 时改用 bootstrap 估计方差。下面代码对比近似公式和 bootstrap 的结果。import numpy as np np.random.seed(0) N 1000 n 20 # 模拟总体 X np.random.gamma(2, 10, N) Y 2 * X np.random.normal(0, 5, N) # 抽样本 idx np.random.choice(N, n, replaceFalse) x, y X[idx], Y[idx] # 近似方差 R_hat y.mean() / x.mean() f n / N X_bar X.mean() s_y2 y.var(ddof1) s_x2 x.var(ddof1) s_xy np.cov(x, y, ddof1)[0, 1] var_approx (1 - f) / (n * X_bar**2) * (s_y2 - 2 * R_hat * s_xy R_hat**2 * s_x2) # bootstrap B 2000 R_boot [] for _ in range(B): idx_b np.random.choice(n, n, replaceTrue) R_boot.append(y[idx_b].mean() / x[idx_b].mean()) var_boot np.var(R_boot, ddof1) print(R_hat:, R_hat) print(近似方差:, var_approx, 标准差:, np.sqrt(var_approx)) print(bootstrap 方差:, var_boot, 标准差:, np.sqrt(var_boot))运行后你会发现当 (n20) 时bootstrap 标准差通常比近似公式大 10% 到 30%。教材习题如果只要求“计算比率估计的方差”你可以用近似公式但如果题目问“构造置信区间”最好用 bootstrap 或至少注明近似公式的局限性。4.2 回归估计中回归系数怎么定回归估计量 (\bar{y}_{lr}\bar{y}\beta(\bar{X}-\bar{x})) 中(\beta) 通常取总体回归系数。教材习题里有时给 (\beta) 的估计值有时要求你用样本回归系数 (b)。当 (b) 由样本估计时方差公式要加一项修正[ \hat{V}(\bar{y}{lr}) \approx \frac{1-f}{n}s{y\cdot x}^2 ]其中 (s_{y\cdot x}^2) 是残差方差。很多课后答案直接用 (s_y^2(1-r^2))这在 (n) 较大时没问题但 (n) 小时会低估。我的习惯是先算残差再算残差方差最后代公式。这样即使答案对不上也能看出是 (r^2) 算错还是残差自由度用错。5. 避坑与排查抽样调查习题里最常见的 5 个翻车点5.1 现象方差算出来是负数原因有限总体校正系数 (1-n_h/N_h) 在 (n_hN_h) 时变成负数或者层权 (W_h) 算错导致平方项异常。教材习题里有时给 (n_h) 大于 (N_h) 的荒谬数据这是印刷错误但如果你没检查就代公式会得到负方差。解决先检查每层 (n_h \le N_h)再检查 (W_h) 之和是否为 1。如果数据本身矛盾在答案里注明“按题意数据存在矛盾以下按 (n_hN_h) 处理”。5.2 现象多阶段抽样方差比简单随机抽样还小原因漏掉了第二阶段方差项或者把第一阶段的 (s_b^2) 算成了总体方差而不是 PSU 均值的方差。教材里有一道题PSU 均值差异很小但 PSU 内部差异很大如果只算第一项方差会小得离谱。解决画一个方差分解表把第一项和第二项分别列出来。如果第二项占比超过 50%说明群内差异主导整群抽样效率低答案里要体现这个结论。5.3 现象比率估计的置信区间不覆盖真值原因近似方差在小样本下偏小或者 (\bar{X}) 用了样本均值而不是总体均值。教材习题里经常给总体均值 (\bar{X})但做题时容易顺手用 (\bar{x})。解决把 (\bar{X}) 和 (\bar{x}) 分两行写代公式时明确用哪个。如果题目没给 (\bar{X})只能用 (\bar{x})但要在答案里说明这是近似。5.4 现象样本量分配后取整导致总和不对原因Neyman 分配算出小数后四舍五入可能使总和偏离 (n)。教材答案有时直接给小数有时给整数但不说明调整方法。解决用最大余数法调整保证每层至少 2 个样本。上面代码里的stratified_allocation已经处理了这个问题。如果手工做先把小数部分排序从大到小补 1 或减 1。5.5 现象整群抽样的设计效应算出来小于 1原因群内相关系数 (\rho) 算错或者用了错误的方差分析表。教材里 (\rho) 的公式是 (\rho (MSB-MSW)/(MSB(M-1)MSW))如果 (MSBMSW)(\rho) 为负设计效应可能小于 1。这在群内单元负相关时会出现但实际数据中很少见。解决检查方差分析表的自由度。(MSB) 的自由度是 (n-1)(MSW) 的自由度是 (n(M-1))。如果自由度用错(\rho) 会失真。6. 用 R 语言交叉验证把课后答案变成可复现的抽样实验教材里的习题大多是手工计算但实际项目中你会用 R 或 Python 的 survey 包。我的习惯是每做一道重要习题就用 R 的survey包复现一遍看看设计效应和方差估计是否一致。这样既能验证答案又能积累代码模板。下面是一个用 R 做分层随机抽样并计算方差的最小例子library(survey) # 构造数据三层每层有 N_h 和样本 set.seed(123) data - data.frame( stratum rep(c(A, B, C), times c(20, 30, 50)), y c(rnorm(20, 10, 2), rnorm(30, 12, 3), rnorm(50, 15, 4)) ) # 指定分层设计N_h 为总体层大小 N_h - c(A 1000, B 2000, C 3000) design - svydesign( id ~1, strata ~stratum, data data, fpc ~N_h[stratum] # 有限总体校正 ) # 估计总体均值 est - svymean(~y, design) print(est) print(confint(est)) # 设计效应 deff - degf(design) print(deff)这段 R 代码的关键是fpc参数。教材习题里经常省略有限总体校正但survey包默认会加。如果你用fpc指定了 (N_h)svymean输出的标准误就是校正后的。对比手工计算和 R 输出如果差异超过 1%说明手工计算某一步有问题。我还会用svyby按层输出均值检查每层的估计是否和手工一致svyby(~y, ~stratum, design, svymean)这个命令会输出每层的均值和标准误。如果某层的标准误和手工算的 (s_h/\sqrt{n_h}) 差很多检查是否漏了 (1-n_h/N_h)。最后一个技巧把教材里所有分层抽样习题的参数整理成一个 CSV用 R 批量跑一遍把结果和课后答案对比。差异超过 5% 的题目标红重点排查。这个习惯帮我发现过好几处教材答案的印刷错误也让我对抽样方差的理解从“套公式”变成了“看数据”。希望帮到你。本文还有配套的精品资源点击获取
返回列表