我有一个大数据集,我需要为其运行一个线性模型比较组。我需要使用线性模型找到用于组比较的P值。有四个组(所以我需要1〜2,1〜3。1〜4,2〜3,2〜4,3〜4),并且需要比较130列。任何帮助将不胜感激!
我有这个,这给了我我所需要的。
fit<-lm(variable~group, data=data)
summary(fit)
但是,在所有组和列中,我都有将近800个比较,因此我想避免手动进行此操作。我尝试编写循环的写作,但它不起作用。
k<-data.frame()
for (i in 1:130){
[i,1]<-colnames(data)
fit<- lm(i~group, data=data)
[i,2] <- fit$p.value
}
但这给了我各种不同的错误。我真的只需要p值。帮助您将不胜感激!!谢谢!
(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()
而不是上述用于循环。但是我认为没有性能差异,因为与 lm()
和 summary()
相比,循环开销很小。
我认为这至少可以使您入门。它使用dplyr和扫帚包。基本思想是将您想要的所有公式定义为字符,然后使用lapply()
通过lm()
运行它们。
library(dplyr)
library(broom)
# Generate a vector of wanted formulas
forms <- c("mpg ~ cyl", "mpg ~ wt")
# Function to apply formula
lmit <- function(form){
tidy(lm(as.formula(form), mtcars)) %>%
mutate(formula = form)
}
# Apply it and bind into a dataframe
results <- bind_rows(lapply(forms, lmit))