(2016-06-18) 您的问题目前无法完全回答。下面,我将指出几个问题。
如何正确获取p值
我假设您想要模型的 F 统计量的 p 值,作为拟合优度的指示。假设你的拟合模型是fit,我们应该这样做:
fstatistic <- summary(fit)$fstatistic
p_value <- unname(1 - pf(fstatistic[1], fstatistic[2], fstatistic[3]))
我以内置数据集trees为例进行演示。
fit <- lm(Height ~ Girth, trees)
## truncated output of summary(fit)
# > summary(fit)
# Residual standard error: 5.538 on 29 degrees of freedom
# Multiple R-squared: 0.2697, Adjusted R-squared: 0.2445
F-statistic: 10.71 on 1 and 29 DF, p-value: 0.002758
fstatistic <- summary(fit)$fstatistic
p_value <- unname(1 - pf(fstatistic[1], fstatistic[2], fstatistic[3]))
## > p_value
# [1] 0.002757815
所以,p_value 同意打印的摘要。
你的循环
我建议您在计算/更新期间使用向量而不是数据框。
variable <- character(130)
p.value <- numeric(130)
您可以通过以下方式将最后的结果组合到一个数据框:
k <- data.frame(var = variable, p.value = p.value)
为什么?因为这是内存效率!现在,经过这些修正,我们得出:
variable <- character(130)
p.value <- numeric(130)
for (i in 1:130) {
variable[i] <- colnames(data)
fit <- lm(i~group, data=data)
fstatistic <- summary(fit)$fstatistic
p_value <- unname(1 - pf(fstatistic[1], fstatistic[2], fstatistic[3]))
p.value[i] <- p_value
}
k <- data.frame(var = variable, p.value = p.value)
其他问题
我仍然认为上面的代码行不通。因为我不确定以下是否正确:
variable[i] <- colnames(data)
fit <- lm(i~group, data=data)
- 在循环过程中,
data 没有改变,所以colnames(data) 返回一个向量,因此var[i] <- colnames(data) 会触发错误。
-
i~group 看起来很奇怪。你的data 中有i 吗?
我无法帮助您解决这些问题。我不知道你的data 长什么样。但是,如果您可以放入数据的子集,那就没问题了。
跟进(2016-06-19)
谢谢。这非常有帮助。我的数据中没有“i”,但我希望我可以用它来表示不同的列名,以便它遍历所有列名。有没有办法分配列名编号,这样就可以了?
是的,但我需要知道你对每一列都有什么。
第 1 列有一个组号。以下列包含我正在查看的不同因素的数据。
好的,所以我想ncol(data) = 131,其中第一列是group,剩下的 130 列是你要测试的。那么这应该工作:
variable <- colnames(data)[-1]
p.value <- numeric(130)
for (i in 1:130) {
fit <- lm(paste(variable[i], "group", sep = "~"), data=data)
fstatistic <- summary(fit)$fstatistic
p_value <- unname(1 - pf(fstatistic[1], fstatistic[2], fstatistic[3]))
p.value[i] <- p_value
}
k <- data.frame(var = variable, p.value = p.value)
可以使用sapply() 代替上面的for 循环。但我认为没有性能差异,因为与lm() 和summary() 相比,循环开销非常小。