0

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

>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,我已经观察到并预期了它们的概率。

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

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

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

  3. 找不到他们对数据框中的每一行执行卡方检验的示例。

我想要每行的卡方值和 p 值。在我所见的任何地方,他们都会对整个数据框进行卡方测试。

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

谢谢!

4

2 回答 2

3

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

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

如果这是正确的,那么您似乎在问 - 以 df 的第一行为例 - 如果等位基因 A 和等位基因 B 的数量相等,您可以获得等位基因 A 的样本的可能性有多大存在于 69% 而等位基因 B 存在于 31%?如果可能性 (p) 非常低,那么我们可以自信地断言 1-p 等位基因 A 和等位基因 B 的数量不相等。

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

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

χ 2 = Σ( O i - E i ) 2 / E i

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

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

由于只有两个观测值,因此只有 1 个自由度。只有 1 个 df 的卡方检验非常不可靠,所以我不建议这样做,但是为了示例的缘故,我们可以按照 R 中的如下方式计算卡方会如此大或更大的概率:

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

这意味着,假设等位基因 A 和等位基因 B 的含量相等,您仍然有 70% 的机会获得等位基因 A 和等位基因 B 分别为 69% 和 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
于 2014-03-29T20:54:25.747 回答
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
于 2014-03-29T18:51:22.840 回答