График полиномиальной регрессии и ошибка «новые данные» - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь лучше понять, почему stat smooth не будет отображать мою линию полиномиальной регрессии, если только моя переменная x (независимая переменная) не будет назначена в качестве значения вне графика (например, x <- набор данных $ Salary) </p>

Dataset

dataset <- tibble(Level = 1:10,
                  Salary = c(45000, 50000, 60000, 80000, 110000, 150000, 200000, 300000, 500000, 1000000))

Начальный график, который возвращает ошибку

Ошибка: у 'newdata' было 80 строк, но у найденных переменных 10 строк

ggplot(data = dataset, aes(x = Level, y = Salary)) +
  geom_point(color = "red") +
  stat_smooth(method = "lm", se = FALSE, formula = dataset$Salary ~
      poly(dataset$Level, 3)) +
  ggtitle("Truth or Bluff (Linear Regression)") +
  xlab("Level ") +
  ylab("Salary") +
  theme(plot.title = element_text(hjust = 0.5))

Решение, которое сработало

x <- dataset$Level

ggplot(data = dataset, aes(x = Level, y = Salary)) +
  geom_point(color = "red") +
  stat_smooth(method = "lm", se = FALSE, formula = dataset$Salary ~ 
      poly(x, 3)) +
  ggtitle("Truth or Bluff (Linear Regression)") +
  xlab("Level ") +
  ylab("Salary") +
  theme(plot.title = element_text(hjust = 0.5))

Из моего понимания

x <- набор данных $ Зарплата не отличается от набора данных $ Зарплата за исключением того, что содержится в значении. Я думал только, что это связано с тем, как poly () рассматривает x, числовой вектор и как он рассматривает набор данных $ Salary как извлеченный вектор. Я </p>

Кроме этого, я ожидал бы того же результата, но это не так.

Я также попытался переименовать x в t, и он делает именно то, что сделал первый граф, поэтому я не понимаю, почему x так важно, если это просто имя значения.

t <- dataset$Level

ggplot(data = dataset, aes(x = Level, y = Salary)) +
  geom_point(color = "red") +
  stat_smooth(method = "lm", se = FALSE, formula = dataset$Salary ~ 
      poly(t, 3)) +
  ggtitle("Truth or Bluff (Linear Regression)") +
  xlab("Level ") +
  ylab("Salary") +
  theme(plot.title = element_text(hjust = 0.5))

1 Ответ

0 голосов
/ 18 января 2019

от formula до stat_smooth использует сопоставленную эстетику, то есть x и y (как вы отобразили x=Level, y=Salary). Если бы вы нанесли на карту colour=SomeVariable, вам также пришлось бы использовать colour вместо SomeVariable.

так

stat_smooth(..., formula=y ~ poly(x, 3))

Причина, по которой вы получаете предупреждение

In addition: Warning message:
'newdata' had 80 rows but variables found have 10 rows 

означает, что ваши данные dataset имеют 10 строк. Однако stat_smooth получает подгонянные значения Y модели более 80 точек X, чтобы получить гладкую линию, поэтому эти длины не совпадают.

Причина, по которой вы не получаете ошибку при использовании poly(x, 3) в формуле, заключается в том, что этот x разрешает x построенного фрейма данных ggplot, а не глобальный x вы определили.

Аналогично, причина, по которой вы do получаете ошибку с poly(t, 3), заключается в том, что t не находится в построенном кадре данных ggplot, поэтому следующий t в пути поиска - это глобальный t.

...