如何从大样本选取60个观测值得到正态分布及代码正确性验证
问题解答
一、你提供的代码存在明显错误
这段代码完全不符合你的需求,问题出在两点:
rnorm()用法错误:rnorm()的第一个参数是要生成的随机数总个数,你传入seq(1,60,1)会生成1+2+...+60=1830个随机数,而不是你需要的60个。哪怕改成rnorm(n=60, mean=mean(vars), sd=sd(vars)),也只是生成和原数据同均值、标准差的全新正态随机数,和你手里的vars观测值没有任何关联。- 偏离核心需求:你的目标是从已有的
vars观测值里选60个,但这段代码是凭空生成新数据,完全没用到原有的观测值。
二、如何从原数据中选60个观测值近似正态分布
要实现这个目标,得先摸清楚原数据的分布特点,再针对性处理:
1. 先探索原数据的分布情况
先看看原数据本身是否接近正态,有没有拉偏分布的极端值,用以下代码就能快速分析:
# 画直方图直观看分布形态 hist(vars) # QQ图判断是否符合正态分布的趋势 qqnorm(vars) qqline(vars) # Shapiro-Wilk正态性检验(样本量较大时仅作参考) shapiro.test(vars)
从你给出的vars数据来看,里面有1086、1095、1102、1075这类明显偏大的极端值,它们会让整体分布右偏,偏离正态形态。
2. 可选:先剔除极端值
如果想让选中的60个数据更接近正态,可以先把极端值去掉,推荐用四分位距法识别异常值:
# 计算四分位数与四分位距 q1 <- quantile(vars, 0.25) q3 <- quantile(vars, 0.75) iqr <- q3 - q1 # 定义异常值的范围边界 lower_bound <- q1 - 1.5*iqr upper_bound <- q3 + 1.5*iqr # 过滤掉异常值,得到清洗后的数据 vars_clean <- vars[vars >= lower_bound & vars <= upper_bound]
3. 随机选取60个观测值
处理完异常值后(或者直接用原数据),随机抽取60个即可,记得设置随机种子保证结果可重复:
# 设置随机种子,让每次运行选的样本一致 set.seed(123) # 从清洗后的数据里随机选60个(若清洗后数据量≥60) selected_vars <- sample(vars_clean, size=60, replace=FALSE) # 验证选中样本的正态性 hist(selected_vars) qqnorm(selected_vars) qqline(selected_vars) shapiro.test(selected_vars)
如果不想剔除异常值,直接从原vars里随机选60个也可以,但因为原数据有极端值,选中的样本可能仍然偏态,需要看最终的分布检验结果调整。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

