我有一个看起来像这样的数据框。名称和列数将不一致(有时“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)
}
答案 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