如何按行平均行并计算色散以识别异常值

时间:2016-06-24 20:09:12

标签: r

我有一个矩阵,我希望根据行方式将所有行拆分为20个bin。我可以这样做:

&&&

现在,在每个bin中,我想对bin中所有行的色散度量进行z标准化,以便识别异常值行。我想定义一个z得分截止值为1.7的异常值。我不确定是否有一个简单的方法可以解决这个问题,但我目前仍处于困境。

编辑:

重新陈述/澄清的问题:我有一个相当大的data.frame,有12374行(基因)和785列(单元格)。我想根据rowMeans将行分为20个bin。在每个区域内,我想对该区域内所有基因的分散度量(方差/平均值)进行z归一化,以便识别其表达值即使与具有相似平均表达的基因相比也具有高度可变性的异常基因。然后,我想提取出超过z分数阈值1.7的基因,以从每个区域中识别出显着可变的基因。

library(dplyr)
n_bins = 20
data$bin = ntile(rowMeans(data), n_bins)

当我运行此代码时:

> head(temp[,1:5])
              Drop7_0_AAACTAGGGTGG Drop7_0_AAAGGACGTACG Drop7_0_AACACTTGAGCC Drop7_0_AAGGCAACGAAT Drop7_0_AATGATGGGGTA
0610007P14RIK            0.1439444            0.0000000             0.000000            0.8759335            0.0000000
0610009B22RIK            0.0000000            0.6776718             0.000000            0.0000000            0.0000000
0610009O20RIK            0.1439444            0.0000000             0.000000            0.2735741            0.0000000
0610010B08RIK            1.4769893            1.1369215             1.124842            0.8759335            1.9544187
0610010F05RIK            0.7944809            0.0000000             0.000000            0.7016789            0.9144108
0610010K14RIK            0.1439444            0.0000000             1.124842            0.7016789            0.0000000

我收到错误:library(dplyr) n_bins = 20 temp = data temp$rowm = rowMeans(temp) outscore = temp %>% mutate(bin=ntile(rowm,n_bins)) %>% group_by(bin) %>% mutate(zscore=scale(rowm),outlier=abs(zscore)>1.7) 我认为这是指数据中的二进制数。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我想我理解你的问题。假设您已经创建了Species个箱子。您可以使用scale来计算标准化分数。

     data(iris)
      iris %>% select(Species,Sepal.Length) %>%
 group_by(Species) %>% mutate(zscore=scale(Sepal.Length))

你可以通过bin获得zscore,或者通过Species获得

Species Sepal.Length      zscore
    (fctr)        (dbl)       (dbl)
1   setosa          5.1  0.26667447
2   setosa          4.9 -0.30071802
3   setosa          4.7 -0.86811050
4   setosa          4.6 -1.15180675
5   setosa          5.0 -0.01702177
6   setosa          5.4  1.11776320
7   setosa          4.6 -1.15180675
8   setosa          5.0 -0.01702177
9   setosa          4.4 -1.71919923
10  setosa          4.9 -0.30071802
..     ...          ...         ...

从那里你可以创建一个标志来突出显示那些行gt abs(1.7)

选项2:

将所有cols转置为行并按组计算z-score。

  data(iris)
 w <-  iris %>% select(Species,Sepal.Length:Petal.Length) %>%
   gather(features,values,Sepal.Length:Petal.Length) %>% select(-features)
 w$z <- ave(w$values, w$Species, FUN=scale)

选项3

 library(dplyr)
 n_bins = 20
 temp = data
 temp$rowm = rowMeans(temp)
 outscore = temp %>% mutate(bin=ntile(rowm,n_bins)) 
 outscore$zscore <- ave(outscore$vrowm, outscore$bin, FUN=scale)

希望有所帮助

答案 1 :(得分:1)

与奥尔顿的回答相似:

library(dplyr)

n_bins = 20
#making sample data
data = as.data.frame(rbind(replicate(100,rnorm(1000))))

data$rowm = rowMeans(data)

outscore = data %>% mutate(bin=ntile(rowm,n_bins)) %>% 
  group_by(bin) %>% mutate(zscore=scale(rowm),outlier=abs(zscore)>1.7)

scale将行均值分布归一化,使整体标准偏差为1.&#34;异常值&#34;,在这种情况下,z-得分大小大于1.7,标记为outlier列。

如果您想查看哪些行有异常差异,您可以执行以下操作:

outscore$varscore = apply(outscore[,grepl("^V[0-9]+",names(outscore))],1,var)

outscore = outscore %>% mutate(zscore_var = scale(varscore),
  var_outlier = abs(zscore_var) > 1.7)

如果您想使用行均值分档,您也可以使用该分组:

outscore$varscore_grouped = outscore %>% group_by(bin) %>% 
  select(.,starts_with('V')) %>% apply(1,var)

outscore = outscore %>% mutate(zscore_var_grouped = scale(varscore_grouped), 
  var_group_outlier = abs(zscore_var_grouped) > 1.7)