for循环中的分段线性拟合

时间:2015-04-13 15:24:50

标签: r csv for-loop

我一直试图通过for循环将segmented包放入R中,但是我收到了与psi组件相关的错误,我无法解决。需要帮助。

以下是我设置框架的方法:

library(segmented)
data <- read.csv("C:/Users/LM-SEAWIFS.csv")
graphpath <- "C:/Users/testing/"

数据如下所示:

regions year    chla
NB-0-30 1998    0.130515091
NB-0-30 1999    0.140724909
NB-0-30 2000    0.135240833
NB-0-30 2001    0.138993817
NB-0-30 2002    0.163052182
NB-0-30 2003    0.121473367
NB-0-30 2004    0.143750958
NB-0-30 2005    0.119260133
NB-0-30 2006    0.139529473
NB-0-30 2007    0.125892445
NB-0-30 2008    0.143278167
NB-0-30 2009    0.119866363
NB-0-30 2010    0.1535188
SB-0-30 1998    0.154147909
SB-0-30 1999    0.149347182
SB-0-30 2000    0.146571583
SB-0-30 2001    0.130977867
SB-0-30 2002    0.139928364
SB-0-30 2003    0.126726222
SB-0-30 2004    0.133419183
SB-0-30 2005    0.119234256
SB-0-30 2006    0.134467273
SB-0-30 2007    0.137653236
SB-0-30 2008    0.154858143
SB-0-30 2009    0.124391663
SB-0-30 2010    0.137880678

基本上它是.csv,我希望将线性和分段模型都放入每个图中并保存。我们的想法是For循环将使用`.csv中的regions列。文件以对数据进行分类并使上述回归符合其关联数据。

这是For循环:

for (region in unique(data$regions)) {
    ok<-lm(data[data$regions == region, "chla"]~data[data$regions == region, "year"])
    x <- data[data$regions == region, "year"]
    o.seg<-segmented(ok,seg.Z=~data[data$regions == region, "year"],psi=2007)
    fn <- paste0(graphpath, region, ".png")
    png(filename= fn, width=7, height=3.2, units="in", pointsize=10, res=300)
    plot(data[data$regions == region, "year"], data[data$regions == region, "chla"], xlim=c(1998,2010), ylim=c(0.08,0.2), main = paste(region, "Kd490"), xlab="Time(year)", ylab="Kd490")
    points(data[data$regions == region, "year"],broken.line(o.seg,link=FALSE)$fit,col=2,pch=20)
    #plot(o.seg, add=T, col="red")
    abline(ok, col="blue")
    dev.off()
}

这是错误:

Error in segmented.lm(ok, seg.Z = ~data[data$regions == region, "year"],:`psi' should be a list with more than one covariate in `seg.Z'

我甚至尝试将psi变量赋予数据范围内的单个整数(如2007),但我收到相同的消息。好像我给它一个列表有问题。

如果我注释掉与segmented相关的部分代码,那么循环运行正常,并且所有情节都是线性拟合。

或者我将xy分配给segmented行的方式是什么?

1 个答案:

答案 0 :(得分:0)

这证明了正确的语法:

region <- "SB-0-30"
ok <- lm(chla ~ year, data = data[data$regions == region,])
o.seg <- segmented(ok, seg.Z = ~year, psi = list(year = 2007))

请注意它如何使用data的{​​{1}}参数。