You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从大样本选取60个观测值得到正态分布及代码正确性验证

问题解答

一、你提供的代码存在明显错误

这段代码完全不符合你的需求,问题出在两点:

  1. rnorm()用法错误:rnorm()的第一个参数是要生成的随机数总个数,你传入seq(1,60,1)会生成1+2+...+60=1830个随机数,而不是你需要的60个。哪怕改成rnorm(n=60, mean=mean(vars), sd=sd(vars)),也只是生成和原数据同均值、标准差的全新正态随机数,和你手里的vars观测值没有任何关联。
  2. 偏离核心需求:你的目标是从已有的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:02:51