使用 visreg R 将回归线限制为多图中的数据范围

limiting regression lines to data extent in a multi plot using visreg R

我在将 "visreg" 图中的回归线限制在每个图的数据范围内时遇到问题。他们目前绘制到整个数据框的范围,当我更改单个限制时,它仍然在视觉上绘制到整个数据框,但不是正确的数据点。我的示例代码如下:

CODrysub
         Humid Wet.sub.himid Dry.sub.himid Semi.arid Arid Hyper.arid
Nov 2004  2.20          2.22          2.16      2.03 1.79       1.68
Dec 2004  2.75          2.72          2.52      2.32 2.08       1.93
Jan 2005  2.98          2.92          2.68      2.43 2.18       2.03
Feb 2005  2.81          2.80          2.62      2.37 2.14       2.04
Mar 2005  2.43          2.44          2.33      2.16 1.99       1.96
Apr 2005  2.30          2.25          2.08      2.00 1.90       1.91

SMDrysub
         Humid Wet.sub.himid Dry.sub.himid Semi.arid Arid Hyper.arid
Nov 2004  0.26          0.21          0.15      0.08 0.05       0.07
Dec 2004  0.22          0.16          0.10      0.07 0.06       0.08
Jan 2005  0.19          0.12          0.08      0.07 0.07       0.09
Feb 2005  0.18          0.11          0.08      0.07 0.08       0.10
Mar 2005  0.18          0.13          0.09      0.07 0.07       0.10
Apr 2005  0.19          0.15          0.10      0.07 0.06       0.08

library(visreg)
Humida<-cbind(CODrysub[,1],SMDrysub[,1]) 
Humid2a<-as.data.frame(Humida)
colnames(Humid2a)<-c("CO","SM")
fit1a<-lm(CO~SM,data=Humid2a)

WSHa<-cbind(CODrysub[,2],SMDrysub[,2])
WSH2a<-as.data.frame(WSHa)
colnames(WSH2a)<-c("CO","SM")
fit2a<-lm(CO~SM,data=WSH2a)
##To plot
## Overall plot of an empty frame with dataframe labels
plot(0,xlim=c(0.05,0.31),ylim=c(1.5,3.4),cex.main=1, main= "(a) Scatterplots without soil moisture (Dry season)",xlab=NA,ylab=NA)

par(new=T)
visreg(fit1a,xlab="SM",ylab="CO",points=list(cex=1.2, pch=20,col="deepskyblue4") ,alpha=0.8,line=list(col="deepskyblue4",lwd=2),fill=list(col=adjustcolor("deepskyblue4", alpha.f = 0.09)), xlim=c(0.05,0.31),ylim=c(1.5,3.4),xaxt="n",yaxt="n")
par(new=T)
visreg(fit2a,xlab=NA,ylab=NA,points=list(cex=1.2, pch=20,col="dodgerblue1") ,line=list(col="dodgerblue1",lwd=2),fill=list(col=adjustcolor("dodgerblue1", alpha.f = 0.09)) ,xlim=c(0.05,0.31),ylim=c(1.5,3.4),alpha=0.8,xaxt="n",yaxt="n")

当我以这种方式绘制时,回归线趋于无穷大,尤其是对于我绘图左角的数据。我也尝试过定义单个数据限制,但它将我的点绘制到错误的数据框范围内。请问如何将回归线限制在数据范围内?

如果您想扩展绘图的 x(或 y)范围,而不是拟合线的范围,您应该首先使用 myPlotData <- visreg(myRegression, plot = FALSE) 创建绘图数据。然后您可以使用 plot.visreg() 绘制绘图,包括您的自定义 x 范围:plot.visreg(myPlotData, xlim = 0.05, 0.31)

以你的例子为例:

xlim <- c(0.05,0.31)
ylim <- c(1.5,3.4)

plot(0,xlim=xlim, ylim=ylim, cex.main=1, 
     main="(a) Scatterplots without soil moisture (Dry season)", 
     xlab=NA, ylab=NA)

par(new=T)
visreg1a <- visreg(fit1a, plot = FALSE)
plot.visreg(visreg1a, 
            xlab="SM", ylab="CO", points=list(cex=1.2, pch=20,col="deepskyblue4"), 
            alpha=0.8, line=list(col="deepskyblue4", lwd=2), 
            fill=list(col=adjustcolor("deepskyblue4", alpha.f = 0.09)), 
            xlim=xlim, ylim=ylim, xaxt="n", yaxt="n")

par(new=T)
visreg2a <- visreg(fit2a, plot = FALSE)
plot.visreg(visreg2a, 
            xlab=NA, ylab=NA, points=list(cex=1.2, pch=20,col="dodgerblue1"), 
            line=list(col="dodgerblue1",lwd=2), 
            fill=list(col=adjustcolor("dodgerblue1", alpha.f = 0.09)), 
            xlim=xlim, ylim=ylim, alpha=0.8,xaxt="n",yaxt="n")

这导致 但是,为什么要对每一行进行单独的回归分析呢?在这种情况下(如果没有特殊原因需要单独分析),我会把两个数据集拼在一起ans一起分析,然后plotting with visreg() 就变成了much更简单(并且置信区间的宽度减小!):

data_combined <- rbind(data.frame(Climate = "Humid", Humid2a),
                       data.frame(Climate = "Wet-subhumid", WSH2a))
fit_combined <- lm(CO ~ SM*Climate, data = data_combined)
visreg(fit_combined, "SM", by = "Climate", overlay = TRUE, 
       main = "(a) Scatterplots without soil moisture (Dry season)",
       points=list(cex=1))

或者,如果您仍然需要自定义 x 限制,请将最后一行替换为

visreg_data <- visreg(fit_combined, "SM", by = "Climate", plot = FALSE)
plot.visreg(visreg_data, overlay = TRUE, xlim = c(0.05, 0.31))

但是,我确实同意默认图(或者至少应该是一个选项)将每个置信带的范围限制在因子变量该水平的数据范围内,例如 ggplot2 做:

library(ggplot2)
ggplot(data_combined, aes(SM, CO, color=Climate)) + stat_smooth(method = "lm") + geom_point()

visreg 比 ggplot(我认为)有更多的模型选项,所以如果有这个选项就好了。