R ANOVA循环中的可变长度错误

时间:2018-08-24 08:19:37

标签: r lm anova

我目前正在尝试在数据框上运行方差分析,其格式如下:

ethnicity sampleID batch gender gene1 gene2 gene3 ...

..最多2,000个基因,该表中填有基因表达值。

下面是我用来为每个基因运行方差分析以发现种族差异的代码:

# here, 'merge' is the dataframe as described above
# set ethnicity to categorical
merge$ethnicity <- factor(merge$ethnicity, levels=c("Chinese","Malay","Indian"))

# parametric anova for each gene
baseformula <- " ~ ethnicity"
for (i in 5:ncol(merge))
{
  p <- anova(lm(colnames(merge)[i] ~ ethnicity, data=merge))  # variable lengths differ??
}

当我尝试运行此代码时,出现以下错误:

  

model.frame.default(formula = colnames(merge)[i]〜种族,   :可变长度有所不同(基于“种族”)

我检查了我的“种族”列的长度,该长度与我的“ gene1”列的长度相同。我也曾尝试对na.omit()使用merge$ethnicity命令,但仍然会出现相同的错误。

有人对这个问题有什么建议吗?

谢谢!


编辑:这是我的数据框的前五行:

这是我的数据框的前五行和前五列:

    ethnicity sample.id Batch Gender X7896759  
1           1 H60903    B6      1  6.19649  
2           1 H61603    B2      1  6.74464  
3           1 H61608    B7      2  6.20268  
4           1 H62204    B4      1  6.71395  
5           1 H62901    B7      2  6.59963

使用代码:

for (i in 5:ncol(merge))
{
  print(colnames(merge)[i])
  print(summary(aov(merge[,i] ~ merge$ethnicity)))

}

似乎给了我以下错误:

  

levels(x)[x]中的错误:负下标只能混合0   另外:警告消息:1:在model.response(mf,“ numeric”)中:
  在因子响应中使用type =“ numeric”将被忽略2:在   Ops.factor(y,z $ residuals):“-”对因子没有意义

1 个答案:

答案 0 :(得分:0)

我产生了一个例子。 df包含变量etnicity,具有三个组,并且有两个基因。 etnicity是您的预测变量。 loop打印与aov相关的每个基因的etnicity摘要结果。

set.seed(1); df <- data.frame(etnicity=c('A', 'B', 'C','A', 'B', 'C','A', 'B', 'C'), gene1=rnorm(9), gene2=rnorm(9))

for(i in 2:ncol(df)){
  print(colnames(df)[i])
  print( summary( aov(df[,i] ~ df$etnicity) ) )
  }

[1] "gene1"
            Df Sum Sq Mean Sq F value Pr(>F)
df$etnicity  2  1.324  0.6619   1.006   0.42
Residuals    6  3.947  0.6579               
[1] "gene2"
            Df Sum Sq Mean Sq F value Pr(>F)
df$etnicity  2  2.436   1.218   0.977  0.429
Residuals    6  7.478   1.246 

将其应用于类似于OP的数据母马。

df <- read.table(text="ethnicity sample.id Batch Gender X7896759  
1           1 H60903    B6      1  6.19649  
2           1 H61603    B2      1  6.74464  
3           2 H61608    B7      2  6.20268  
4           2 H62204    B4      1  6.71395  
5           3 H62901    B7      2  6.59963", header=T, stringsAsFactors=F)  


for(i in 5:ncol(df)){
  print(colnames(df)[i])
  print(summary(aov(df[,i]~df$ethnicity)))
}

[1] "X7896759"
             Df  Sum Sq Mean Sq F value Pr(>F)
df$ethnicity  1 0.00803 0.00803   0.084  0.791
Residuals     3 0.28767 0.09589