Почему я не могу подогнать кривую к этому сюжету? - PullRequest
0 голосов
/ 13 ноября 2018

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

Код:

library(ggplot2)

data <- data.frame(pressure = c(400, 200, 100, 50, 25, 12.5, 6.25, 3.125),
               volume = c(.25, .5, 1, 2, 4, 8, 16, 32))


plot(data, ylim = c(min(data[,2]), max(data[,2])), xlim = c(min(data[,1]), max(data[,1])),
 pch = 19, col = "firebrick")

lm_fit <- lm(data$pressure ~ poly(data$volume, 2, raw = TRUE))

lines(data$volume, predict (lm_fit, data.frame(x = data$volume)), col = "red")

Результат:

Curve does not fit data

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Ваша основная проблема заключается в использовании data$ внутри вашей регрессионной модели: вы должны использовать только имена переменных.

dd <- data.frame(pressure = c(400, 200, 100, 50, 25, 12.5, 6.25, 3.125),
                 volume = c(.25, .5, 1, 2, 4, 8, 16, 32))
lm_fit <- lm(pressure ~ poly(volume, 2, raw = TRUE),
             data=dd)

Для более гладкой кривой я вычислил предсказанное значение с более точной последовательностьюvolume значения:

pframe <- data.frame(volume=seq(0,30,length=51))
pframe$pressure <- predict(lm_fit,newdata=pframe)

Теперь картинка:

## png("SO_poly.png")
par(las=1,bty="l") ## cosmetic
plot(pressure~volume, data=dd, pch = 19, col = "firebrick",
     ylim=c(-100,500))

with(pframe, lines(volume, pressure, col="red"))

Это выглядит не очень хорошо, поэтому я попробовал другие подгонки кривой.

Логарифмическая подгонка:

lm_fit2 <- lm(log(pressure) ~ poly(volume, 2, raw = TRUE),
             data=dd)
pframe$lpressure <- exp(predict(lm_fit2,newdata=pframe))
with(pframe, lines(volume, lpressure, col="purple"))

Экспоненциальная подгонка:

glm_fit <- glm(pressure ~ poly(volume,2),
               family=gaussian(link="log"),
               data=dd)
pframe$gpressure <- predict(glm_fit, newdata=pframe, type="response")
with(pframe, lines(volume, gpressure, col="blue"))
## dev.off()

enter image description here

Вы также можетеиспользуйте ggplot2:

library(ggplot2)
ggplot(dd, aes(volume,pressure))+
    geom_point()+
    geom_smooth(method="lm",
                formula=y~poly(x,2))
0 голосов
/ 13 ноября 2018

Используйте ggplot2: geom_smooth lm method

library(ggplot2)

df <- data.frame(pressure = c(400, 200, 100, 50, 25, 12.5, 6.25, 3.125),
                   volume = c(.25, .5, 1, 2, 4, 8, 16, 32))

# Fit a regression line. Change the method if you want the exponential fitting
ggplot(data = df, aes(x = pressure, y = volume)) +
  geom_point() +
  geom_smooth(method = "lm")

# If you just want to connect the dots
ggplot(data = df, aes(x = pressure, y = volume)) +
  geom_point() +
  geom_line()

enter image description here enter image description here

...