用R语言满足日常统计需求

连续型变量

墙裂推荐!统计方法如何选以及全代码作图实现。果子老师这篇帖子比较完整的介绍了如何用R实现两组及多组连续型变量比较的方法。

连续型变量的比较方法

下面我将简要补充如何用R进行分类变量的分析和回归分析,以满足日常的统计需求。

分类变量

一、2 x 2 联表 (四格表资料 )

卡方检验

卡方检验是一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。
一般用于比较两组间发病率是否具有统计学差异,也可以用于模型拟合优度的检验。

使用卡方检验应满足的3个假设:

  1. 存在两个二分类变量,如下文的甲/乙和发病/未发病
  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<T<5时,应使用Fisher精确检验或者校正后的卡方检验;当n<40,或者有T<2时,只能用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

n>40,且理论频数小于5的单元格数目<总单元格数目的25%,则用普通的Pearson 检验;n<40,或理论数小于5的格子数目>总格子数目的25%,则用Fisher’s确切概率法检验。

方法:列表后使用chisq.testfisher.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

n>40,且理论频数小于5的单元格数目<总单元格数目的25%,则用普通的Pearson 检验;n<40,或理论数小于5的格子数目>总格子数目的25%,则用Fisher’s确切概率法检验;如果要作相关性分析,可采用Pearson相关系数。

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

数据是一个列联表,包含13项家庭任务及其在夫妇中的分布情况

卡方检验

行×列表卡方检验注意事项:
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)
image.png

正的残差用蓝色表示,单元格中的正值代表对应的行和列变量之间正相关;负残差用红色表示,代表对应的行和列变量之间负相关。

#单元格对总卡方值的贡献度(%)
\[ 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)
image.png

每个单元格对总卡方值的相对贡献可以说明列联表行与列之间的相关性。

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
#为什么呢

确切概率法是由R.A.Fisher于1934年提出的,是基于超几何分布 (hypergeometric distribution) 理论直接计算拒绝零假设的概率的。它的基本思想是:在行列合计数固定不变的条件下,计算表内频数各种组合的概率Pi,P值就是出现当前值以及更极端情况 的概率,以四格表为例:|交叉积差| ≥ |当前交叉积差| 且 Pi ≤ 当前Pi)。因此,基于Fisher确切概率法的思想,P值是可以直接计算的,并不依赖卡方分布,所以,Fisher确切概率法不会有卡方值。

不是很理解...
待续...

回归分析

待续...

参考

  1. 【笔记】卡方检验概述

  2. Chi-Square Test of Independence in R

3.Chi-square Goodness of Fit Test in R

4.Fisher确切概率法也有卡方统计量?

5.Fisher确切概率法公式的由来

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342