R разница между stat_smooth и lm (с использованием журнала) в регрессии мощности? - PullRequest
2 голосов
/ 25 мая 2020

У меня есть некоторые данные:

library(ggplot2)    
x <-c(2600248.25,1303899.14285714,1370136.33333333,353105.857142857, 145446.952380952,299032,75142.2631578947,40381.1818181818,6133.93103448276,975.234567901235,779.341463414634)
    y <- c(4,7,6,14,21,9,19,22,29,81,41)

По которым я пытаюсь сделать регрессию и построить график. Моя проблема в том, что я хочу сделать регрессию и построить график ее против моих данных, но когда я использую lm для значений журнала, прогнозирования и построения графика, я получаю несколько иные результаты по сравнению со stat_smooth. Учитывая код:

    fit0 <- lm(log(y) ~ log(x))
    summary(fit0)

    newx <- x
    lm.fit <- predict(fit0, newdata = data.frame(x=newx), interval = "confidence")
    df <- as.data.frame(cbind(x,y,lm.fit))

    p <- ggplot(df, aes(x,y)) + geom_point() + geom_smooth(method = "lm", formula ="y~x") + scale_x_log10() + scale_y_log10()

p <- p + geom_line(aes(y=fit)) # result too low
p <- p +  geom_line(aes(y=10^fit)) # result too high

Как видно, я пробовал как с результатом журнала, так и с обратным преобразованием с использованием 10 ^ x. Как есть, две линейные модели должны показывать одинаковые значения? Что здесь не так, как мне получить правильные значения?

(моя конечная цель - иметь возможность строить интервалы прогнозирования)

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Запустите этот код, я надеюсь, это ответит на ваш вопрос:

создание модели

model=lm(y~x,df)

прогнозирование значения y из модели, которую мы создали, и присвоение прогнозируемого

predicted<-predict(model,newdata = x.df)

построение графика как для прогнозируемого, так и для реального значения x

p<-ggplot(df, aes(x))+ scale_x_log10()+ geom_smooth(method='lm', aes(y=y), col='red')

эта строка делает реальное значение или исходный график

добавляя прогнозируемая точка или данные на том же графике

p<- p+ geom_smooth(method='lm', aes(y=predicted), col='blue')

enter image description here

1 голос
/ 25 мая 2020

Вы использовали масштаб log10 в ggplot, но log для расчета. В R использование только log() означает, что вы используете натуральный логарифм. Когда вы вместо этого используете log10(), вы видите, что нет разницы между geom_smooth и lm. Поскольку ggplot просто вызывает подпрограмму lm, ожидается, что результат будет таким же.

library(ggplot2)    
x <-c(2600248.25,1303899.14285714,1370136.33333333,353105.857142857, 145446.952380952,299032,75142.2631578947,40381.1818181818,6133.93103448276,975.234567901235,779.341463414634)
y <- c(4,7,6,14,21,9,19,22,29,81,41)

fit0 <- lm(log10(y) ~ log10(x))
summary(fit0)

newx <- x
fit <- predict(fit0, newdata = data.frame(x=newx), interval = "confidence")
df <- as.data.frame(cbind(x,y))

p <- ggplot(df, aes(x,y)) + geom_point() + geom_smooth(method = "lm", formula ="y~x") + scale_x_log10() + scale_y_log10()
p <- p +  geom_line(aes(y=10^fit[,1])) 
p

Черная и синяя линии перекрываются, поэтому их трудно увидеть. Тем не менее, это выходной график: output


Для получения дополнительной информации проверьте документацию .

log вычисляет логарифмы, по умолчанию натуральные логарифмы, log10 вычисляет общие (т. Е. С основанием 10) логарифмы, а log2 вычисляет двоичные (т. Е. С основанием 2) логарифмы. Общая форма log(x, base) вычисляет логарифмы с основанием.

...