Ключом здесь является использование логической переменной is.right
, которая ИСТИНА для точек справа от 89 и ЛОЖЬ в противном случае.
Из показанных выходных данных 60,88 - наклон слева от 89 и -19,97 это уклон вправо. Линии пересекаются на Количество = 89, Продажи = 4817.30.
is.right <- df$Quantity > 89
fm <- lm(Sales ~ diff : is.right, df)
fm
## Call:
## lm(formula = Sales ~ diff:is.right, data = df)
##
## Coefficients:
## (Intercept) diff:is.rightFALSE diff:is.rightTRUE
## 4817.30 60.88 -19.97
Альтернативы
Альтернативно, если вы хотите использовать Xbar
из вопроса, сделайте это так. Он дает те же коэффициенты, что и fm
.
fm2 <- lm(Sales ~ diff : factor(Xbar), df)
или
fm3 <- lm(Sales ~ I(Xbar * diff) + I((1 - Xbar) * diff), df)
Двойная проверка с помощью nls
Мы можем проверить это дважды, используя nls
с следующая формулировка, которая использует тот факт, что если мы расширим обе строки, то та, которую нужно использовать для любого количества, будет меньше двух.
st <- list(a = 0, b1 = 1, b2 = -1)
fm4 <- nls(Sales ~ a + pmin(b1 * (Quantity - 89), b2 * (Quantity - 89)), start = st)
fm4
## Nonlinear regression model
## model: Sales ~ a + pmin(b1 * (Quantity - 89), b2 * (Quantity - 89))
## data: parent.frame()
## a b1 b2
## 4817.30 60.88 -19.97
## residual sum-of-squares: 713120
##
## Number of iterations to convergence: 1
## Achieved convergence tolerance: 2.285e-09
Это также будет работать:
fm5 <- nls(Sales ~ a + ifelse(Quantity > 89, b2, b1) * diff, df, start = st)
Сюжет
Вот сюжет:
plot(Sales ~ Quantity, df)
lines(fitted(fm) ~ Quantity, df)
Модель матрицы
А вот модель матрица для линейной регрессии:
> model.matrix(fm)
(Intercept) diff:is.rightFALSE diff:is.rightTRUE
1 1 -64 0
2 1 -50 0
3 1 -44 0
4 1 -32 0
5 1 -19 0
6 1 -4 0
7 1 0 0
8 1 0 11
9 1 0 21
10 1 0 35
11 1 0 48
12 1 0 61
13 1 0 88