Как уменьшить ошибку «переменной длины» в линейной модели - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать скрипт, который выводит таблицу скорректированных значений 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 (формула = WASTE ~ noquote (sum.vars [j]), data = WasteData,: переменные длины различаются (найдено для «noquote (sum.vars [j])»)

1 Ответ

0 голосов
/ 23 мая 2019

Рассмотрим применение семейного подхода для построения и итерации по вектору символов линейных формул без учета инициализации матрицы и итеративного назначения в цикле for.В частности, для решения ваших двух действий:

  1. создайте каждую комбинацию имен столбцов в моем фрейме данных и объедините эти строки со знаками "+" и сохраните каждое из них в видевектор.

  2. перебирает каждую из них, извлекает скорректированное значение 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)

Rextester demo

...