R-LM():通过多个线性模型循环导出F统计量的P值



我有一个大数据集,我需要为其运行一个线性模型比较组。我需要使用线性模型找到用于组比较的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)
  1. 在循环期间,data不会更改,因此colnames(data)返回向量,因此var[i] <- colnames(data)将触发错误。
  2. 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))