[英]Output Regression statistics for each variable one at a time in R
我有一个看起来像这样的数据框。 名称和列数将不一致(有时“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)
}
这是使用* 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作为解释性变量,从模型给出系数
正如评论中所写: ?as.formula()
是一种解决方案。 你可以这样做:
model = list()
for(char in names(YABC)[-1]) {
model[[char]] <- lm(as.formula(paste("Y ~ ", char)), YABC)
}
model
这是我如何进行这种建模的。 下面的例子假设我改变了不同的结果,并给出了一组给定的协变量的不同暴露。
我首先定义了我想测试的结果和暴露(我认为在流行病学方面你可以扩展)。
outcomes <- c("a","b","c","d")
exposures <- c("exp1","exp2","exp3")
假设这些向量中指定的每个元素都作为数据集中的列名存在(以及“〜”之后列出的下面的协变量)。
final_lm_data <- data.frame() #initialize empty dataframe to hold results
for (j in 1:length(exposures){
for (i in 1:length(outcomes){
mylm <- lm(formula(paste(outcomes[i], "~", "continuous.cov.1 +
continuous.cov.2 + factor(categorical.variable.1)", "+",
exposure[j])), data=mydata)
coefficent.table <- as.data.frame(coef(summary(mylm)))
mylm_data <- as.data.frame(cbind(ctable,Variable = rownames(ctable),
Outcome = outcomes[i],
Exposure = exposures[j],
Model_N = paste(length(mylm$residuals))))
names(mylm_data)[4] <- "Pvalue" # renaming the "Pr(>|t|)"
rownames(mylm_data) <- NULL # important because we are creating stacked output dataset
final_lm_data <- rbind(final_lm_data,mylm_data)
}
}
这将为您提供final_lm_data
,其中包含模型中每个变量的估计值,std.errors,tstatistics,pvalues,还可以跟踪Outcome和Exposure的迭代(模型的第一个和最后一个元素)。 最后,在删除缺失值的数据记录之后使用N. 您可以修改mylm_data创建以从模型中捕获更多信息(例如rsq等)。
最后,如果协变量也因运行而异,我不确定如何自动化该部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.