R:如何对两组进行chiquare测试&数据帧的每一行

时间:2014-03-29 18:18:29

标签: r chi-squared

我有一个如下所示的数据框:

>head(df)
 alleleA_obs_prob alleleB_obs_prob alleleA_exp_prob alleleB_exp_prob
    0.6923077        0.3076923              0.5              0.5
          NaN              NaN              0.5              0.5
          NaN              NaN              0.5              0.5
    0.6250000        0.3750000              0.5              0.5
    0.6250000        0.3750000              0.5              0.5
          NaN              NaN              0.5              0.5

所以我有两组:等位基因A和等位基因B,我观察过它并预期可能性。

我被告知要对这些数据进行卡方检验,将两组的预期和观察概率进行比较。我搜索了很多教程,但无法理解chisquare测试如何在两个组上运行。要清楚,我不希望别人为我发布代码,我也不要求你做我的作业。我只是不确定,因为

  1. 通过在网上浏览现有的chisquare测试示例,我无法理解如何对我的数据执行chisquare测试。

  2. 我找不到任何集体在两组之间进行测试的例子。

  3. 无法找到他们为数据框中的每一行执行chisquare测试的示例。

  4. 我想要一个chisquare值&每行的p值。无论我在哪里,他们都会对整个数据框执行chisquare测试。

    我只想要一些帮助,请以您喜欢的方式分享链接或分享见解,如何解决此问题。但请不要以为我要你写我的代码。

    谢谢!

2 个答案:

答案 0 :(得分:3)

首先,这是一个统计问题,而不是R问题。您应该尝试在stats.stackexchange.com上发布,您可能会得到更好的答案。

其次,有两种类型的卡方检验,一种用于评估样本是否来自给定的测试分布,另一种用于测试独立性。我假设您对第一种类型感兴趣。

如果这是正确的,那么看起来你在问 - 用df的第一行作为例子 - 如果等位基因A和等位基因B以相等的数量存在,你有多大可能获得样本等位基因A的含量为69%,等位基因B的含量为31%?如果可能性(p)非常低,那么我们可以放心地断言1-p等位基因A和等位基因B不等量存在。

[注意:如果这是你在问什么,那么我误解了你的问题 - 请在评论中告诉我,我会删除答案。]

在你的情况下,最好跳过R中chisq.test(...)函数的变幻莫测并直接转到Xi-sq的定义:

  

χ 2 =Σ(O i - E i 2 / E i < /子>

其中O i 和E i 分别是i th 观察值和期望值。你设置的方式,每行只有2个观察结果,等位基因A和等位基因B.所以对于第1行,我们会写:

  

χ 2 =(0.692 - 0.5) 2 / 0.5 +(0.307 - 0.5) 2 / 0.5 = 0.148

由于只有两个观察结果,因此只有1个自由度。只有1 df的卡方检验是非常不可靠的,所以我不推荐这个,但为了这个例子,我们可以计算出chi-sq这个大的概率或者如下R:

pchisq(0.148, df=1, lower.tail=F)
# [1] 0.700454

这意味着,假设等位基因A和等位基因B以相等的量存在,仍有70%的可能性您可以获得等位基因A存在于69%而等位基因B存在于31%的样本。所以我们肯定不能拒绝零假设(等位基因A和B同等存在)。

对所有行运行此测试非常简单:

df           <- na.omit(df)          # remove rows with missing values
colnames(df) <- c("A.obs","B.obs","A.exp","B.exp")  # because I'm lazy
df$chisq     <- with(df,(A.obs-A.exp)^2/A.exp + (B.obs-B.exp)^2/B.exp)
df$p.value   <- pchisq(df$chisq,df=1, lower.tail=F)
df
#       A.obs     B.obs A.exp B.exp    chisq   p.value
# 1 0.6923077 0.3076923   0.5   0.5 0.147929 0.7005224
# 4 0.6250000 0.3750000   0.5   0.5 0.062500 0.8025873
# 5 0.6250000 0.3750000   0.5   0.5 0.062500 0.8025873

您实际上可以使用chisq.test(...)函数来执行此操作,但在您的情况下,我不确定它是否有所改进:

t(apply(df,1,function(x)
        with(chisq.test(x[1:2],p=x[3:4]),c(statistic,p.value=p.value))))
#   X-squared   p.value
# 1  0.147929 0.7005224
# 4  0.062500 0.8025873
# 5  0.062500 0.8025873

答案 1 :(得分:0)

我认为他们的意思是对两组中的每一组进行卡方检验:

chisq.test(df[is.finite(df[, 'alleleA_obs_prob']), c('alleleA_obs_prob', 'alleleA_exp_prob')])
# X-squared = 0.002, df = 2, p-value = 0.999

chisq.test(df[is.finite(df[, 'alleleB_obs_prob']), c('alleleB_obs_prob', 'alleleB_exp_prob')])
# X-squared = 0.0052, df = 2, p-value = 0.9974