Как добавить линии регрессии для каждого фактора на графике - PullRequest
0 голосов
/ 29 марта 2019

Я создал модель и пытаюсь добавить кривые, которые соответствуют двум частям данных: изоляция и отсутствие изоляции.Я думал об использовании коэффициента изоляции в качестве истинного / ложного термина, но я не уверен, как перевести это в код.Записи 1:56 - без, а 57: 101 - без.Я не уверен, как включить данные, которые я использую, но вот голова и хвост:

  month year  kwh days est   cost avgT dT.yr   kWhd.1 id insulation
1     8 2003  476   21   a  33.32   69    -8 22.66667  1        w/o
2     9 2003 1052   30   e 112.33   73    -1 35.05172  2        w/o
3    10 2003  981   28   a  24.98   60    -6 35.05172  3        w/o
4    11 2003 1094   32   a  73.51   53     2 34.18750  4        w/o
5    12 2003 1409   32   a  93.23   44     6 44.03125  5        w/o
6     1 2004 1083   32   a  72.84   34     3 33.84375  6        w/o

    month year kwh days est  cost avgT dT.yr   kWhd.1  id insulation
96      7 2011 551   29   e 55.56   72     0 19.00000  96         w/
97      8 2011 552   27   a 61.17   78     1 20.44444  97         w/
98      9 2011 666   34   e 73.87   71    -2 19.58824  98         w/
99     10 2011 416   27   a 48.03   64     0 15.40741  99         w/
100    11 2011 653   31   e 72.80   53     1 21.06452 100         w/
101    12 2011 751   33   a 83.94   45     2 22.75758 101         w/
bill$id <- seq(1:101)
bill$insulation <- as.factor(ifelse(bill$id > 56, c("w/"), c("w/o")))

m1 <- lm(kWhd.1 ~ avgT + insulation + I(avgT^2), data=bill)

with(bill, plot(kWhd.1 ~ avgT, xlab="Average Temperature (F)", 
                ylab="Daily Energy Use (kWh/d)", col=insulation))

no_ins <- data.frame(bill$avgT[1:56], bill$insulation[1:56])
curve(predict(m1, no_ins=x), add=TRUE, col="red")

ins <- data.frame(bill$avgT[57:101], bill$insulation[57:101])
curve(predict(m1, ins=x), add=TRUE, lty=2)

legend("topright", inset=0.01, pch=21, col=c("red", "black"), 
       legend=c("No Insulation", "Insulation"))

Ответы [ 2 ]

1 голос
/ 29 марта 2019

ggplot2 делает это намного проще, чем базовый график. Примерно так должно работать:

ggplot(bill, aes(x = avgT, y = kWhd.1, color = insulation)) +
  geom_smooth(method = "lm", formula = y ~ x + I(x^2), se = FALSE) +
  geom_point()

В base я бы создал фрейм данных с точкой, по которой вы хотите прогнозировать, что-то вроде

pred_data = expand.grid(
  kWhd.1 = seq(min(bill$kWhd.1), max(bill$kWhd.1), length.out = 100),
  insulation = c("w/", "w/o")
)
pred_data$prediction = predict(m1, newdata = pred_data)

А затем используйте lines, чтобы добавить прогнозы к вашему графику. Моя базовая графика довольно ржавая, поэтому я оставлю это вам (или другому отвечающему), если хотите.

0 голосов
/ 29 марта 2019

В базе R важно упорядочить x -значения.Поскольку это должно быть сделано по нескольким факторам, мы можем сделать это с помощью by, в результате чего получится список L.

Поскольку данные в вашем примере не полны, вот пример с iris, где мырассмотрим Species как «фактор».

L <- by(iris, iris$Species, function(x) x[order(x$Petal.Length), ])

Теперь мы можем построить график и добавить loess предсказания как lines с sapply.

with(iris, plot(Sepal.Width ~ Petal.Length, col=Species))
sapply(seq(L), function(x) 
  lines(L[[x]]$Petal.Length, 
        predict(loess(Sepal.Width ~ Petal.Length, L[[x]], span=1.1)),  # span=1.1 for smoothing
        col=x))

Доходность

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...