boxplot с линейной подгонкой не использует коэффициенты

Я попробовал простую блочную диаграмму двух категорий (тип передачи — 0 или 1) с добавленной линейной подгонкой и ожидал, что она пройдет через блочные диаграммы, но здесь что-то не так:

linearFit <- lm(mpg~am, data=mtcars)
boxplot(mpg~am, data=mtcars) 
abline(linearFit, lwd=2, col="blue")

linearFit$coefficients
# (Intercept)          am 
#   17.147368    7.244939

Однако линия выходит далеко за пределы двух диаграмм вместо того, чтобы проходить через точку пересечения для «категории» 0. Как я могу сказать R использовать средства категории в базовой системе построения графиков?

РЕДАКТИРОВАТЬ, чтобы уточнить: поэтому мне просто нужна одна синяя линия, которая проходит через (0, 17,14) и (1, 17,14 + 7,244) в этой блочной диаграмме, где переменная «am» (тип передачи) является фактором вместо числовая переменная. Есть ли простой способ сделать это в базовой системе построения графиков?


person Andi    schedule 24.10.2014    source источник
comment
спасибо за редактирование, Хенрик!   -  person Andi    schedule 24.10.2014


Ответы (1)


Поскольку am рассматривается как фактор, коэффициент для am представляет собой сдвиг к точке пересечения. Таким образом, вы должны добавить это к перехвату, чтобы получить перехват am=1.

linearFit <- lm(mpg~am, data=mtcars)
boxplot(mpg~am, data=mtcars, border=1:2 )
abline(h=c(linearFit$coefficients[1], linearFit$coefficients[1]+linearFit$coefficients[2]), col=1:2, lty=2, lwd=2)

введите здесь описание изображения

Кроме того, значимость термина am можно проверить путем сравнения с моделью, в которую включена только точка пересечения (т. е. "1").

linearFit0 <- lm(mpg~1, data=mtcars) # model with intercept only
anova(linearFit0, linearFit)

Изменить - построение графика вне коробки

plot(x=c(0,1), res$stats[3,], ylim=range(res$stats))
segments(x0=c(0,1), x1=c(0,1), y0=res$stats[2,], y1=res$stats[4,])
abline(linearFit)

введите здесь описание изображения

Edit2 - значения сдвига для boxplot

linearFit <- lm(mpg~I(am+1), data=mtcars)
boxplot(mpg~I(am+1), data=mtcars, border=1:2 )
abline(linearFit$coefficients, col=1:2, lty=2, lwd=2)
person Marc in the box    schedule 24.10.2014
comment
Привет, спасибо за объяснение. Но ваш код создает две горизонтальные линии - мне нужна одна строка, проходящая через средства каждой категории/фактора. - person Andi; 24.10.2014
comment
Это то, что вы получаете (или я не совсем понимаю ваш вопрос) - каждая строка представляет собой среднее значение уровней фактора am 0 и 1. - person Marc in the box; 24.10.2014
comment
извините, мне нужна только одна синяя линия, которая проходит через (0, 17,14) и (1, 17,14+7,244), но факторы здесь как-то ломают - person Andi; 24.10.2014
comment
Я думаю, что вы не полностью понимаете результат своей модели, если хотите это сделать - am не является непрерывной переменной, и поэтому наклонная линия не подходит. - person Marc in the box; 24.10.2014
comment
хм, я понимаю, что линия между 0 и 1 не имеет смысла, но она определенно показывает тенденцию, верно? Итак, как мне сначала преобразовать его в числовую переменную, а затем установить метки на оси x только 0 и 1 (т.е. я хочу подделать числовые значения, если это то, что нужно) - person Andi; 24.10.2014
comment
Проблема в том, что уровень am=0 на самом деле отображается при x=1, а am=1 при x=2. Получается некрасиво, но сейчас я покажу, как извлечь результаты из ящичковой диаграммы и построить график вне функции. - person Marc in the box; 24.10.2014
comment
хм, ваше объяснение интересно, но когда я вместо этого рисую abline(lm(mpg~as.numeric(am+1), data=mtcars), lwd=2, col="blue"), наклон не совсем подходит - person Andi; 24.10.2014
comment
Не добавляйте +1 к am. Только boxplot рассматривает это как фактор: plot(mpg~am, data=mtcars); abline(lm(mpg~am, data=mtcars), lwd=2, col="blue") - person Marc in the box; 24.10.2014
comment
Нет, моя точка зрения заключалась в следующем: если в блочной диаграмме просто использовались неправильные координаты x для построения графика, то сдвиг аблайна должен давать правильный результат, но это не так, поэтому происходит другое преобразование. Итак, теперь возникает вопрос: как добавить ящичные диаграммы в график с числовой осью X? :-) - person Andi; 24.10.2014
comment
На самом деле вы были правы с простым преобразованием (сдвиг x), я просто забыл, что мы видим медианы, а не средние значения в диаграммах, поэтому, выполняя сдвиг (am + 1) и добавляя это points(c(lmCoef[1], lmCoef[1]+lmCoef[2]),col="red",pch=19), мы видим, что линия имеет правильный склон! Если вы добавите это к своему ответу, я могу принять его - большое спасибо за указание на преобразование! - person Andi; 24.10.2014