如何解决循环以在矩阵的行上应用lm并提取重要的模型
我有一个数据框,在行和40列中具有8,000个基因表达值。 40列代表来自4个不同时间点的观察结果。前十列是未经治疗的,后十列是经过1周的治疗,第三列是经过2周的治疗,第四列是经过7周的治疗。
这是个主意(小编):
m1 <- matrix(data=1:32,nrow = 8,ncol = 4)
time <- c(1:4)
summaries <- data.frame(nrow=8,ncol=4)
pvalues <- function(x) {
for (i in (1:8)) {
raw <- unlist(as.vector(x[i,]))
lm <- lm(raw ~ time)
summaries[i,] <- summary(lm)$coefficients[,4]
return(summaries)
}
}
pvalues(m1)
我知道它仍在覆盖,但我不知道如何适应ix。
解决方法
好的,我运行了您的代码并得到了
Warning message:
In summary.lm(lm) : essentially perfect fit: summary may be unreliable
这是因为样本数据是连续的。我将m1
改为使用rnorm(32)
而不是1:32
,此问题已解决。 (尽管我认为这个问题是特定于示例的,而不是实际情况)。
下一个问题:summaries
对象的大小。您使用了data.frame
,它以列名作为参数。我们想使用matrix
来设置行和列:
## Bad - 1 row and 2 columns
summaries <- data.frame(nrow=8,ncol=4)
summaries
# nrow ncol
# 1 8 4
## Good - 8 rows,2 columns
summaries <- matrix(nrow = 8,ncol = 2)
# summaries
# [,1] [,2]
# [1,] NA NA
# [2,] NA NA
# [3,] NA NA
# [4,] NA NA
# [5,] NA NA
# [6,] NA NA
# [7,] NA NA
# [8,] NA NA
但是,接下来,运行代码 still 只会填充第一行!为什么?函数一旦击中return()
就会立即停止,并认为它已完成。我们需要将return(summaries)
循环之后的for
移到,而不是for
循环内。全部放在一起:
m1 <- matrix(data = rnorm(32),nrow = 8,ncol = 4)
time <- c(1:4)
summaries <- matrix(nrow = 8,ncol = 2)
pvalues <- function(x) {
for (i in (1:8)) {
raw <- c(x[i,])
lm <- lm(raw ~ time)
summaries[i,] <- summary(lm)$coefficients[,4]
} ## End the for loop before the `return()`
return(summaries)
}
pvalues(m1)
# [,1] [,] 0.6235167 0.5461115
# [2,] 0.4256698 0.3992509
# [3,] 0.3041439 0.2751724
# [4,] 0.8087557 0.8252432
# [5,] 0.8820501 0.1812292
# [6,] 0.4997327 0.5582880
# [7,] 0.5589398 0.8150613
# [8,] 0.6283059 0.8994896
我们可以根据上一次迭代总结为列名分配些麻烦:
pvalues <- function(x) {
for (i in (1:8)) {
raw <- c(x[i,4]
}
colnames(summaries) = names(summary(lm)$coefficients[,4])
return(summaries)
}
pvalues(m1)
# (Intercept) time
# [1,] 0.6235167 0.5461115
# [2,] 0.4256698 0.3992509
# [3,] 0.3041439 0.2751724
# [4,] 0.8087557 0.8252432
# [5,] 0.8820501 0.1812292
# [6,] 0.4997327 0.5582880
# [7,] 0.5589398 0.8150613
# [8,] 0.6283059 0.8994896
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。