【问题标题】:Correct formula for summation in R, calculating polymorphism information content (PIC)R中求和的正确公式,计算多态信息含量(PIC)
【发布时间】:2021-08-26 19:35:52
【问题描述】:

(基因组学数据行话警告!)我正在从数千个单核苷酸多态性 (SNP) 的数据集中计算 R 中的多态性信息内容 (PIC)。进行计算所需的数据是等位基因频率。每个观察值都有两种(很少三种)等位基因类型,或者是参考基因类型,或者是第一个替代基因类型。我有一小部分带有第二个替代等位基因。这是我试图在 R 中编写的公式:original publication

其中 Pi 和 Pj 是所选 SNP 标记的第 i 个和第 j 个等位基因的频率。这是我目前在 R

中的表述
var_freq$PIC <- (1-(var_freq$a2^2)-(1-var_freq$a2)^2)-(2*(var_freq$a2^2)*(1-(var_freq$a2^2))))

其中变量a2 是替代等位基因频率。

测试数据集:a1是参考等位基因,a2是替代(仍然忽略a3第二替代等位基因)

library(tidyverse)
set.seed(123)
testdata <- data.frame(a1=rnorm(n=10000, mean = .99, sd=0.15)) %>% 
  filter(., a1<1&a1>0) %>% 
  mutate(., a2=1-a1)

这是 PIC 值的正确 R 代码公式吗,即我对公式的解释正确吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    如果问题是如何计算给定向量 p 的 PIC 则

    1) 从 1 中减去 p 的元素的平方和,并减去 o 矩阵的上三角形中的值之和的两倍。

    p <- c(0.1, 0.2, 0.3, 0.4)  # test data
    
    o <- outer(p^2, p^2)
    PIC <- 1 - sum(p^2) - 2 * sum(o[upper.tri(o)]); PIC
    ## [1] 0.6454
    

    1a) 因为 o 是对称的,所以上三角形和下三角形是相同的,所以上三角形的两倍等于除对角线之外的所有元素之和,我们减去它(即添加它,因为它已经否定)所以一个变体是:

    o <- outer(p^2, p^2)
    PIC <- 1 - sum(p^2) - sum(o) + sum(diag(o)); PIC
    ## [1] 0.6454
    

    2) 交替使用 listcompr 包,该包有助于编写非常接近问题中所示公式的代码。

    library(listcompr)
    n <- length(p)
    1 - sum(p^2) - 2 * sum(gen.vector(p[i]^2 * p[j]^2, i = 1:(n-1), j = (i+1):n))
    ## [1] 0.6454
    

    双重检查

    # double check
    1 - (.1^2+.2^2+.3^2+.4^2) - 2*(.1^2*(.2^2+.3^2+.4^2) + .2^2*(.3^2+.4^2) + .3^2*.4^2)
    ## [1] 0.6454
    

    【讨论】:

    • 使用我的等位基因 2 的测试数据(更新的问题)和我得到 -15729.07 的代码,PIC 值应该在 0 和 1 之间。我还应该得到每个基因座的 PIC 值(即每两个等位基因的位置,按行),而不是每个等位基因类型的单个值(即参考等位基因或替代等位基因,按列)。请原谅我对矩阵代数的无知,我们是否需要两个等位基因的频率来执行方程。
    • 没有。问题中显示的公式有一个向量作为输入,一个标量作为输出。它没有向量作为输出。您所评论的可能是您尚未描述的更大问题。
    【解决方案2】:

    在数学上,这相当于:

    p <- c(0.1, 0.2, 0.3, 0.4)  # test data
    
    1 - sum((s <- p%o%p) * `diag<-`(s, 1))
    [1] 0.6454
    

    【讨论】:

    • 这非常好,但虽然它似乎有效,但我不认为 R 保证 * 的左侧将在右侧之前评估。为了安全起见,最好将s&lt;-p%o%p 放在单独的一行中。
    • @G.Grothendieck R 确实保证了这一点。我确实将s 括在括号中。
    • 用括号括起来没有区别。
    • @G.Grothendieck 您能否给我一个情况/场景,即右侧将在左侧之前进行评估?
    • 这不是它现在如何工作的问题。正如我在评论中指出的那样,它显然有效。它更多的是它是否保证不改变的问题。我已向 r-devel 发布了一条消息,以获取有关此问题的反馈。
    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多