У меня замерзли мозг, и я надеюсь, что один из вас может указать мне в правильном направлении. Моя конечная цель - результат различных коэффициентов регрессии (в основном интересующихся ценовой эластичностью), которые я достиг с помощью простой множественной регрессии, используя функцию «by».Идеи повторной записи регрессии цикла с петлями 'for'
Я использую функцию «by» для циклического преобразования формулы регрессии для каждой итерации переменной «State.UPC». Поскольку мои данные довольно большие (~ 1MM строк), я должен был подмножить свои данные в группы из 3-4 состояний (см. Mystates1 ... mystates10). Затем я выполняю регрессию на этих подмножествах, каждый раз меняя свой источник данных в кадре данных «datastep3». И здесь я нуждаюсь в вашей помощи:
Каков наилучший способ эффективно переписать это с помощью комбинации существующей функции регрессии «by» и «для» циклов, поэтому я могу обойти шаг постоянно изменяя имя фрейма данных в шагах «datastep3» и «write.csv». По существу, R циклически перебирает каждый подмножество данных «mystates» и выполняет регрессию с помощью атрибутов «State.UPC»?
Я пробовал несколько комбинаций без успеха. Помилование дилетантский вопрос ... еще учусь R. Вот мой код:
data <-read.csv("PriceData.csv")
datastep1 <-subset(data, subset=c(X..Vol>0, Unit.Vol>0))
datastep2 <- transform(datastep1, State.UPC = paste(State,UPC, sep="."))
mystates1 <- c("AL","AR","AZ")
mystates2 <- c("CA","CO","FL")
mystates3 <- c("GA","IA","IL")
mystates4 <- c("IN","KS","KY")
mystates5 <- c("LA","MI","MN")
mystates6 <- c("MO","MS","NC")
mystates7 <- c("NJ","NM","NV")
mystates8 <- c("NY","OH","OK")
mystates9 <- c("SC","TN","TX")
mystates10 <- c("UT","VA","WI","WV")
datastep3 <-subset(datastep2, subset=State %in% mystates10)
datastep4 <-na.omit(datastep3)
PEbyItem <- by(datastep4, datastep4$State.UPC, function(df)
lm(log(Unit.Vol)~log(Price) + Distribution+Independence.Day+Labor.Day+Memorial.Day+Thanksgiving+Christmas+New.Years+
Year+Month, data=df))
x <- do.call("rbind",lapply(PEbyItem, coef))
y <-data.frame(x)
write.csv(x, file="mystates10.csv", row.names=TRUE)
Это прекрасно работает - большое спасибо. Изучит код, чтобы полностью понять и использовать логику в будущем. – akakas
akakas - the \ * apply functions (apply, lapply, sapply, tapply и т. Д.) Являются одними из центральных рабочих лошадей «идиоматического» R. Вы получаете гораздо больше усилий для изучения их. Они не * обязательно * быстрее (в некоторых случаях, возможно, даже немного медленнее, чем хорошо написанный цикл), но они делают более компактный и понятный/поддерживаемый код. –
Спасибо, @Glen_b. Я определенно буду работать над тем, чтобы эти функции были более встроены. – akakas