R语言~T检验

文章目录

引入:

r 复制代码
t.test(mpg ~ I(cyl == 4), data = mtcars)

分解理解:

  1. I(cyl == 4)

    • 创建一个逻辑向量:4缸车为TRUE,其他为FALSE
    • 在mtcars中:4缸车 vs (6缸车 + 8缸车)
  2. mpg ~ I(cyl == 4)

    • 公式形式:将mpg按上述分组进行比较
  3. 实际比较的是

    • 组1:4缸车 (TRUE)
    • 组2:6缸车 + 8缸车 (FALSE)

注意

这不是真正的"4缸 vs 6缸车"比较,因为:

  • 包含了8缸车在第二组中
  • 实际上比较的是"4缸车 vs 非4缸车"

修改(4缸 vs 6缸车)

方法1:筛选数据

r 复制代码
# 只保留4缸和6缸车
data_46 <- mtcars[mtcars$cyl %in% c(4, 6), ]
t.test(mpg ~ cyl, data = data_46)

方法2:使用subset参数

r 复制代码
t.test(mpg ~ cyl, data = mtcars, subset = cyl %in% c(4, 6))

方法3:直接向量比较

r 复制代码
mpg_4 <- mtcars$mpg[mtcars$cyl == 4]
mpg_6 <- mtcars$mpg[mtcars$cyl == 6]
t.test(mpg_4, mpg_6)

结果差异

  • 原代码:比较4缸车 vs (6缸+8缸车),两组样本量差异大
  • 修改后代码:只比较4缸车 vs 6缸车,结果更准确

验证示例

r 复制代码
# 查看各组数量
table(mtcars$cyl)
#  4  6  8 
# 11  7 14 

# 原代码的分组
table(I(mtcars$cyl == 4))
# FALSE  TRUE 
#    21    11 

# 修改后的分组(只包含4和6缸)
table(mtcars$cyl[mtcars$cyl %in% c(4,6)])
#  4  6 
# 11  7 

t检验详解及R语言实现

什么是t检验?

t检验是一种统计假设检验方法,用于比较两个群体的均值是否存在显著差异。它基于t分布,适用于小样本情况。

t检验的三种主要类型

1. 单样本t检验

检验单个样本的均值是否与已知的总体均值有显著差异。

R语言代码:

r 复制代码
# 生成示例数据
set.seed(123)
sample_data <- rnorm(30, mean = 100, sd = 15)

# 单样本t检验:检验均值是否为100
t.test(sample_data, mu = 100)

# 检验均值是否为105
t.test(sample_data, mu = 105)

# 获取详细结果
result <- t.test(sample_data, mu = 100)
cat("t值:", result$statistic, "\n")
cat("p值:", result$p.value, "\n")
cat("置信区间:", result$conf.int, "\n")
cat("样本均值:", result$estimate, "\n")

2. 独立样本t检验

比较两个独立样本的均值是否有显著差异。

R语言代码:

r 复制代码
# 生成两个独立样本
set.seed(123)
group1 <- rnorm(25, mean = 50, sd = 10)
group2 <- rnorm(30, mean = 55, sd = 10)

# 基本独立样本t检验
t.test(group1, group2)

# 假设方差相等
t.test(group1, group2, var.equal = TRUE)

# 单侧检验(检验group1是否小于group2)
t.test(group1, group2, alternative = "less")

# 使用数据框格式
data <- data.frame(
  value = c(group1, group2),
  group = rep(c("A", "B"), c(25, 30))
)
t.test(value ~ group, data = data)

3. 配对样本t检验

比较同一组受试者在两种不同条件下的差异。

R语言代码:

r 复制代码
# 生成配对数据(如治疗前后)
set.seed(123)
before <- rnorm(20, mean = 70, sd = 8)
after <- before + rnorm(20, mean = 5, sd = 3)  # 治疗后有所改善

# 配对t检验
t.test(before, after, paired = TRUE)

# 另一种写法:直接检验差值
difference <- after - before
t.test(difference, mu = 0)

# 可视化配对数据
plot(1:20, before, type = "b", col = "red", ylim = c(60, 85),
     xlab = "受试者", ylab = "测量值", main = "治疗前后对比")
lines(1:20, after, type = "b", col = "blue")
legend("topright", legend = c("治疗前", "治疗后"), 
       col = c("red", "blue"), lty = 1)

实际案例:mtcars数据集分析

案例1:不同气缸数的油耗比较

r 复制代码
# 4缸 vs 8缸车的mpg比较
data_48 <- mtcars[mtcars$cyl %in% c(4, 8), ]
t.test(mpg ~ cyl, data = data_48)

# 可视化
boxplot(mpg ~ cyl, data = data_48, 
        main = "不同气缸数的油耗比较",
        xlab = "气缸数", ylab = "MPG")

案例2:自动挡 vs 手动挡的油耗

r 复制代码
# 按变速箱类型分组
t.test(mpg ~ am, data = mtcars)

# 添加分组标签
mtcars$transmission <- ifelse(mtcars$am == 0, "自动", "手动")
boxplot(mpg ~ transmission, data = mtcars,
        main = "变速箱类型对油耗的影响",
        xlab = "变速箱类型", ylab = "MPG")

t检验的假设条件

  1. 正态性:数据应近似正态分布
  2. 独立性:观测值之间相互独立
  3. 方差齐性:两独立样本的方差应相等(可使用方差齐性检验)

检验假设条件的R代码:

r 复制代码
# 正态性检验
shapiro.test(mtcars$mpg)

# 方差齐性检验
var.test(mpg ~ cyl, data = data_48)

# 当方差不等时使用Welch校正
t.test(mpg ~ cyl, data = data_48, var.equal = FALSE)

非参数替代方法

当数据不满足t检验假设时,可以使用非参数检验:

r 复制代码
# Wilcoxon秩和检验(Mann-Whitney U检验)
wilcox.test(mpg ~ cyl, data = data_48)

# 配对样本的Wilcoxon符号秩检验
wilcox.test(before, after, paired = TRUE)

结果解释要点

  • p值 < 0.05:拒绝原假设,认为均值存在显著差异
  • 置信区间:如果不包含0,说明差异显著
  • 效应量:衡量差异的大小程度
r 复制代码
# 计算效应量(Cohen's d)
library(effectsize)
cohens_d(mpg ~ cyl, data = data_48)

注意事项

  1. 多重比较问题:进行多个检验时需要校正p值
  2. 样本量:小样本时检验效能较低
  3. 异常值:对异常值敏感,需要检查数据
  4. 实际意义:统计显著不等于实际重要

t检验是统计分析中的基础工具,正确理解和应用t检验对于数据分析和科学研究至关重要。

相关推荐
预测模型的开发与应用研究3 小时前
从入门到实操:贝叶斯分析完整技术步骤与核心R包指南
开发语言·人工智能·r语言
j七七3 小时前
5分钟搭微信自动回复机器人5分钟搭微信自动回复机器人
运维·服务器·开发语言·前端·python·微信
豐儀麟阁贵3 小时前
5.5类的主方法
java·开发语言
Hs_QY_FX3 小时前
幸福指数数据分析与预测:从数据预处理到模型构建完整案例
开发语言·python·机器学习
似水এ᭄往昔4 小时前
【C++】--list的使用和模拟实现
开发语言·c++
程序员大雄学编程4 小时前
「用Python来学微积分」18. 微分
开发语言·python·数学·微积分
我命由我123454 小时前
PDFBox - PDF 页面坐标系、PDF 页面尺寸获取、PDF 页面位置计算
java·服务器·开发语言·笔记·后端·java-ee·pdf
小苏兮4 小时前
【数据结构】二叉搜索树
开发语言·数据结构·c++·学习·1024程序员节
ᐇ9594 小时前
Java 程序运行原理与内存模型解析
java·开发语言