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

作者: 王子狐 | 来源:发表于2020-06-27 23:08 被阅读0次

    连续型变量

    墙裂推荐!统计方法如何选以及全代码作图实现。果子老师这篇帖子比较完整的介绍了如何用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确切概率法公式的由来

    相关文章

      网友评论

        本文标题:用R语言满足日常统计需求

        本文链接:https://www.haomeiwen.com/subject/jwvvfktx.html