#r #statistics #linear-regression
#r #Статистика #линейная регрессия
Вопрос:
Я хочу настроить формулу, используемую в geom_smooth, следующим образом:
library(MASS)
library(ggplot2)
data("Cars93", package = "MASS")
str(Cars93)
Cars93.log <- transform(Cars93, log.price = log(Price))
log.model <- lm(log.price ~ Horsepower*Origin, data = Cars93.log)
summary(log.model)
plot(log.model)
p <- ggplot(data = Cars93.log, aes(x = Horsepower, y = log.price, colour = Origin))
geom_point(aes(shape = Origin, color = Origin)) # Punkte
facet_grid(~ Origin)
theme(axis.title.x = element_text(margin=margin(15,0,0,0)),
axis.title.y = element_text(margin=margin(0,15,0,0)))
scale_y_continuous(n.breaks = 7)
scale_colour_manual(values = c("USA" = "red","non-USA" = "black"))
scale_shape_manual(values = c(16,16))
ylab("Price(log)")
lm.mod <- function(df) {
y ~ x*Cars93.log$Origin
}
p_smooth <- by(Cars93.log, Cars93.log$Origin,
function(x) geom_smooth(data=x, method = lm, formula = lm.mod(x)))
p p_smooth
Однако я получаю сообщение об ошибке, что вычисление завершилось неудачно из-за разной длины используемых мной переменных.
length(Cars93.log$log.price)
length(Cars93.log$Origin)
length(Cars93.log$Horsepower)
Но когда я проверяю длину для каждой переменной, все они одинаковы… Есть идеи, что не так?
Большое спасибо, Мартина
Комментарии:
1. Вы уже ограняете
Origin
, нет необходимости включатьOrigin
в формулу, попробуйтеp geom_smooth(method = lm, formula = y ~ x)
.2. И длины разные: ваша пользовательская функция получает только
x
соответствующие каждому аспекту и всему векторуCars93.log$Origin
.
Ответ №1:
Я согласен с @Rui Barradas, похоже, проблема в строках для lm.mod
и p_smooth
и by
функции
Как только вы проведете различие по происхождению (например, выполнив либо facet_wrap
или color = Origin
), geom_smooth
автоматически будут запущены различные модели для этих аспектов.
p <- ggplot(data = Cars93.log,
aes(x = Horsepower, y = log.price, color = Origin))
geom_point(aes(shape = Origin))
facet_wrap(~ Origin)
theme(axis.title.x = element_text(margin=margin(15,0,0,0)),
axis.title.y = element_text(margin=margin(0,15,0,0)))
scale_y_continuous(n.breaks = 7)
scale_colour_manual(values = c("USA" = "red","non-USA" = "black"))
scale_shape_manual(values = c(16,16))
ylab("Price(log)")
p geom_smooth(method = lm, formula = y ~ x)
вы можете убедить себя, что это то же самое, что и результат log.model
, расширив пределы оси x, чтобы увидеть, где линия geom_smooth пересекает ось y (например, coord_cartesian(xlim = c(0, 300))
)
Вы также можете увидеть разницу на графике, если не перейдете color = Origin
к geom_smooth
функции (по сути, что происходит, если вы прокомментируете это с первой инициализации ggplot()):
p <- ggplot(data = Cars93.log,
aes(x = Horsepower, y = log.price)) # color = Origin))
geom_point(aes(shape = Origin))
#facet_wrap(~ Origin)
theme(axis.title.x = element_text(margin=margin(15,0,0,0)),
axis.title.y = element_text(margin=margin(0,15,0,0)))
scale_y_continuous(n.breaks = 7)
scale_colour_manual(values = c("USA" = "red","non-USA" = "black"))
scale_shape_manual(values = c(16,16))
ylab("Price(log)")
p geom_smooth(method = lm, formula = y ~ x)
Комментарии:
1. @ Rui Barradas, cmilando: большое спасибо за ваши комментарии, теперь понятно, почему я получил эту ошибку. У меня остался один вопрос: включено ли взаимодействие также в geom_smooth, поскольку оно использует только стандартную модель y ~ x?
2. @Martina — да, это взаимодействие включено в geom_smooth, поскольку оно создает две отдельные сглаженные линии из каждой исходной точки. вы можете видеть, что произойдет, если вы не используете color = Origin или facet_wrap (~Origin) в коде, который я опубликовал выше