如何减轻线性模型函数中的“可变长度不同”错误

时间:2019-05-23 18:30:49

标签: r linear-regression

我正在尝试创建一个脚本,为多重线性回归模型的八个输入变量的每种组合输出一个调整后的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])”)

1 个答案:

答案 0 :(得分:0)

考虑采用 apply 族方法来构建和迭代线性公式的字符向量,而无需簿记初始化矩阵并在for循环中进行迭代分配。具体来说,是要解决您的两个操作:

  
      
  1. 在我的数据框中创建列名称的每个组合,并将这些字符串与“ +”符号连接起来,并将每个字符串存储在向量中。

  2.   
  3. 循环遍历每个变量,并检索调整后的r平方值并将其存储在新矢量中。

  4.   

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)

Rextester demo