【问题标题】:R difference between stat_smooth and lm (using log) in power regression?功率回归中stat_smooth和lm(使用log)之间的R差异?
【发布时间】:2020-09-12 06:29:02
【问题描述】:

我有一些数据:

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 转换回来。照原样,两个线性模型应该显示相同的值吗?这里有什么问题,我如何获得正确的值?

(我的最终目标是能够绘制预测区间)

【问题讨论】:

    标签: r ggplot2 regression linear-regression lm


    【解决方案1】:

    您在ggplot 上使用log10 缩放,但log 用于计算。在 R 中,仅使用 log() 表示您使用的是自然对数。当您改用log10() 时,您会发现geom_smoothlm 没有区别。由于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
    

    黑色和蓝色的线是重叠的,所以很难看到。不过,这是输出图:


    如需更多信息,请查看documentation

    log 计算对数,默认为自然对数,log10 计算 常用(即以 10 为底)对数,log2 计算二进制(即 基数 2) 对数。一般形式 log(x, base) 计算对数 带底座。

    【讨论】:

    • 谢谢!缺乏使用log10 是确切的问题!提醒自己ln = log。我想我已经习惯了其他程序的ln。阅读文档后,将其命名为 log 非常有意义。
    【解决方案2】:

    运行这段代码,我希望它能回答你的问题,

    制作模型

    model=lm(y~x,df)
    

    从我们制作的模型中预测 y 值并分配给预测的值

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

    绘制 x 的预测值和实际值的图

    p&lt;-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')
    

    【讨论】:

    • 如果您想拟合线性模型,这是一个很好的答案,否则(在我的情况下)本质上不是线性的。这就是我log 转换轴的原因。因此,在我的情况下它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 2020-03-26
    • 2020-10-12
    • 2013-01-17
    • 1970-01-01
    • 2013-12-27
    • 2021-08-31
    相关资源
    最近更新 更多