【发布时间】:2018-01-02 02:36:20
【问题描述】:
编辑:现在完全可执行。仍然感谢您的阅读!问题已编号 (1./2.)。
MyData 是一个包含时间戳、臭氧/O3 浓度、温度和持续时间列的数据框。
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 数据框中的小时数,我想从那里继续。
- 我的第一个问题是,为什么 predict(NL_Model, P_TEMP$HOURS) 会创建 2000 个值,我是否可以调节该数量,以便之后不必删除行?
其次,预测的臭氧值是基于另一个模型,这次是线性的:
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
- 第二个问题:这里发生了什么?问题 1 中的行回退是造成这种情况的原因吗?
【问题讨论】:
-
请提供minimal reproducible example。谢谢。
标签: r for-loop prediction