2014-04-01 3 views
0

У меня замерзли мозг, и я надеюсь, что один из вас может указать мне в правильном направлении. Моя конечная цель - результат различных коэффициентов регрессии (в основном интересующихся ценовой эластичностью), которые я достиг с помощью простой множественной регрессии, используя функцию «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) 

ответ

1

Невозможно проверить это, потому что вы не дают каких-либо данных, но теоретически можно просто объединить различные mystatesN в список, а затем запустить lapply(...) на этом.

## Not tested... 
get.PEbyItem <- function(i) { 
    datastep3 <-subset(datastep2, subset=State %in% mystates[[i]]) 
    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=paste(names(mystates[i]),"csv",sep="."), row.names=TRUE) 
} 

mystates <- list(ms1=mystates1, ms2=mystates2, ..., ms10=mystates10) 
lapply(1:length(mystates),get.PEbyItem) 

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

+0

Это прекрасно работает - большое спасибо. Изучит код, чтобы полностью понять и использовать логику в будущем. – akakas

+0

akakas - the \ * apply functions (apply, lapply, sapply, tapply и т. Д.) Являются одними из центральных рабочих лошадей «идиоматического» R. Вы получаете гораздо больше усилий для изучения их. Они не * обязательно * быстрее (в некоторых случаях, возможно, даже немного медленнее, чем хорошо написанный цикл), но они делают более компактный и понятный/поддерживаемый код. –

+0

Спасибо, @Glen_b. Я определенно буду работать над тем, чтобы эти функции были более встроены. – akakas

Смежные вопросы