在R中一次输出一个变量的每个变量的回归统计

时间:2017-05-12 14:56:24

标签: r loops regression

我有一个看起来像这样的数据框。名称和列数将不一致(有时“C”将不存在,其他时间“D”,“E”,“F”可能存在等等。)唯一一致的变量将始终为Y,并且我想对Y退步。

# name and number of columns varies...so need flexible process
Y <- c(4, 4, 3, 4, 3, 2, 3, 2, 2, 3, 4, 4, 3, 4, 8, 6, 5, 4, 3, 6)
A <- c(1, 2, 1, 2, 3, 2, 1, 1, 1, 2, 1, 4, 3, 1, 2, 2, 1, 2, 4, 8)
B <- c(5, 6, 6, 5, 3, 7, 2, 1, 1, 2, 7, 4, 7, 8, 5, 7, 6, 6, 4, 7)
C <- c(9, 1, 2, 2, 1, 4, 5, 6, 7, 8, 89, 9, 7, 6, 5, 6, 8, 9 , 67, 6)
YABC <- data.frame(Y, A, B, C)

我想循环遍历每个变量并从回归模型中收集输出。

此过程创建所需的输出,但仅适用于此特定迭代。

model_A <- lm(Y ~ A, YABC)

ID <- 'A'
rsq <- summary(model_A)$r.squared
adj_rsq <- summary(model_A)$adj.r.squared
sig <- summary(model_A)$sigma

datA <- data.frame(ID, rsq, adj_rsq, sig)

model_B <- lm(Y ~ B, YABC)

ID <- 'B'
rsq <- summary(model_B)$r.squared
adj_rsq <- summary(model_B)$adj.r.squared
sig <- summary(model_B)$sigma

datB <- data.frame(ID, rsq, adj_rsq, sig)

model_C <- lm(Y ~ C, YABC)

ID <- 'C'
rsq <- summary(model_C)$r.squared
adj_rsq <- summary(model_C)$adj.r.squared
sig <- summary(model_C)$sigma

datC <- data.frame(ID, rsq, adj_rsq, sig)

output <- rbind(datA, datB, datC)

如何将这个包装在一个循环或其他一个会考虑不同数量和列名称的进程中?这是我的尝试......是的,我知道这是不对的,只是我概念化了我喜欢的那种能力。

# initialize data frame
output__ <- data.frame(ID__ = as.character(),
                     rsq__ = as.numeric(),
                     adj_rsq__ = as.numeric(),
                     sig__ = as.numeric())

# loop through A, then B, then C
for(i in A:C) {
  model_[i] <- lm(Y ~ [i], YABC)

  ID <- '[i]'
  rsq <- summary(model_[i])$r.squared
  adj_rsq <- summary(model_[i])$adj.r.squared
  sig <- summary(model_[i])$sigma
  data__temp <- (ID__, rsq__, adj_rsq__, sig__)
  data__ <- rbind(data__, data__temp)
}

使用@BigDataScientist方法......这是我使用的解决方案。

# initialize data frame
data__ <- data.frame(ID__ = as.character(),
                     rsq__ = as.numeric(),
                     adj_rsq__ = as.numeric(),
                     sig__ = as.numeric())

# loop through A, then B, then C
for(char in names(YABC)[-1]){
  model <- lm(as.formula(paste("Y ~ ", char)), YABC)
  ID__ <- paste(char)
  rsq__ <- summary(model)$r.squared
  adj_rsq__ <- summary(model)$adj.r.squared
  sig__ <- summary(model)$sigma
  data__temp <- data.frame(ID__, rsq__, adj_rsq__, sig__)
  data__ <- rbind(data__, data__temp)

}

2 个答案:

答案 0 :(得分:3)

以下是使用* apply:

的解决方案
Y <- c(4, 4, 3, 4, 3, 2, 3, 2, 2, 3, 4, 4, 3, 4, 8, 6, 5, 4, 3, 6)
A <- c(1, 2, 1, 2, 3, 2, 1, 1, 1, 2, 1, 4, 3, 1, 2, 2, 1, 2, 4, 8)
B <- c(5, 6, 6, 5, 3, 7, 2, 1, 1, 2, 7, 4, 7, 8, 5, 7, 6, 6, 4, 7)
C <- c(9, 1, 2, 2, 1, 4, 5, 6, 7, 8, 89, 9, 7, 6, 5, 6, 8, 9 , 67, 6)
YABC <- data.frame(Y, A, B, C)

names <- colnames(YABC[-1])

formulae <- sapply(names,function(x)as.formula(paste('Y~',x)))

lapply(formulae, function(x) lm(x, data = YABC))

当然你也可以打电话给摘要:

lapply(formulae, function(x) summary(lm(x, data = YABC)))

如果要从特定模型中提取变量,请执行以下操作:

results <- lapply(formulae, function(x) lm(x, data = YABC))
results$A$coefficients

使用A作为解释性var

给出模型中的系数

答案 1 :(得分:1)

如评论中所述:?as.formula()是一种解决方案。 你可以这样做:

model = list()
for(char in names(YABC)[-1]) {
  model[[char]] <- lm(as.formula(paste("Y ~ ", char)), YABC)
}
model