首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用visreg R在多幅图中将回归线限制在数据范围内

用visreg R在多幅图中将回归线限制在数据范围内
EN

Stack Overflow用户
提问于 2015-08-19 18:08:30
回答 1查看 1.7K关注 0票数 2

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

代码语言:javascript
复制
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")

当我用这种方式绘制它时,回归线就会无限大,特别是在我的图的左角的数据。我也尝试过定义单个数据限制,但它将我的观点描绘到数据框架的范围内,这是错误的。请问如何将回归线限制在数据范围内?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-09 09:53:09

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

以你为例:

代码语言:javascript
复制
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")

这会导致

然而,为什么要对每一行进行单独的回归分析呢?在这种情况下(如果您没有进行单独分析的特殊理由),我将将这两个数据集连接在一起并对它们进行分析,然后用visreg()绘图使大大简化(并且置信区间的宽度减小了!):

代码语言:javascript
复制
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限制,请将最后一行替换为

代码语言:javascript
复制
visreg_data <- visreg(fit_combined, "SM", by = "Climate", plot = FALSE)
plot.visreg(visreg_data, overlay = TRUE, xlim = c(0.05, 0.31))

但是,我确实同意,默认的情节(或者至少应该是一种选择)将每个置信区间的范围限制在因子变量的那个级别的数据范围内,比如ggplot2

代码语言:javascript
复制
library(ggplot2)
ggplot(data_combined, aes(SM, CO, color=Climate)) + stat_smooth(method = "lm") + geom_point()

visreg有更多的模型选项,而不是ggplot (我认为),所以有这个选项是很好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32102636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档