我有来自USGS Nation Water Data网站的数据。我目前正在尝试绘制和拟合数据的曲线,以用于预测数据集内的不同测量值(溶解氧,pH,标距高度和温度),所有这些都与放电率有关。我使用了“nls”命令,我正在使用一本方程式的书来找出要使用的曲线...在这个例子中,我专门使用了舒马赫的方程式(本书第48页)。
找到数据链接:
曲线书:http://www.for.gov.bc.ca/hfd/pubs/docs/bio/bio04.htm
我的问题是,一旦我选择了编码它的曲线,我就无法得到nls来预测新值...我也无法弄清楚如何绘制它......我猜这可能与残差有关? 在代码中,我使用“聚合”来提取列出的测量值和相应的放电率,现在我只需要让R为我预测。我得到了我认为合适的价值......但我不确定,我用“?nls”打了一堵墙。
##Create new dataframes with means given date for each constituent
ph <- aggregate(Discharge~pH, data=River.Data, mean)
##pH models
pH <- ph$pH
disch <- ph$Discharge
phm <- nls(disch~exp(a+(b/pH)), data=ph, trace=T, start=list(a=-47.06 ,b=400.2))
newph<- data.frame(ph=c(3.0,4.0,5.0,6.0,7.0,8.0,9.0))
predict(phm, newdata=newph)
答案 0 :(得分:3)
好像你已经得到了答案(??),但是:
ph <- aggregate(Discharge~pH, data=River.Data, mean)
phm <- nls(Discharge~exp(a+(b/pH)), data=ph, trace=T, start=list(a=-47.06 ,b=400.2))
newph <- data.frame(pH=seq(3,9,by=0.1))
Discharge.pred <- predict(phm, newdata=newph)
plot(ph$pH, ph$Discharge, xlim=c(3,9), ylim=c(0,1000))
par(new=t)
plot(newph$pH,Discharge.pred, xlab="", ylab="", axes=F, xlim=c(3,9), ylim=c(0,1000), type="l")
问题在于您的数据的pH值为[7.5,8.2],但您试图在[3,9]中进行预测。您选择的模型对于远远超出该范围的pH值不稳定。
答案 1 :(得分:1)
Jarrod,试试吧。干杯,罗伯特。
#Try this
#pH <- ph$pH # you don't need this
#disch <- ph$Discharge # you don't need this
phm <- nls(Discharge~exp(a+(b/pH)), data=ph, trace=T, start=list(a=-47.06 ,b=400.2))
newph<- data.frame(pH=seq(3,9,0.1)) # it'll be smoother with a sequence in increments of 0.1
plot(newph,predict(phm, data=newph,type="l"))
答案 2 :(得分:0)
此答案基于@Carl Witthoft的评论。我在一个单独的答案中强调了这一点,因为我略过了评论,但并没有真正接受卡尔的建议。希望它能帮助也在这里找到自己的其他人。
在?predict.nls
文件中,新数据需要为“ 命名列表或数据框”。过去是我跌倒的地方;列表或数据框列需要有一个名称。而且正如Carl所说,此名称必须与模型中使用的名称完全相同。我认为OP的问题可能是因为他们在模型中使用了pH
,但是在创建新数据时使用了ph
。