Проблема использования факторов в качестве независимых переменных в регрессии лучших подмножеств (скачки или regsubsets) - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь сделать наилучшую регрессию подмножеств в R. Используя либо leaps(), либо regsubsets() (из пакета leaps), он работает отлично, если все мои независимые (пояснительные) переменные являются числовыми. Но если я включу фактор, он завершается с сообщением об ошибке:

Ошибка в leaps.setup (x, y, wt = wt, nbest = nbest, nvmax = NCOL (x) + int,: NA / NaN / Inf в вызове сторонней функции (arg 3) Дополнительно: Предупреждение: В leaps.setup (x, y, wt = wt, nbest = nbest, nvmax = NCOL (x) + int,: только первыйстрока в символьном векторе, используемом в .Fortran

Я просканировал весь свой набор данных, и в нем абсолютно отсутствуют значения NA / NaN / Inf;также попытался сгенерировать искусственные значения факторов вместо того, чтобы использовать значения из моего набора данных, и я получил тот же результат.Если я создаю фиктивные переменные вне R для представления значений факторов, то он работает отлично, поэтому ничего нельзя сделатьс самими данными. Я пробовал это с метками и без меток для уровней факторов, а также с числовыми или символьными значениями коэффициентов в исходных данных: одинаковый результат в каждом случае. Вот один из способов, которые я использовал:

zoo1 <- within(panda, AltitudeZoo1 <- relevel(factor(Altitude), "2134"))

Все же документация по заявкам онлайнэти факторы могут быть использованы в leaps(), например в этом документе . Я обнаружил различные сообщения, в том числе в StackOverflow, о примерно одинаковом сообщении об ошибке (обычно различающемся числом, на которое жаловался аргумент "), но все они касаются процедуры randomForest.

Не имеет значения,используйте leaps() или regsubsets().

Есть идеи? Обходной путь - вернуться к созданию фиктивных переменных вне R, но это раздражает.

Вот воспроизводимый пример: сначала код

reprex = read.csv("reprexdata.csv", head = T)
library(leaps)

##creating dummy variable
reprex$xfactordata.f<-factor(reprex$xfactordata)
##checking dummy variables work ok with simple regression
m<-lm(reprex$y~reprex$x1data+reprex$x2data+reprex$xfactordata.f) 
summary(m)

##now try best subsets regression
y<-reprex$y
x <- reprex[,c (2,3,5)] ## picks up x1data, x2data, xfactordata.f
Z <- leaps(x,y, method = "adjr2", nbest = 1) ## running leaps subset regression
Z

Далее, данные, которые я протестировал вышекод, который должным образом выдает ошибку, о которой сообщалось ранее (33 строки):

ydata   x1data  x2data  xfactordata
139.3983228 2   0.555555556 2134
159.4909669 1   0.28125 2134
162.979101  0   0   1780
158.523721  0   0   1780
167.9430665 1   0.526509081 2134
150.4105583 1   0.21875 2134
136.6799004 2   8.428819444 2134
142.9603016 1   0.026041667 2134
149.3782133 1   0.364583333 2134
162.3022502 0   2.725694444 2084
159.8686527 0   1.085069444 2084
129.5367811 0   14.04513889 2084
133.8219284 0   8.697916667 2084
152.7590267 2   2.81421023  2134
167.6079507 1   0.251736111 1780
157.4867615 2   0.915798611 2134
146.8897681 2   1.40625 2134
151.4678525 1   0.769842804 2134
174.3412577 2   2.612847222 2084
150.0527068 2   0.885416667 2134
139.3348421 1   2.560763889 2134
159.4110442 2   1.66626408  2134
164.2695334 2   0.958333333 2134
154.5591851 1   1.980372102 2134
160.5290024 1   1.225   2134
154.4028751 1   1.370983414 2134
144.0339001 1   0.520833333 2134
145.5653995 2   0   2134
161.8175311 1   1.271701389 2134
139.338698  1   3.8875  2134
163.2222006 1   0.703125    2084
146.2958403 1   0   2134

1 Ответ

0 голосов
/ 10 ноября 2019

Для функции leaps() требуется матрица модели (т. Е. Матрица только числовых значений, тогда как regsubsets может принимать аргумент формулы (который автоматически создает матрицу модели из набора указанных предикторов,возможно, включая факторы); пример, который вы связываете (я думаю, я бы назвал это "примером", а не "документацией"; справочная документация из пакета (например, здесь ) ненигде не показывайте пример и не говорите явно, что факторы разрешены (это говорит только о том, что x является «матрицей предикторов», которая технически не допускает факторы - факторы преобразуются в character, когда вы пытаетесь их поместитьв матрицу).

Вот как можно преобразовать набор предикторов, включающих один или несколько факторов, в числовую матрицу предсказаний (включая факторы в виде нескольких фиктивных переменных):

x <- model.matrix(~x1data+x2data+xfactordata.f, data=reprex)
Z <- leaps(x, reprex$y, method="adjr2", nbest=1)

вв вашем конкретном примере это возвращает ошибку

прыжки требуют полной матрицы проектирования; используйте regsubsets ()

, но ядумаю, это потому, что ваш пример искусственно мал (вы случайно собрали набор идеально коллинеарных предикторов).

Как заявлено, regsubsets() делает этот шаг автоматически, если вы задаете формулу:

regsubsets(y~x1data+x2data+xfactordata.f, data=reprex)

Если вы знаете, что хотите использовать все столбцы в фрейме данных как предикторы, кроме переменной ответа, вы можете сказать regsubsets(y~., data=reprex), или в этом случае regsubsets(y ~ . - xfactordata) (так как не хотите обаxfactordata и xfactordata.f в модели)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...