首先是使用的代码。
ggplot(correlation, aes(x=area_ha, y=extent_2000_ha))
+ geom_point( color="green") + theme_ipsum()
+ theme(text=element_text(family="Times New Roman", size=14))
+ scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})
+ scale_y_continuous(labels=scales::comma)
+ geom_smooth(method=lm, color="red", se=FALSE)
当我想放置线性趋势和置信区间(附图)时,OY 上出现负值(-200.000)。所有的值都是正值。没有负值。
如果只有回归线严格为正才有意义,那么标准线性回归就不是适合您的数据的模型。线性回归将简单地找到使数据到直线的平方距离最小化的直线。它并不关心这是否意味着该线在您认为不应该的地方变为负值。这是you需要构建到模型中的额外约束,这取决于数据的上下文和物理解释(我们只能从问题中的信息猜测)。
例如,您可以考虑固定截距为 0 的线性回归:
ggplot(correlation, aes(x = area_ha, y = extent_2000_ha)) +
geom_point( color = "green4", alpha = 0.2) +
theme_ipsum() +
theme(text=element_text(family="Times New Roman", size=14)) +
scale_y_continuous(labels = scales::comma) +
scale_x_continuous(labels = scales::comma, limits = c(0, 8e5)) +
geom_smooth(method = "lm", color = "red3", formula = y ~ x + 0,
fullrange = TRUE, alpha = 0.2)
或者可能是具有对数链接函数的广义线性模型:
ggplot(correlation, aes(x = area_ha, y = extent_2000_ha)) +
geom_point( color = "green4", alpha = 0.2) +
theme_ipsum() +
theme(text=element_text(family="Times New Roman", size=14)) +
scale_y_continuous(labels = scales::comma) +
scale_x_continuous(labels = scales::comma, limits = c(0, 8e5)) +
geom_smooth(method = "glm", color = "red", method.args = list(family = poisson),
fullrange = TRUE)
至于哪种模型最好,这是一个统计问题,而不是一个编程问题。因此,这里是题外话,但可能是CrossValidated的主题。
使用的数据
问题中没有包含数据,因此我从以下代码创建了一个类似的数据集来创建上述示例
library(ggplot2)
library(hrbrthemes)
set.seed(2)
correlation <- data.frame(area_ha = runif(100, 1, 8e5))
correlation$extent_2000_ha <- (correlation$area_ha +
rnorm(100, 0, correlation$area_ha))^2/9e6
correlation <- correlation[correlation$extent_2000_ha > 1e4,]
correlation <- correlation[correlation$extent_2000_ha < 1e6,]
correlation <- round(correlation)