Байесовское моделирование в R

Я пытаюсь реализовать байесовскую модель в R, используя пакет bas с настройкой этих значений для моей модели:

databas <- bas.lm(at_areabuilding ~ ., data = dataCOMMA, method = "MCMC", prior = "ZS-null", modelprior = uniform())

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

Теперь, всякий раз, когда я пытаюсь предсказать область состояния, я ввожу этот ввод:

> UT <- data.frame(zip = 84321, loc_st_prov_cd = "UT" ,state_idx = 7)
> predict_1 <- predict(databas,UT, estimator="BMA", interval = "predict", se.fit=TRUE)
> data.frame('state' = 'UT','estimated area' = predict_1$Ybma)

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

 pred <- sapply(1:nrow(first), function(row) { predict(basdata,first[row, ],estimator="BMA", interval = "predict", se.fit=TRUE)$Ybma })

basdata: сначала моя модель: мой новый набор данных, для которого я предсказываю область. Теперь проблема, с которой я столкнулся, заключается в том, что коду требуется много времени для прогнозирования значений. Он перебирает каждую строку и вычисляет площадь. В моем наборе данных 150000 строк, и я хотел бы попросить, чтобы кто-нибудь помог мне оптимизировать производительность этого кода.


person Uttasarga Singh    schedule 17.06.2020    source источник
comment
Я не совсем уверен, что вы спрашиваете. Вы имеете в виду, что хотите получить прогнозы для многих комбинаций штата и почтового индекса? Если да, то откуда вы берете эти комбинации? Они уже есть в списке или во фрейме данных? Мы с большей вероятностью сможем помочь, если вы сможете более конкретно указать проблему, которую пытаетесь решить, и структуру ваших данных.   -  person eipi10    schedule 18.06.2020
comment
Да, я хочу получить прогнозы для многих комбинаций штата, почтового индекса и индекса штата. В настоящее время я получаю эти комбинации из CSV-файла, загруженного в переменную в виде фрейма данных. Я получаю всего 130 000 прогнозов, а в файле 150 000 номеров данных!   -  person Uttasarga Singh    schedule 18.06.2020
comment
Во втором фрагменте кода я использую переменную UT и ввожу zip, название штата и индекс штата. У меня есть CSV-файл со многими zip-файлами, именем штата и индексом штата, и я хочу предсказать область с помощью моей модели — базы данных.   -  person Uttasarga Singh    schedule 18.06.2020


Ответы (1)


Нечто подобное будет перебирать каждую строку вашего фрейма данных состояний, почтовых индексов и индексов (назовем это states_and_zips) и возвращать список прогнозов. Каждый элемент этого списка (который я назвал pred) соответствует соответствующей строке state_and_zips:

pred = lapply(1:nrow(states_and_zips), function(row) {
  predict(databas, ~ states_and_zips[row, ], 
          estimator="BMA", interval = "predict", se.fit=TRUE)$Ybma
})

Если Ybma является единственным значением, используйте sapply вместо lapply, и он вернет вектор прогнозов, по одному для каждой строки state_and_zips, который вы можете просто добавить в качестве нового столбца в states_and_zips.

person eipi10    schedule 17.06.2020
comment
Ybma будет списком предсказаний областей различных состояний, который дается в качестве входных данных. - person Uttasarga Singh; 18.06.2020
comment
Здравствуйте, сэр, у меня есть данные в noArea1; хранится в виде фрейма данных. Я применил sapply вместо lapply, как вы предложили. basdata - моя модель предиктора. Я дам вам знать, если это сработает; не могли бы вы один раз проверить, правильно ли я написал? pred ‹- sapply (1: nrow (noArea1), функция (строка) { предсказание (basdata, noArea1 [строка, ], оценка = BMA, интервал = предсказание, se.fit = TRUE) $ Ybma }) - person Uttasarga Singh; 18.06.2020
comment
Здравствуйте, я использовал код, который вы разработали выше, для прогнозирования области для небольшого набора данных из 20 записей. Это сработало! Однако я пытаюсь получить исходный набор данных (150000 записей), и код все еще работает. Должен ли он потреблять столько времени? - person Uttasarga Singh; 18.06.2020