Как разрешить ошибку «количество заменяемых элементов не кратно длине замены» в регрессии с начальной загрузкой? - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь создать загрузочную регрессионную модель, используя код из учебника Энди Филда. Обнаружение статистики с использованием R .

Я пытаюсь интерпретировать сообщение об ошибке, которое я получаю при запуске *Функция 1005 *.Из прочтения других сообщений на форуме я понимаю, что это говорит мне о наличии дисбаланса в количестве элементов между двумя объектами, но я не понимаю, что это означает в моем контексте и как я могу его решить.

Вы можете скачать мои данные здесь (общедоступный набор данных в списках Airbnb) и найти мой код и полное сообщение об ошибке ниже.Я использую смесь факторизованных фиктивных переменных и непрерывных переменных в качестве предикторов.Заранее благодарим за любую помощь!

Код:

bootReg <- function (formula, data, i)
{
d <- data [i,]
fit <- lm(formula, data = d)
return(coef(fit))
}

bootResults <- boot(statistic = bootReg, formula = review_scores_rating ~ instant_bookable + cancellation_policy + 
                  host_since_cat + host_location_cat + host_response_time + 
                  host_is_superhost + host_listings_cat + property_type + room_type + 
                  accommodates + bedrooms + beds + price + security_deposit + 
                  cleaning_fee + extra_people + minimum_nights + amenityBreakfast + 
                  amenityAC + amenityElevator + amenityKitchen + amenityHostGreeting + 
                  amenitySmoking + amenityPets + amenityWifi + amenityTV,
                  data = listingsRating, R = 2000)

Ошибка:

Error in t.star[r, ] <- res[[r]] : 
number of items to replace is not a multiple of replacement length
In addition: Warning message:
In doTryCatch(return(expr), name, parentenv, handler) :
restarting interrupted promise evaluation

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Проблема

Проблема в ваших факторных переменных.Когда вы делаете lm() для подмножества ваших данных (что делается снова и снова в boot::boot()), вы получаете только коэффициенты для существующих уровней факторов.Тогда каждый коэффициент ничьей может быть разной длины.Это можно воспроизвести, если вы выполните

debug(boot)
set.seed(123)
bootResults <- boot(statistic = bootReg, formula = review_scores_rating ~ instant_bookable + cancellation_policy + 
                        host_since_cat + host_location_cat + host_response_time + 
                        host_is_superhost + host_listings_cat + property_type + room_type + 
                        accommodates + bedrooms + beds + price + security_deposit + 
                        cleaning_fee + extra_people + minimum_nights + amenityBreakfast + 
                        amenityAC + amenityElevator + amenityKitchen + amenityHostGreeting + 
                        amenitySmoking + amenityPets + amenityWifi + amenityTV,
                    data = listingsRating, R = 2)

, что позволит вам перемещаться по вызову функции по одной строке за раз.После запуска строки

res <- if (ncpus > 1L && (have_mc || have_snow)) {
    if (have_mc) {
        parallel::mclapply(seq_len(RR), fn, mc.cores = ncpus)
    }
    else if (have_snow) {
        list(...)
        if (is.null(cl)) {
            cl <- parallel::makePSOCKcluster(rep("localhost", 
                ncpus))
            if (RNGkind()[1L] == "L'Ecuyer-CMRG") 
                parallel::clusterSetRNGStream(cl)
            res <- parallel::parLapply(cl, seq_len(RR), fn)
            parallel::stopCluster(cl)
            res
        }
        else parallel::parLapply(cl, seq_len(RR), fn)
    }
} else lapply(seq_len(RR), fn)

Затем попробуйте

setdiff(names(res[[1]]), names(res[[2]]))
# [1] "property_typeBarn"         "property_typeNature lodge"

В первом подмножестве присутствуют два факторных уровня, которых нет во втором.Это вызывает вашу проблему.

Решение

Используйте model.matrix(), чтобы расширить ваши факторы заранее (после этого поста переполнения стека ):

df2 <- model.matrix( ~ review_scores_rating + instant_bookable + cancellation_policy + 
                        host_since_cat + host_location_cat + host_response_time + 
                        host_is_superhost + host_listings_cat + property_type + room_type + 
                        accommodates + bedrooms + beds + price + security_deposit + 
                        cleaning_fee + extra_people + minimum_nights + amenityBreakfast + 
                        amenityAC + amenityElevator + amenityKitchen + amenityHostGreeting + 
                        amenitySmoking + amenityPets + amenityWifi + amenityTV - 1, data = listingsRating)
undebug(boot)

set.seed(123)
bootResults <- boot(statistic = bootReg, formula = review_scores_rating ~ .,
                    data = as.data.frame(df2), R = 2)

(Обратите внимание, что во всем случае я уменьшаю R до 2 только для более быстрого выполнения во время отладки).

0 голосов
/ 27 октября 2018

То, как вы определяете bootReg и называете его неверно.
Во-первых, вы должны придерживаться порядка аргументов функции statistic, в данном случае bootReg.Первым аргументом является набор данных , а вторым аргументом является indexes .Затем идут другие, необязательные аргументы .

bootReg <- function (data, i, formula){
  d <- data [i, ]
  fit <- lm(formula, data = d)
  return(coef(fit))
}

Во-вторых, при вызове другие необязательные аргументы будут переданы в аргументе dots ....Итак, еще раз, придерживайтесь порядка аргументов, как определено в help("boot"), раздел Usage.

bootResults <- boot(data = iris, statistic = bootReg, R = 2000, 
                    formula = Sepal.Length ~ Sepal.Width)

colMeans(bootResults$t)
#[1]  6.5417719 -0.2276868
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...