【问题标题】:R - Chi Square Independence Test with same probabilites for classesR - 具有相同概率的类的卡方独立性检验
【发布时间】:2018-12-05 10:33:25
【问题描述】:

编辑:

正如我后来在其他地方发现的那样,Chi² 测试可能不适合我这里的数据,或者更确切地说不能测试我想要找出的内容。因此,我对我的数据进行了泊松分布的广义线性模型 (glm),效果非常好。所以请记住这一点...

.

在咨询了有关此问题的各种网站(如 thisthisthis),当然还有 chisq.test 函数的官方文档后,我仍然无法找到解决问题的方法。

我想要什么:

我想通过R 中的chisq.test 函数对我的数据进行Chi² 独立性检验。我的数据由在 4 种宿主树种上发现的 4 种附生植物组成(这意味着:在这 4 种树种上生长的 4 种植物)。现在,我想知道附生植物是否在这些树木中平均分布,或者是否一种树种倾向于容纳更多的附生植物个体。我可以很容易地进行标准 Chi² 测试(见下文)。但这也将测试附生植物物种是否均匀分布,我不想被测试。那么,如何在cisq.test 函数中为我的列联表提交不同的概率?即,我希望预期矩阵根据每个物种的附生植物个体数量,同时期望它们在树种中平均分布。这听起来很复杂,所以看看我的示例数据:

示例数据:

(我按照@paoloeusebi 的建议编辑了数据格式)

观察数据:

obs_data = matrix(c(0,60,2,5,
                 0,25,3,5,
                 20,90,30,
                 10,1,4,3,0),
               nrow = 4, 
               dimnames = list(c("AS", "BU", "CL", "MB"),
                               c("CS", "GS", "TA", "WG")))

> obs_data
   CS GS TA WG
1    AS  0  0 20  1
2    BU 60 25 90  4
3    CL  2  3 30  3
4    MB  5  5 10  0

预期数据:

创建预期数据:

exp_data = matrix(rep(colSums(obs_data)/4,each = 4),
                  nrow = 4,
                  dimnames = list(c("AS", "BU", "CL", "MB"),
                                  c("CS", "GS", "TA", "WG")))

> exp_data
      CS   GS   TA WG
AS 16.75 8.25 37.5  2
BU 16.75 8.25 37.5  2
CL 16.75 8.25 37.5  2
MB 16.75 8.25 37.5  2

但是:根据 Chi² 测试的预期数据:

> example_test = chisq.test(obs_data[,2:4])

Pearson's Chi-squared test

data:  obs_data[, 2:4]
X-squared = 31.99, df = 6, p-value = 1.639e-05

> example_test$expected
        CS    GS  TA
[1,]  5.36  2.64  12
[2,] 46.90 23.10 105
[3,]  9.38  4.62  21
[4,]  5.36  2.64  12

问题

那么,对于我想做的事情,这是否是正确的测试?也许我应该对融化/长数据进行拟合优度 Chi² 测试?但我不确定这是否准确。

@paoloeusebi 建议的解决方案:

我使用自己的预期数据而不是标准数据手动进行了 Chi² 测试。不知道这个测试是否可以...

> chi_result_own = sum((obs_data-exp_data)^2/exp_data)
[1] 304.8688

> pchisq(chi_result_own, df = 9, lower.tail = F)
[1] 2.419579e-60

这显然与进行拟合优度 Chi² 相同?但是 p 值要低得多,df 不同,而 Chi² 值相同!?

long_data = obs_data %>% melt()
long_exp = exp_data %>% melt() %>% mutate(value = value/sum(value))

> chisq.test(long_data$value, p = long_exp$value)

Chi-squared test for given probabilities

data:  long_data$value
X-squared = 304.87, df = 15, p-value < 2.2e-16

【问题讨论】:

    标签: r statistics chi-squared


    【解决方案1】:

    最好将数据输入为矩阵而不是数据框。

    obs_data <- matrix(c(0,60,2,5,
                         0,25,3,5,
                         20,90,30,
                         10,1,4,3,0),
                         nrow = 4, 
                         dimnames = list(c("AS", "BU", "CL", "MB"),
                                         c("CS", "GS", "TA", "WG")))
    obs_data
           CS GS TA WG
       AS  0  0 20  1
       BU 60 25 90  4
       CL  2  3 30  3
       MB  5  5 10  0
    

    在下文中,我使用卡方检验函数的相同演算。 预期单元格计数是边际总数(行和列)除以总数的矩阵乘积。

    sr <- rowSums(obs_data)
    sc <- colSums(obs_data)
    exp_data <- outer(sr, sc, "*")/sum(obs_data)
    
    exp_data
            CS        GS        TA        WG
        AS  5.453488  2.686047  12.20930 0.6511628
        BU 46.484496 22.895349 104.06977 5.5503876
        CL  9.868217  4.860465  22.09302 1.1782946
        MB  5.193798  2.558140  11.62791 0.6201550
    

    这是计算Chi2分布的值所需要的

    sum((obs_data-exp_data)^2/exp_data)
    [1] 35.57418
    pchisq(35.574, df=(nrow(obs_data)-1)*(ncol(obs_data)-1), lower.tail = F)
    [1] 4.717395e-05
    

    与 chisq.test 函数计算的结果相同

    chisq.test(obs_data)
        Pearson's Chi-squared test
    
    data:  obs_data
    X-squared = 35.574, df = 9, p-value = 4.717e-05
    

    【讨论】:

    • 感谢您的回答。但是,我的问题不是我如何手动计算预期的 Chi² 矩阵。相反,我想以某种方式为 Chi² 提供我自己的预期矩阵,以便假设有所不同(例如,如果在给出 p 参数的同时使用 chisq.test 进行拟合优度 Chi²)。有什么建议吗?
    • 拜托,你能检查一下答案的更新版本吗?
    • 啊,你的意思是我可以直接输入我的预期矩阵,然后手动计算 Chi²?我试试看……
    • 是的,否则你可以把你的期望值放在 chisq.test 的参数 p 中
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2020-10-03
    • 2021-05-17
    • 2015-03-26
    • 2015-05-13
    相关资源
    最近更新 更多