编辑:现在完全可执行。还是谢谢你的阅读!问题编号(1./2。)。
MyData是一个包含时间戳,臭氧/氧浓度,温度和持续时间列的数据框。
Data=data.frame(O3= numeric(2000),TEMP=numeric(2000),HOURS=numeric(2000))
Data$O3=runif(2000, min = 4, max = 207)
Data$TEMP=runif(2000, min = 0, max = 36)
Data$HOURS=c(1:2000)
Column_time=data.frame(time=seq(as.POSIXct("2014-10-09 18:00:00"),as.POSIXct("2015-01-01 00:00:00"),
"hours"))
MyData=cbind(Column_time,Data)
基于此,我按小时为温度数据拟合了一个非线性模型(给出了基本代码):
NL_Model=nls(formula=MyData$TEMP~a+b*sin((2*pi)*((MyData$HOURS+c)/8766))+d*sin((2*pi)*((MyData$HOURS+e)/24)),
data=MyData, start = c(a=10,b=1,c=1,d=1,e=1))
现在,我必须使用之前的模型预测原始数据结束后未来两个月的温度和臭氧值。 创建一个新的数据框并首先用温度数据填充它:
Prediction=data.frame(O3= numeric(1416),TEMP=numeric(1416),HOURS=numeric(1416))
Prediction$HOURS=c(2001:3416)
P_time=data.frame(time=seq(as.POSIXct("2015-01-01 01:00:00"),as.POSIXct("2015-03-01 00:00:00"),
"hours"))
P_TEMP=cbind(P_time,Prediction)
Pred_T=predict(NL_Model, P_TEMP$HOURS)
P_T=Pred_T[-c(1417:2000)]
P_TEMP$TEMP=P_T
1416是我必须预测的2个月内的小时数。
2000是MyData数据框中的小时数,从我想继续的位置开始。
其次,预测的臭氧值基于另一个模型,这次是线性的:
Lin_Mod=lm(formula = MyData$O3~MyData$TEMP,data = MyData, na.action = na.exclude)
截距为103.8387,斜率为0.1062。 使用" for"循环,我试图填充P_TEMP数据帧的O3列:
Ozon_P=as.numeric(P_TEMP$HOURS)
for(Oz in Ozon_P) {O3_P=103.8387 +0.1062*P_TEMP$TEMP[Oz]
P_TEMP$O3[Oz] <- O3_P
}
这个会产生错误:
Error in `$<-.data.frame`(`*tmp*`, "O3", value = c(0, 0, 0, 0, 0, 0, 0, :
replacement has 2001 rows, data has 1416
答案 0 :(得分:0)
Q1:为什么2000?
A1:因为你没有给newdata
一个正确构造的predict.nls
参数。它应该是一个列表或数据框,其命名列与模型数据的输入相匹配。阅读?predict.nls
如果缺少newdata,则返回原始数据点的拟合值。
附录:您应该尝试list(HOURS=P_TEMP$HOURS)
或data.frame(HOURS=P_TEMP$HOURS)
作为newdata
参数。将公式中的MyData $ HOURS和MyData $ TEMP引用到nls
也是不明智的。公式中不应包含data
- 对象名称,只包含列名称。
Q2:P_TEMP$O3[O] <- O3_P
创建了错误。为什么?击>
A2:因为R不使用0作为向量的最低索引,因此赋值给[0]项没有语法意义。