Squeak.ru - шаблоны программирования

Функция вызова, которая суммирует фрейм данных на основе параметра и применяется к фрейму данных и nls

Я работаю с данными о погоде и счетами за коммунальные услуги и пытаюсь оценить модель нелинейной регрессии.

Я прихожу с проблемой. Функция, которую я вызываю для расчета статистики погоды, градусо-дней отопления и охлаждения (HDD и CDD), не может быть применена к фрейму данных, и nls не может ее использовать. Ясно, что я упускаю что-то довольно очевидное в аргументах функций.

Может ли кто-нибудь указать, где я ошибаюсь с функциями HDD и CDD ниже?

Вот простой пример проблемы с некоторым кодом, который генерирует поддельные данные о погоде и счетах.

# Generate Fake Weather Data
CZ<-c(1,2)
Date<-c('2001-01-01','2001-01-02','2001-01-03','2001-01-04')
Weather<-expand.grid(CZ,Date)
names(Weather)<-c("CZ","Date")
Weather$AvgTemp<-rnorm(8,mean= 60,sd=20)

#Generate Fake Billing Data
ID<-as.numeric(1:10)
CZ<-c(1,2)
StartDate<-'2001-01-01'
EndDate<-'2001-02-01'
FakeBilling<-data.frame(cbind(ID,CZ,StartDate,EndDate))
FakeBilling$KWH<-rnorm(10,mean=1000, sd=200)

#Heating and cooling degree functions
HDD<- function(b,CZ,StartDate,EndDate) {
    Temps<-Weather$AvgTemp[Weather$CZ==CZ&as.Date(Weather$Date) >=as.Date(StartDate) &     as.Date(Weather$Date) < as.Date(EndDate)];

    sum((b-Temps)/(1+exp(-5*(b-Temps))))
}


CDD <- function(b,CZ,StartDate,EndDate) {
Temps<- Weather$AvgTemp[as.character(Weather$CZ)==as.character(CZ) &     as.Date(Weather$Date) >=as.Date(StartDate)& as.Date(Weather$Date) < as.Date(EndDate)]

    sum((Temps-b)/(1+exp(-5*(Temps-b))))
}

#these work
HDD(60,1,'2001-01-01','2001-02-01')
# [1] 29.34333
CDD(60,1,'2001-01-01','2001-02-01')
# [1] 53.49393

# This does not. Lots of warnings about length
HDD(60,FakeBilling$CZ,FakeBilling$StartDate,FakeBilling$EndDate)
# [1] NA
# Warning messages:
#   1: In is.na(e1) | is.na(e2) :
#   longer object length is not a multiple of shorter object length
# 2: In `==.default`(Weather$CZ, CZ) :
#   longer object length is not a multiple of shorter object length
# 3: In `>=.default`(as.Date(Weather$Date), as.Date(StartDate)) :
#   longer object length is not a multiple of shorter object length
# 4: In `<.default`(as.Date(Weather$Date), as.Date(EndDate)) :
#   longer object length is not a multiple of shorter object length

# Would like to run this but get similar error.
nls(KWH~load + heatload*(HDD(base,CZ,StartDate,EndDate)) ,start=c(load=200,     heatload=.1,base=65), data=FakeBilling, na.action=na.omit)
# Error in numericDeriv(form[[3L]], names(ind), env) : 
#   Missing value or an infinity produced when evaluating the model
# In addition: Warning messages:
#   1: In is.na(e1) | is.na(e2) :
#   longer object length is not a multiple of shorter object length
# 2: In `==.default`(Weather$CZ, CZ) :
#   longer object length is not a multiple of shorter object length
# 3: In `>=.default`(as.Date(Weather$Date), as.Date(StartDate)) :
#   longer object length is not a multiple of shorter object length
# 4: In `<.default`(as.Date(Weather$Date), as.Date(EndDate)) :
#   longer object length is not a multiple of shorter object length
# 5: In is.na(e1) | is.na(e2) :
#   longer object length is not a multiple of shorter object length
# 6: In `==.default`(Weather$CZ, CZ) :
#   longer object length is not a multiple of shorter object length
# 7: In `>=.default`(as.Date(Weather$Date), as.Date(StartDate)) :
#   longer object length is not a multiple of shorter object length
# 8: In `<.default`(as.Date(Weather$Date), as.Date(EndDate)) :
#   longer object length is not a multiple of shorter object length

Ответы:


1

Ваша функция не настроена как векторизованная функция. Вы можете использовать mapply().

with(FakeBilling, mapply(HDD, b = 60, CZ = CZ, StartDate = StartDate, EndDate = EndDate))
#----
[1] 29.33481 13.39434 29.33481 13.39434 29.33481 13.39434 29.33481 13.39434 29.33481 13.39434

Существует также функция Vectorize(), которая дает эквивалентные результаты:

HDDvec <- Vectorize(HDD)
HDDvec(60,FakeBilling$CZ,FakeBilling$StartDate,FakeBilling$EndDate)
#----
[1] 29.33481 13.39434 29.33481 13.39434 29.33481 13.39434 29.33481 13.39434 29.33481 13.39434
05.11.2012
  • Спасибо. Я знал, что где-то потерял свой нос. 05.11.2012
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...