Мультипликативная регрессия

Я пытаюсь оценить модель регрессии для набора данных с одной непрерывной зависимой переменной (y) и тремя категориальными независимыми переменными (x1,x2,x3). Например, представьте, что y — это цена, которую вы платите за смартфон, а x — это три функции (скажем, цвет, размер и место для хранения).

Я предполагаю, что каждая функция представляет собой мультипликативный фактор по отношению к (неизвестной) базовой цене. Таким образом, если базовая цена вашего телефона составляет 100, красный цвет увеличит ее на 25%, большой размер уменьшит ее на 50%, а большой объем памяти увеличит на 75%. Это означает, что окончательная цена телефона будет 100 х (1+0,25) х (1-0,50) х (1+0,75) = 109,375.

Проблема в том, что я знаю только конечную цену (а не базовую цену) и отдельные характеристики. Как я могу оценить мультипликативные факторы, связанные с этими функциями? Я написал краткое моделирование в R ниже, чтобы проиллюстрировать эту проблему.

Спасибо за вашу помощь в этом,

Майкл

x_fun   <- function() {
    tmp1                <- runif(N)
    tmp2                <- cut(tmp1, quantile(tmp1, probs=c(0, 1/3, 2/3, 3/3)))
    levels(tmp2)        <- seq(1:length(levels(tmp2)))
    tmp2[is.na(tmp2)]   <- 1
    as.factor(tmp2)}

N       <- 1000

x1      <- x_fun()
x2      <- x_fun()
x3      <- x_fun()

f1      <- 1+0.25*(as.numeric(x1)-2)
f2      <- 1+0.50*(as.numeric(x2)-2)
f3      <- 1+0.75*(as.numeric(x3)-2)

y_Base  <- runif(min=0, max=1000, N)
y       <- y_Base*f1*f2*f3

output  <- data.frame(y, x1, x2, x3)
rm(y_Base, f1, f2, f3, N, y, x_fun, x1, x2, x3)

person Michael Haenlein    schedule 20.09.2016    source источник
comment
Базовой ценой будет цена с функциями 1,1,1. Т.е. наименьшее значение фактора для каждой переменной. Это то, что R также принимает за основу, если вы используете glm модели. Обратимся к вашему примеру: как бы вы определили цену телефона без размера и без экрана? Люди обычно берут за основу телефон с самыми низкими характеристиками.   -  person niczky12    schedule 20.09.2016
comment
@niczky12 Возможно, это не так просто. Я полагаю, что по этой логике базовая цена составляет -278,7348 вместо 499.   -  person Hack-R    schedule 20.09.2016
comment
Просто для ясности: есть ли в вашей модели только одна базовая цена для всех N наблюдений?   -  person Weihuang Wong    schedule 20.09.2016
comment
@WeihuangWong Я думаю, что базовая цена - это переменная y_Base, изменяющаяся от 0 до 1000 со средним значением около 500.   -  person Hack-R    schedule 20.09.2016
comment
Я не уверен, правильно ли это настроено - не должно ли среднее значение y_Base быть значительно ниже среднего значения y? Кажется, что y имеет больший диапазон, но средние значения равны (+/- небольшая случайная вариация).   -  person Hack-R    schedule 20.09.2016
comment
@WeihuangWong Базовая цена должна быть теоретической минимальной ценой товара без каких-либо его функций / атрибутов.   -  person Hack-R    schedule 20.09.2016


Ответы (1)


Я думаю, вы можете сделать это следующим образом, если вы знаете базовые уровни ваших факторов:

N       <- 1000
set.seed(42)
x1      <- x_fun()
x2      <- x_fun()
x3      <- x_fun()

f1      <- 1+0.25*(as.numeric(x1)-2)
f2      <- 1+0.50*(as.numeric(x2)-2)
f3      <- 1+0.75*(as.numeric(x3)-2)

y_Base  <- runif(min=0, max=1000, N)
y       <- y_Base*f1*f2*f3

str(x1)

output  <- data.frame(y, x1, x2, x3)
#rm(y_Base, f1, f2, f3, N, y, x_fun, x1, x2, x3)


output[, c("x1", "x2", "x3")] <- lapply(output[, c("x1", "x2", "x3")], relevel, ref = "2")

fit <- glm(y ~ x1 + x2 + x3, data = output, family = gaussian(link = "log"))
summary(fit)
predbase <- exp(log(output$y) - predict(fit, type = "link") + coef(fit)["(Intercept)"])


library(ggplot2)
ggplot(data.frame(x = y_Base, y = predbase, output[, c("x1", "x2", "x3")]),
       aes(x = x, y = y)) +
  geom_point() +
  facet_wrap( ~ x1 + x2 + x3) +
  geom_abline(slope = 1, color = "dark red")

результат

person Roland    schedule 20.09.2016
comment
Я не уверен, что это совпадение, так как y и y_Base так близки (что, я думаю, может быть ошибкой в ​​​​симуляции), но когда я запускаю это, прогнозируемая база (predbase) имеет среднее значение (501,3), которое почти идентична конечной цене (501,9) вместо базовой цены (512,3). - person Hack-R; 20.09.2016
comment
y и y_Base совсем не близки. Я не уверен, почему вы фокусируетесь на средних значениях здесь. AFAIU, цель — получить базовый приз за каждое наблюдение. - person Roland; 20.09.2016
comment
@WeihuangWong Я не понимаю, что вы имеете в виду под постоянным базовым призом. Разве не было целью получить базовый приз за каждое наблюдение? - person Roland; 20.09.2016
comment
Под не близко вы говорите, что 512 не близко к 500 относительно влияния атрибутов продукта?? Разве вы не ожидаете, что базовая цена (не приз, цена) будет меньше конечной цены по определению? и почему ваше прогнозируемое среднее значение конечной цены, а не базовой цены? Как я уже говорил, базовая и окончательная цены не должны быть почти одинаковыми, и базовая цена должна быть ниже по определению. Кроме того, это оценивает конечную цену, а не базовую цену. - person Hack-R; 20.09.2016
comment
@ Hack-R Я не понимаю ваших возражений, и последнее предложение просто неверно. Сравните эти: output[521, ]; y_Base[521]; predbase[521]. - person Roland; 20.09.2016
comment
@Hack_R Обратите внимание, что способ генерации данных означает, что каждый фактор ниже 1 для группы 1 и выше 1 для группы 3. Таким образом, ожидаемое значение цены не отличается от средней базовой цены. - person Roland; 20.09.2016