连续型变量
墙裂推荐!统计方法如何选以及全代码作图实现。果子老师这篇帖子比较完整的介绍了如何用R实现两组及多组连续型变量比较的方法。
下面我将简要补充如何用R进行分类变量的分析和回归分析,以满足日常的统计需求。
分类变量
一、2 x 2 联表 (四格表资料 )
卡方检验
卡方检验是一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。
一般用于比较两组间发病率是否具有统计学差异,也可以用于模型拟合优度的检验。
使用卡方检验应满足的3个假设:
- 存在两个二分类变量,如下文的甲/乙和发病/未发病
- 具有相互独立的观测值
- 样本量>40,任一单元格样本理论频数>5
#1.列表
como <- as.table(cbind(c(52,39),c(19,3)))
dimnames(como) <- list(c('甲','乙'),c('发病','未发病'))
> como
发病 未发病
甲 52 19
乙 39 3
#2.结果
> chisq.test(como)
Pearson's Chi-squared test with Yates' continuity correction
data: como
X-squared = 5.2868, df = 1, p-value = 0.02149
#可以看到R自带校正
#不校正
> chisq.test(como,correct = F)
Pearson's Chi-squared test'
data: como
X-squared = 6.4777, df = 1, p-value = 0.01092
Fisher精确检验
上述的所有理论频数均>5,且n>40,故不用校正;当n>40,且有理论频数1 n>40,且理论频数小于5的单元格数目<总单元格数目的25%,则用普通的Pearson 检验;n<40,或理论数小于5的格子数目>总格子数目的25%,则用Fisher’s确切概率法检验。 方法:列表后使用 n>40,且理论频数小于5的单元格数目<总单元格数目的25%,则用普通的Pearson 检验;n<40,或理论数小于5的格子数目>总格子数目的25%,则用Fisher’s确切概率法检验;如果要作相关性分析,可采用Pearson相关系数。 数据是一个列联表,包含13项家庭任务及其在夫妇中的分布情况 行×列表卡方检验注意事项: 独立性卡方检验检查列联表的行和列是否在统计学上显著相关。 这里使用的是卡方检验 正的残差用蓝色表示,单元格中的正值代表对应的行和列变量之间正相关;负残差用红色表示,代表对应的行和列变量之间负相关。 每个单元格对总卡方值的相对贡献可以说明列联表行与列之间的相关性。 确切概率法是由R.A.Fisher于1934年提出的,是基于超几何分布 (hypergeometric distribution) 理论直接计算拒绝零假设的概率的。它的基本思想是:在行列合计数固定不变的条件下,计算表内频数各种组合的概率Pi,P值就是出现当前值以及更极端情况 的概率,以四格表为例:|交叉积差| ≥ |当前交叉积差| 且 Pi ≤ 当前Pi)。因此,基于Fisher确切概率法的思想,P值是可以直接计算的,并不依赖卡方分布,所以,Fisher确切概率法不会有卡方值。 不是很理解... 待续... 【笔记】卡方检验概述 Chi-Square Test of Independence in R 3.Chi-square Goodness of Fit Test in R 4.Fisher确切概率法也有卡方统计量? 5.Fisher确切概率法公式的由来como <- as.table(cbind(c(26,36),c(7,2)))
dimnames(como) <- list(c('甲','乙'),c('发病','未发病'))
como
chisq <- chisq.test(como)
chisq$expected
#单元格理论值
> chisq$expected
发病 未发病
甲 28.8169 4.183099
乙 33.1831 4.816901
>chisq
Pearson's Chi-squared test with Yates' continuity correction
data: como
X-squared = 2.7457, df = 1, p-value = 0.09751
Warning message:
In chisq.test(como) : Chi-squared近似算法有可能不准
#R提示卡方检验不准确
#使用Fisher确切概率法
> fisher.test(como)
Fisher's' Exact Test for Count Data
data: como
p-value = 0.07179
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.01983918 1.22769111
sample estimates:
odds ratio
0.2108198
二、2 x C 与 R x 2
chisq.test
或fisher.test
。# 2 x C
como <- as.table(cbind(c(26,13),c(10,2),c(21,3)))
dimnames(como) <- list(c('甲','乙'),c('发病','未发病','治疗'))
> como
发病 未发病 治疗
甲 26 10 21
乙 13 2 3
#
chisq <- chisq.test(como)
Warning message:
In chisq.test(como) : Chi-squared近似算法有可能不准
> chisq
Pearson's' Chi-squared test #
data: como
X-squared = 3.9565, df = 2, p-value = 0.1383
#看下理论值
> chisq$expected
发病 未发病 治疗
甲 29.64 9.12 18.24
乙 9.36 2.88 5.76
#只有一个单元格 < 5,R也会提示卡方检验不准
> fisher.test(como)
Fisher's' Exact Test for Count Data
data: como
p-value = 0.1695
alternative hypothesis: two.sided
# R x 2
como <- as.table(cbind(c(26,13,8),c(10,21,3)))
dimnames(como) <- list(c('甲','乙','丙'),c('发病','未发病'))
> como
发病 未发病
甲 26 10
乙 13 21
丙 8 3
> chisq <- chisq.test(como)
Warning message:
In chisq.test(como) : Chi-squared近似算法有可能不准
#R提示卡方可能不准,因为有一个单元格理论值 <5
> chisq$expected
发病 未发病
甲 20.888889 15.111111
乙 19.728395 14.271605
丙 6.382716 4.617284
> fisher.test(como)
Fisher's Exact Test for Count Data'
data: como
p-value = 0.009855
alternative hypothesis: two.sided
三、R x C
file_path <- "http://www.sthda.com/sthda/RDoc/data/housetasks.txt"
housetasks <- read.delim(file_path, row.names = 1)
head(housetasks)
Wife Alternating Husband Jointly
Laundry 156 14 2 4
Main_meal 124 20 5 4
Dinner 77 11 7 13
Breakfeast 82 36 15 7
Tidying 53 11 1 57
Dishes 32 24 4 53
卡方检验
1.一般认为行×列表中不宜有1/5以上格子的理论数小于5,或有小于1的理论数。当理论数太小可采取下列方法处理:①增加样本含量以增大理论数;②删去上述理论数太小的行和列;③将太小理论数所在行或列与性质相近的邻行邻列中的实际数合并,使重新计算的理论数增大。由于后两法可能会损失信息,损害样本的随机性,不同的合并方式有可能影响推断结论,故不宜作常规方法。另外,不能把不同性质的实际数合并,如研究血型时,不能把不同的血型资料合并。
2.如检验结果拒绝检验假设,只能认为各总体率或总体构成比之间总的来说有差别,但不能说明它们彼此之间都有差别,或某两者间有差别。
无效假设H0:列联表的行和列变量相互独立;
备择假设H1:行和列变量有关。卡方值 = \[ \chi^2 = \sum{\frac{(o - e)^2}{e}} \]
o 是观测值
e 是理论值
自由度 = \(df = (r - 1)(c - 1)\)
r 行数
c 列数
chisq <- chisq.test(housetasks)
chisq
> chisq
Pearson's Chi-squared test
data: housetasks
X-squared = 1944.5, df = 36, p-value < 2.2e-16
chisq$observed # 观测值
Wife Alternating Husband Jointly
Laundry 156 14 2 4
Main_meal 124 20 5 4
Dinner 77 11 7 13
Breakfeast 82 36 15 7
Tidying 53 11 1 57
Dishes 32 24 4 53
round(chisq$expected,2) # 理论值
Wife Alternating Husband Jointly
Laundry 60.55 25.63 38.45 51.37
Main_meal 52.64 22.28 33.42 44.65
Dinner 37.16 15.73 23.59 31.52
Breakfeast 48.17 20.39 30.58 40.86
Tidying 41.97 17.77 26.65 35.61
Dishes 38.88 16.46 24.69 32.98
#chisq计算的是总卡方值,如果想计算每一个单元格的卡方值,则使用 \[ r = \frac{o - e}{\sqrt{e}} \]
#上述公式计算每个单元格的标准化残差(r)
#标准化残差绝对值最高的单元格对总卡方值贡献最大
round(chisq$residuals, 3)
Wife Alternating Husband Jointly
Laundry 12.266 -2.298 -5.878 -6.609
Main_meal 9.836 -0.484 -4.917 -6.084
Dinner 6.537 -1.192 -3.416 -3.299
Breakfeast 4.875 3.457 -2.818 -5.297
Tidying 1.702 -1.606 -4.969 3.585
#可视化
library(corrplot)
corrplot(chisq$residuals, is.cor = FALSE)
#单元格对总卡方值的贡献度(%)
\[ contrib = \frac{r^2}{\chi^2} \]
contrib <- 100*chisq$residuals^2/chisq$statistic
round(contrib, 3)
Wife Alternating Husband Jointly
Laundry 7.738 0.272 1.777 2.246
Main_meal 4.976 0.012 1.243 1.903
Dinner 2.197 0.073 0.600 0.560
Breakfeast 1.222 0.615 0.408 1.443
Tidying 0.149 0.133 1.270 0.661
Dishes 0.063 0.178 0.891 0.625
corrplot(contrib, is.cor = FALSE)
Fisher确切概率法
#改变一些数据
housetasks[c(1:10),2] <- rep(5,10)
> head(housetasks)
Wife Alternating Husband Jointly
Laundry 156 5 2 4
Main_meal 124 5 5 4
Dinner 77 5 7 13
Breakfeast 82 5 15 7
Tidying 53 5 1 57
Dishes 32 5 4 53
#
chisq <- chisq.test(housetasks)
Warning message:
In chisq.test(housetasks) : Chi-squared近似算法有可能不准
# R提示卡方可能不准,看下理论值
> chisq$expected
Wife Alternating Husband Jointly
Laundry 64.85437 5.944984 41.18252 55.01812
Main_meal 53.59223 4.912621 34.03107 45.46408
Dinner 39.61165 3.631068 25.15340 33.60388
Breakfeast 42.33010 3.880259 26.87961 35.91003
Tidying 45.04854 4.129450 28.60583 38.21618
Dishes 36.50485 3.346278 23.18058 30.96828
#部分单元格理论值 <5,使用Fisher确切概率法
> fisher.test(housetasks)
Error in fisher.test(housetasks) : FEXACT error 501.
The hash table key cannot be computed because the largest key
is larger than the largest representable int.
The algorithm cannot proceed.
Reduce the workspace, consider using 'simulate.p.value=TRUE' or another algorithm.
#出现报错
> fisher.test(housetasks,simulate.p.value=TRUE)
Fisher's' Exact Test for Count Data with simulated p-value (based on 2000 replicates)
data: housetasks
p-value = 0.0004998
alternative hypothesis: two.sided
#为什么呢
待续...回归分析
参考