R - 类 具有相同概率的卡方独立检验
R - Chi Square Independence Test with same probabilites for classes
编辑:
正如我后来在其他地方发现的那样,Chi² 检验可能不适合我这里的数据,或者更确切地说,它不检验我想找出的内容。因此,我对我的数据进行了一个具有泊松分布的广义线性模型 (glm),结果非常好。所以记住这一点...
.
关于这个问题(比如this, this or this) and of course the official documentation of the chisq.test
函数,查阅了各种网站后,我仍然没有找到解决问题的方法。
我想要的:
我想通过 R
中的 chisq.test
函数对我的数据进行 Chi² 独立性检验。我的数据由在 4 种寄主树种上发现的 4 种附生植物组成(这意味着:生长在这 4 种树种上的 4 种植物)。现在,我想知道附生植物在这些树中的分布是否均匀,或者一种树种是否倾向于比其他树种拥有更多的附生植物个体。我可以很容易地进行标准的 Chi² 测试(见下文)。但这也可以测试附生植物物种是否均匀分布,我不想测试。那么,如何在 cisq.test
函数中为我的意外事件 table 提交不同的概率?也就是说,我希望预期矩阵根据每个物种的附生植物个体数量而定,同时期望它们在树种之间平均分布。这听起来很复杂,所以看看我的示例数据:
示例数据:
(我按照@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
问题
那么,这是否适合我想要做的事情?也许我应该用 melted/long 数据做一个拟合优度 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
最好输入数据为矩阵而不是数据框。
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² 检验可能不适合我这里的数据,或者更确切地说,它不检验我想找出的内容。因此,我对我的数据进行了一个具有泊松分布的广义线性模型 (glm),结果非常好。所以记住这一点...
.
关于这个问题(比如this, this or this) and of course the official documentation of the chisq.test
函数,查阅了各种网站后,我仍然没有找到解决问题的方法。
我想要的:
我想通过 R
中的 chisq.test
函数对我的数据进行 Chi² 独立性检验。我的数据由在 4 种寄主树种上发现的 4 种附生植物组成(这意味着:生长在这 4 种树种上的 4 种植物)。现在,我想知道附生植物在这些树中的分布是否均匀,或者一种树种是否倾向于比其他树种拥有更多的附生植物个体。我可以很容易地进行标准的 Chi² 测试(见下文)。但这也可以测试附生植物物种是否均匀分布,我不想测试。那么,如何在 cisq.test
函数中为我的意外事件 table 提交不同的概率?也就是说,我希望预期矩阵根据每个物种的附生植物个体数量而定,同时期望它们在树种之间平均分布。这听起来很复杂,所以看看我的示例数据:
示例数据:
(我按照@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
问题
那么,这是否适合我想要做的事情?也许我应该用 melted/long 数据做一个拟合优度 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
最好输入数据为矩阵而不是数据框。
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