本文已参加「新人创作礼」活动,一起开启掘金创作之路。
这次带来的是 RStudio 的统计模型 - 变量关联性。
各个知识点后面都有对应的小练习哦,大家可以利用刚刚学到的知识来试着写写看!
两个变量之间的关系
两个变量之间如果具有明确的数学表达式, 那我们就可以用函数/数学模型来描述它们.
而现实中的大多数情况是: 我们并不知道这个函数是什么, 甚至也不确定它们之间是否存在明确的关系
这时我们对这两个变量之间的关系的研究经常是基于相关性分析的.
两个变量是否相关, 是数据分析中经常考虑的问题, 其结论(相关/不相关)将为如何建立数学/统计模型提供依据.
- 两个随机事件的相关与独立
-
两个类别型随机变量之间的独立性
-
两个连续型随机变量之间的相关性
-
linear correlation 线性相关性
- linear correlation coefficient 线性相关系数:
- linear correlation coefficient of samples 样本的线性相关系数:
- sample variance 样本方差:
- sample covariance 样本协方差:
-
线性相关系数的假设检验
-
检验结果怎么看
-
如何抽取结果中的重要信息
# --- 两个类别型随机变量之间的独立性 ---
# 钻石的cut 和 color
table(dia_a$cut, dia_a$color)
cc = dia_a %>%
filter(cut %in% c("Ideal","Premium"), color %in% c("D","J")) %>%
mutate(cut = as.character(cut), color = as.character(color))
table(cc$cut, cc$color)
table(cc$cut, cc$color) %>% chisq.test()
# --- 两个连续型随机变量之间的相关性 ---
# sample variance
# sample covariance
# 编写一个函数 svar(x), 用于计算 sample variance
# 编写一个函数 scvar(x, y), 用于计算 sample covariance
plot(dist ~ speed, data=cars)
# 用 R自带的函数 var, sd, cov 计算数据集cars中speed和dist之间的线性相关系数
var(cars$speed)
sd(cars$speed)
var(cars$dist)
sd(cars$dist)
cov(cars$speed, cars$dist)
cov(cars$speed, cars$dist) / (sd(cars$speed) * sd(cars$dist))
# R自带的函数 cor
cor(cars$speed, cars$dist)
# 协方差矩阵 和 相关系数矩阵
cov(cars)
cor(cars)
# cor(x, y = NULL, use = "everything",
# method = c("pearson", "kendall", "spearman"))
# x, y 必须是同样长度的一维向量
# 或者 x 必须是一个二维矩阵/数据框
# Pearson's product moment correlation coefficient
# The coefficient follows a t distribution with length(x)-2 degrees of freedom if the samples follow independent normal distributions
# cor.test(x, y,
# alternative = c("two.sided", "less", "greater"),
# method = c("pearson", "kendall", "spearman"),
# exact = NULL, conf.level = 0.95, continuity = FALSE, ...)
# cor.test(formula, data, subset, na.action, ...)
# 原假设 Null hypothesis : 相关系数为0
# 备择假设 Alternative hypothesis : 相关系数不为0
cor.test(cars$speed, cars$dist)
cor.test(~ speed+dist, data=cars)
# 输出结果怎么看?
# 最简单的看法: alternative + p-value
# 如何抽取检验结果中的重要信息?
ct = cor.test(cars$speed, cars$dist)
str(ct)
ct$statistic
练习
# Q1
# 编写两个函数 pvar(x), svar(x), 用于计算 population variance 和 sample variance
# Q2
# 编写两个函数 pcov(x, y), scov(x, y), 用于计算 population covariance 和 sample covariance
习题
# Q1
# dia_a 数据集中, 钻石的price跟carat是正相关的吗?
# Q2
# dia_a 数据集中, 每个color分组中, 钻石的price跟carat都是正相关的吗?
# 思考如何用dplyr配合cor.test 来得到答案
Hypothesis test 假设检验
在上一节中, 我们使用了 cor.test 来检验两个变量之间的线性相关性是否显著. 这里体现了一种现代统计中非常重要的思想: 假设检验
假设检验的思想与步骤:
- 收集相关数据(一次实验)
- 建立两个假设: 原假设(Null Hypothesis) 和 备择假设(Alternative Hypothesis), 两者是互斥的
- 基于“原假设是正确的”这一前提, 计算出现“目前的数据”的概率
- 评估这个概率是否足够小, 足够小就否定原假设(意味着接受备择假设)
理解这个思想
- 本质是根据“观察到的现象”反推“其前提是否合理”;
- 计算出的p-value足够小, 到底意味着什么?
- 计算出的p-value比较大, 到底意味着什么?
常见的假设检验
- 单总体的均值检验
- 两总体的均值检验
- 相关性检验
- 两总体的方差检验
- 多总体的方差检验
# 均值的假设检验
# t.test(x, y = NULL,
# alternative = c("two.sided", "less", "greater"),
# mu = 0, paired = FALSE, var.equal = FALSE,
# conf.level = 0.95, ...)
# t.test(formula, data, subset, na.action, ...)
# 单总体的均值检验
# 根据样本数据, 检验总体的均值是否等于mu /大于mu / 小于mu
t.test(mtcars$mpg, mu=20)
t.test(mtcars$mpg, mu=25)
t.test(mtcars$mpg, mu=15)
t.test(mtcars$mpg, mu=20, alternative="greater")
t.test(mtcars$mpg, mu=25, alternative="greater")
t.test(mtcars$mpg, mu=15, alternative="greater")
t.test(mtcars$mpg, mu=20, alternative="less")
t.test(mtcars$mpg, mu=25, alternative="less")
t.test(mtcars$mpg, mu=15, alternative="less")
# 两总体的均值检验
# 四缸车的mpg和六缸车的mpg是否相等
t.test(mtcars$mpg[mtcars$cyl==4], mtcars$mpg[mtcars$cyl==6])
# 相关性检验
# 分类型变量
M = as.table(rbind(c(762, 327, 468), c(484, 239, 477)))
dimnames(M) = list(gender = c("F","M"),
party = c("Democrat","Independent","Republican"))
chisq.test(M)
# 连续型变量
cor.test(~ dist+speed, data=cars)
练习
# Q1
# 检验: 六缸车的mpg是否大于16 ?
# Q2
# 检验: 八缸车的mpg是否小于六缸车的mpg ?
习题
# Q1
# 计算出的p-value足够小, 到底意味着什么?
# Q2
# 计算出的p-value比较大, 到底意味着什么?
# Q3
# 编程练习
# 凯撒密码是一种古老的加密系统,它通过将字母按照固定的间隔移动变成密文来加密,现在要求写一个函数 caesar = function(text, k) 可返回密文
# 其中 text是明文, k是指定的间隔
# 并要求可以用同一个函数来解密