Создание цикла для линейной регрессии в R и печать коэффициента в дополнительном столбце (эластичность цены) - PullRequest
0 голосов
/ 04 мая 2018

У нас пока мало опыта работы с R, и нам нужно создать цикл. У нас есть набор данных, который содержит более 150 брендов с их объемом продаж и соответствующими ценами. Нам нужно запустить регрессию для каждого бренда (чтобы рассчитать 150 различных ценовых эластичностей). Поскольку мы не хотим вводить каждую lm-функцию для каждого бренда в наш R-скрипт, мы хотим использовать цикл, который более или менее автоматически создает функции регрессии для каждого бренда. Кроме того, нам нужно поместить коэффициент цены (который является ценовой эластичностью) в другой столбец информационного кадра (чтобы построить ценовую эластичность). Мы думали об использовании функции цикла for (), но это не сработало. Мы, вероятно, ошиблись в спецификации этой функции, потому что она рассчитывала только одну ценовую эластичность для всех брендов. У тебя есть идея? Мы с нетерпением ждем любой помощи:)

Это код нашей линейной регрессии:

Здесь мы создали фрейм данных для бренда «Budweiser»:

bud_all <- subset(brandlevel, brand=="Budweiser")    

Здесь мы запускаем регрессию, где log_move - это количество продаваемого Budweiser, а log_price - цена проданного товара:

reg_bud <-lm(log_move ~ log_price + as.factor(store), data = bud_all)     

Вот где мы получаем коэффициент:

summary(reg_bud)    

Вот наша первая попытка использовать цикл for, к сожалению, была рассчитана только одна эластичность цены для всех брендов:

out <- data.frame(NULL)
for (i in 1:brandlevel$brand){
  m <- summary(lm(log_move ~ log_price, data=brandlevel))
  out[i,1] <- m$coefficients[2,1]
}    

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете подогнать несколько моделей и получить их коэффициенты, используя код в соответствии с приведенным ниже описанием.
Вместо встроенного набора данных iris и его столбцов Species, Sepal.length и Petal.length используйте brandlevel и его столбцы brand, log_move и log_price.

data(iris)

out <- lapply(unique(iris$Species), function(s){
            sub_iris <- subset(iris, Species == s)
            m <- lm(Petal.Length ~ Sepal.Length, data = sub_iris)
            coef(m)
        })

out <- do.call(rbind, out)
out
#     (Intercept) Sepal.Length
#[1,]   0.8030518    0.1316317
#[2,]   0.1851155    0.6864698
#[3,]   0.6104680    0.7500808

РЕДАКТИРОВАТЬ.

С вашей моделью данных и регрессионной моделью (lm инструкция) вы бы сделали что-то вроде следующего. (Не проверено.)

out <- lapply(unique(brandlevel$brand), function(b){
            sub_df <- subset(brandlevel, brand == b)
            m <- lm(log_move ~ log_price, data = sub_df)
            coef(m)
        })

out <- do.call(rbind, out)

Две ноты.

  • Это та же логика, что и в примере iris выше.
  • Вам не нужно вызывать сложную функцию summary. Существуют функции для извлечения коэффициентов и других членов возвращаемого значения lm.
...