Настройка формулы в geom-smooth / ggplot2 / R

#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) в коде, который я опубликовал выше