我正在尝试创建一个脚本,为多重线性回归模型的八个输入变量的每种组合输出一个调整后的r平方值表。
我尝试的方法是在数据框中创建列名称的每种组合,并将这些字符串与“ +”符号连接起来,然后将它们分别存储在向量中。然后,我遍历所有这些变量,并检索调整后的r平方值,并将其存储在新矢量中。我使用的数据框称为WasteData。
my.vars <- matrix(0, ncol=8, nrow=)
my.vars <- t(matrix(noquote(colnames(WasteData[2:9]))))
sum.vars <- rep("", 255)
r.2 <- rep(0, 255)
comb.mat <- matrix(numeric(0), nrow=8, ncol=0)
for ( i in 1:8 ) {
t.mat <- combn(my.vars, m=i)
comb.mat <- cbind(comb.mat, rbind(t.mat, matrix("", ncol=dim(t.mat)[2] , nrow=8-i)))
}
for ( j in 1:dim(comb.mat)[2] ) {
lim = 0
for (i in 1:8) {
if(comb.mat[i,j] == "") {
lim = i-1
break;
}
}
temp = comb.mat[1:lim,j]
sum.vars[j] = paste(temp, collapse = " + ")
sum.vars[dim(comb.mat)[2]] = "INDUS + METAL + WHOLE + RETAIL + REST + FINAN + MISC + HOME" #this line shows each of the eight variables
r.2[j] = summary(lm(WASTE ~ noquote(sum.vars[j]), WasteData))$adj.r.squared
}
sum.vars向量可以正确编译,从而为我提供线性模型中“〜”右边的每个正确参数,但是一旦运行lm,就会出现以下错误:
model.frame.default(formula = WASTE〜noquote(sum.vars [j]),data = WasteData,中的错误: 可变长度有所不同(可找到“ noquote(sum.vars [j])”)
答案 0 :(得分:0)
考虑采用 apply 族方法来构建和迭代线性公式的字符向量,而无需簿记初始化矩阵并在for
循环中进行迭代分配。具体来说,是要解决您的两个操作:
在我的数据框中创建列名称的每个组合,并将这些字符串与“ +”符号连接起来,并将每个字符串存储在向量中。
循环遍历每个变量,并检索调整后的r平方值并将其存储在新矢量中。
lapply
+ combn
和 rapply
expvar_list <- lapply(seq_along(names(WasteData)[-1]), function(x)
combn(names(WasteData)[-1], x, simplify=FALSE))
formulas_vec <- rapply(expvar_list, function(x) paste("WASTE ~", paste(x, collapse=" + ")))
formulas_vec
sapply
+ as.formula
# NAMED VECTOR OF adj-R
r_square_vec <- sapply(formulas_vec, function(f)
summary(lm(as.formula(f), WasteData))$adj.r.squared)
# ONE-COLUMN MATRIX WITH ROW NAMES OF adj-R
r_square_mat <- as.matrix(r_square_vec)