Analysis of Variance 方差分析
title: "Analysis of Variance"
author: '01'
date: "2022-11-23"
output: html_document
editor_options:
markdown:
wrap: 72
library(dplyr)
library(ggplot2)
library(knitr)
library(palmerpenguins)
library(tidyr)
library(ISLR2)
Analysis of Variance 方差分析
Assumptions
- 每个样本服从正态分布。
- 每个样本方差\(\sigma^2\)相同。
- 样本之间相互独立 levels:a factor has many levels.
要做的事情:比较各总体(每个水平下的总体)的均值是否相等
One Way ANOVA
举例:比较三种疗法的好坏 如果是两种,可以使用t test
这里,可以把三种疗法看作3个因子,(因子变量/分类变量),响应变量:治疗效果
Treatment is a between-groups factor with 3 levels.
This model is called one-way ANOVA, bacause there's only one
classification variable.
So this is a one-way between-groups ANOVA.
这里可以看作是独立的,对于其中两组可以做独立T检验。
对于某一种疗法,下面引入一个新的变量------时间。例如:在5周之后做测量,在6个月之后做测量。
Time is within-groups factor with 2 levels.
This model is called one-way within-groups ANOVA. (因为疗法都是一样的)
这里不是独立的,对于其中两组做T检验时,paired=TRUE
如果同时考虑疗法和时间: This model is a two-factor ANOVA.
对于两个因子,可以考虑它们时间是否有交互作用。
Eg. 5种药物
library(tidyverse)
data(cholesterol, package = "multcomp")
plotdata <- cholesterol %>%
group_by(trt) %>%
summarize(n = n(), #n()表示出现系数。
mean = mean(response),
sd = sd(response))
plotdata
ggplot(plotdata, aes(x = trt, y = mean, group = 1)) +
geom_point(size = 3, color = "red") +
geom_line(linetype = "dashed", color = "darkgrey") +
geom_errorbar(aes(ymin = mean - qt(0.975, df = n - 1) * sd / sqrt(n),
ymax = mean + qt(0.975, df = n - 1) * sd / sqrt(n)), width = .1) +
labs(x = "Treatment", y = "Response", title = "Mean plot with 95% confidence interval")
# geom_errorbar()是在算95%的置信区间
One-way ANOVA
fit <- aov(response ~ trt, data = cholesterol)
summary(fit)
原假设:所有方法都一样 备择假设:至少有一个方法不一样
所以此处可以拒绝原假设
stands for sample i in class j.
$\mu$ = 总体的均值
$\alpha_j$ = $\mu_j - \mu$
$K$ = total number of class
$n_j$ = total number of samples in class j
$n$ = total number of samples
$\epsilon_{ij}$ 这里假设是正态的,均值为0,方差相等为$\sigma^2$
$$Y_{ij} = \mu + 0\alpha_1+ ... + 1\alpha_j+...+0\alpha_K + \epsilon+{ij}\]
于是,我们对这样一个模型做linear regression:
\]
当Y属于第j类时,\(X_j\) = 1,否则\(X_j\) = 0
注意在这里\(\mu\)可以直接用总体来估计。 并且\(\sum{\alpha_{ij}} = 0\)
\(\hat b = ( X^T X) X^T Y\)
mean(cholesterol$response)
fit2 <- lm(response - mean(response) ~ 0 + trt, data = cholesterol) #这里的结果表示
fit2 <- lm(response ~ 0 + trt, data = cholesterol) #这里的结果表示:trt1time的效果比平均效果差6.95
fit2 <- lm(response ~ trt, data = cholesterol) #这里的结果表示:截距就是trt1time的疗效。trt1time的结果是5.78,trt2time的结果比trt2time的高3.443
fit2
要验证\(H_0: \alpha_1 = \alpha_2 = \alpha_3 = \alpha_4 = \alpha_5 = 0\)
\(H_1\) = 至少有一个\(\alpha_j\)不为0。
这里可以选择验证\(\sum {\alpha_i^2} = 0\)
\]
它服从卡方分布。 d.f. = K - 1
这里方差未知,需要估计$$\hat \sigma^2 = s^2 = \frac{1}{n-K} \sum \sum (Y_{ij} - \bar Y_{ij})^2 $$它服从卡方分布。
d.f. = n - K
用这两个卡方分布去构造一个F分布的统计量。
说白了就是一开始就想知道$$\frac{1}{\sigma^2}\sum_{j = 1}^{K} n_j (\bar Y.,j - \bar Y ..)^2$$是不是接近0,所以去找了它的分布,然后发现它是一个卡方分布,然后就可以构造求p值
$$$$
我们发现在$$Y = \mu + \alpha_j + \epsilon_{ij}$$
中前两项是已知的,最后一项可以生成,所以我们可以生成Y,
\(sdf\)
Eg. two-way factorial ANOVA
data(ToothGrowth)
ToothGrowth$dose <- factor(ToothGrowth$dose) # what happens if we remove this line?
stats <- ToothGrowth %>%
group_by(supp, dose) %>%
summarize(n = n(),
mean = mean(len),
sd = sd(len),
std.error = sd/sqrt(n))
stats
fit1 <- aov(len ~ supp * dose, data = ToothGrowth)
summary(fit1)
fit2 <- aov(len ~ supp + dose, data = ToothGrowth)
summary(fit2)
注意:把dose看作double和把dose看作一个因子,得到的是有差异的。
单因子H_0:所有的alpha都是0 多因子H_0:所有的alpha都是0,
\(y\) supp: \alpha_1 -> OJ, \alpha_2 -> VC dose: \beta_1 -> 0.5,
\beta_2 -> 1 \beta_3 -> 1
\(y_{ijk}\), i-th supp, j-th dose, k-th sample
\(y_{ijk} = \mu + \alpha_i + \beta_j + \epsilon_{ijk}\)
\(\mu + \alpha_1\) 表示OJ维生素的样本的均值
同样假设 \(\epsilon_{ijk} \sim N(0, \sigma^2)\)
\(n_{ij} = 10, i \in (0,2], j \in (0,3]\) the number of samples that take
i-th vitamin and j-th dose
\]
\]
\(H_0: \alpha_1 = \alpha_2 = 0\) \(\alpha_1^2 + \alpha_2^2\) 小即可
即\(\sum_{i=1}^2 (y_i - \bar y)^2\) 就是上面表里的205,sum of square, d.f.
= 2-1 = 1 (\(\alpha_1 + \alpha_2 = 0\)) Residual sum of square:
\(\sum (y_{ijk} - \bar y_{ij.})^2}\)
total sum of square \(\sum_{ijk}(y_{ijk} - \bar y_{...})^2\) d.f. = 60 - 1
= 59,最后residual的那个d.f. = 59 - 1 - 2 = 56.
# validate 交互效应
#y ~ supp + dose + supp:dose
#也就是乘法
同样的剂量和不同的维生素之间是有差异的,
如果没有交互效应,两条线应该是平行的。
data(ToothGrowth)
lm(len ~ supp + dose, data = ToothGrowth)
ToothGrowth$dose = as.double(ToothGrowth$dose)
lm(len ~ supp + dose, data = ToothGrowth)
intercept表示当不用suppVC也不用dose就是9.272
suppVC表示,使用suppVC效果会差3.7
dose表示,固定其他的东西的情况下,多使用一个单位的剂量,效果会好9,764
这里因为factor类型的只有一个supp, 所有条件 if OJ y = 9.272 + 9.764dose
if VC y = 9.272 - 3.700 + 9.764dose
注意如果当dose是分类变量的时候会不一样。会出现dose1,dose2,相应的所有变量的解释会变得不一样。
同时,d.f.也会不一样。
summary: perdictor-response 1. quan-quan :regression 2. cate-quan :
anova 3. mix-quan: anova
Classification
when response is categorical.
\(E(Y|X) = \beta_0 + \beta_1 X\) \(Var(Y|X) = \sigma^2\)
P(Y = 1|X) = \(\beta_0 + \beta_1 X\) P(Y = 0|X)
用线性模型来拟合概率,但是线性模型求出的概率可能为负数。
这时,我们使用logit。 利用logistic function\(y = \frac{e^x}{1+e^x}\)
此时\(P(Y = 1|X) = \frac{e^{\beta_0+\beta_1X}}{1 + e^{\beta_0 + \beta_1 X}}\)
Eg. Default dataset
data(Default)
b <- ggplot(Default[1:1000,],aes(x=balance,y=income))
b + geom_point(aes(color=student))
Eg. IRIS dataset
b <- ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width))
b + geom_point(aes(color=Species))
response variable Y = 1,2,3 它们之间实际上没有顺序关系,不能用线性回归,
Logistic regression
\]
odds = $\frac{p(X)}{1 - p(X)} $
表示划分为一类的概率和划分为另一类的概率之比。
\]
X每增加一个单位,odds就增加\(e^{\beta_1}\)倍。
这里既然涉及概率,用Maximum Likelihood来求解。
联合概率是:\(P(Y_1 = y_1,... Y_n = y_n | X_1,...,X_n) = \Pi_{i=1}^n P(Y_i = y_i | X_i = x_i)\)
其中 if \(y_i = 0\)
\(P(Y_i = y_i | X_i = x_i) = P(Y_i = 0 | X_i = x_i) = 1 - P(Y_i = 1 | X_i = x_i) = 1 - \frac{e^{\beta_0+\beta_1 x_i}}{1+e^{\beta_0+\beta_1 x_i}} = \frac{1}{1+e^{\beta_0+\beta_1 x_i}}\)
if \(y_i = 1\)
\(P(Y_i = y_i | X_i = x_i) = P(Y_i = 0 | X_i = x_i) = 1 - P(Y_i = 1 | X_i = x_i) = 1 - \frac{e^{\beta_0+\beta_1 x_i}}{1+e^{\beta_0+\beta_1 x_i}} = \frac{1}{1+e^{\beta_0+\beta_1 x_i}}\)
\]
没有解析解,只能求数值解,
set.seed(1)
n <- nrow(Default)
relabel <- sample(n,n)
train.index <- relabel[1:9000]
test.index <- relabel[9001:10000]
train.data <- Default[train.index,]
glm.fit <- glm(student~income,data=Default,family="binomial")
glm.fit$coefficients
如果family = "gaussian"就是linear regression
Hypothesis tests
\(H_0: \beta_1 = 0\)
z-score = \(\frac{\hat \beta_1}{SE(\hat \beta_1)}\)
还是想知道\(\beta_1\)的分布,但是只能知道它的渐进分布为正态分布。
summary(glm.fit)
x.new=data.frame(c(10000,40000))
colnames(x.new) = 'income' #要把列名强调好
predict(glm.fit,newdata = x.new,type = "response")
test.data <- Default[test.index,]
glm.prob <- predict(glm.fit,test.data,type="response")
glm.pred <- rep("No",1000)
glm.pred[glm.prob > 0.5] <- "Yes"
table(glm.pred,test.data$student)
mean(glm.pred != test.data$student)
Multiple Logistic Regression
\]
\(\beta_1\)表示固定其他的不变,在X_1增加一个单位时,左边会增大\(e^\{\beta_1}\)倍。
\]
glm.fit2 <- glm(student~balance+income,data=train.data,family='binomial')
glm.fit2$coefficients
summary(glm.fit2)$coef
test.data <- Default[test.index,]
glm.prob2 <- predict(glm.fit2,test.data,type="response")
glm.pred2 <- rep("No",1000)
glm.pred2[glm.prob2 > 0.5] <- "Yes"
table(glm.pred2,test.data$student)
mean(glm.pred2 != test.data$student)
发现增加了一个predictor效果还变差了。需要找个一个评估模型的方法。例如:cross-validation
Multinomial Logistic Regression
library(nnet)
multinom.fit <- multinom(Species ~ ., data=iris,trace = FALSE)
summary(multinom.fit)$coefficients
table(iris$Species,predict(multinom.fit))
Analysis of Variance 方差分析的更多相关文章
- Analysis of variance(ANOVA)
方差分析,也称为"变异数分析",用于两个及两个以上样本均值(group means)差别的显著性检验.在 ANOVA 的环境下,一个观测得到的方差视为是由不同方差的源组合而成.
- Hotelling T2检验和多元方差分析
1.1 Hotelling T2检验 Hotelling T2检验是一种常用多变量检验方法,是单变量检验的自然推广,常用于两组均向量的比较. 设两个含量分析为n,m的样本来自具有公共协方差阵的q维正态 ...
- 方差分析(ANOVA)(转)
转自:http://blog.sciencenet.cn/blog-116082-218338.html 方差分析(analysis of variance,ANOVA),即变量分析,是对多个样本平均 ...
- 方差分析 | ANOVA | 原理 | R代码 | 进阶 | one way and two way
原理 比较两组就用t-test,比较三组及以上就用ANOVA.注意:我们默认说的都是one way ANOVA,也就是对group的分类标准只有一个,比如case和control(ABCD多组),tw ...
- 使用spss做方差分析
还记得上学那会老师专门敲了黑板,强调方差分析很重要..单因素方差分析(Analysis of Variance, ANOVA),如果变量多,就是多因素方差分析,还需要考虑到多重共线性, 也就是线性代数 ...
- 实验的方差分析(R语言)
实验设计与数据处理(大数据分析B中也用到F分布,故总结一下,加深印象)第3课小结--实验的方差分析(one-way analysis of variance) 概述 实验结果\(S\)受多个因素\(A ...
- 方差分析anova
方差分析 参考:http://wiki.mbalib.com/wiki/%E6%96%B9%E5%B7%AE%E5%88%86%E6%9E%90 方差分析(Analysis of Variance, ...
- R in action读书笔记(12)第九章 方差分析
第九章方差分析 9.2 ANOVA 模型拟合 9.2.1 aov()函数 aov(formula, data = NULL, projections =FALSE, qr = TRUE, contra ...
- SAS学习笔记26 方差分析
对于多于两组(k>2)样本均数的比较,t检验不再适用,方差分析(analysis of variance, ANOVA)则是解决上述问题的重要分析方法.方差分析由R.A.Fisher(1923) ...
- 方差分析(python代码实现)
python机器学习-乳腺癌细胞挖掘(欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章) https://study.163.com/course/introduction ...
随机推荐
- 【原创】GmSSL Linux编译, 环境搭建
编译环境: wsl ubuntu 20.04 GmSSL Project 算法相关原理文档 由于GmSSL继承自openssl, 为了防止和openssl冲突,最好将GmsSL 编译为静态库 在Lin ...
- 记录小程序字符串模板渲染WxParse
1.先去https://github.com/icindy/wxParse上downLoad代码,然后直接复制到项目里,跟pages目录同级 2.在要用的js页面声明 var WxParse = re ...
- vue使用阿里oss上传
1.首先用包管理工具 npm install ali-oss --S 下载oss依赖包 2.在util文件里创建util.js文件,在该文件写入 export default { getClient: ...
- SAP transformation特殊字符
unicode 0000 在transformation中总被翻译成,这个转义在其他语法中不存在,所以总是报错.
- 【ASP.NET Core】修改Blazor.Server的Hub地址后引发的问题
Blazor Server,即运行在服务器上的 Blazor 应用程序,它的优点是应用程序在首次运行时,客户端不需要下载运行时.但它的代码是在服务器上执行的,然后通过 SignalR 通信来更新客户端 ...
- Android笔记--案例:找回密码
找回密码 具体实现: 登录成功: 报告密码不同: 报告验证码错误: 代码相关: 找回密码的界面很简单,不细说了,直接写就行 找回密码的逻辑实现: 下一次就去写数据存储啦! 拜拜!
- Dcat admin 多文件上传,七牛云云端上传
进入官网 Dcat Admin - Php后台开发框架 这里要选择1.x 下面来安装框架 安装完laravel之后,需要修改.env文件,设置数据库链接设置正确 安装 dcat-admin comp ...
- 基于.Net开发的、支持多平台、多语言餐厅点餐系统
今天给大家推荐一套支持多平台.多语言版本的订单系统,适合餐厅.酒店等场景. 项目简介 这是基于.Net Framework开发的,支持手机.平板.PC等平台.多语言版本开源的点餐系统,非常适合餐厅.便 ...
- C语言 ini 文件读写【Iniparser库】
一.概述 iniparser是针对INI文件的解析器.ini文件则是一些系统或者软件的配置文件.iniparser库的API可以对ini文件(配置文件)进行解析.设置.删除等操作. 常见的 ini 读 ...
- IO流详解及常用方法
1.1. 什么是IO流 IO流: Input/Output Stream 流: 指的是一串流动的数据, 在数据在流中按照指定的方向进行流动. 实现数据的读取.写入的功能. 1.2. IO流的使用场景 ...