根据预测值用 for 循环填充列时出错

Error filling column with for loop based on predicted values

编辑: 现在完全可执行。还是感谢阅读!问题编号 (1./2.).

MyData 是一个包含时间戳、ozone/O3-concentration、温度和持续时间列的数据框。

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 数据框中的小时数,我想从那里继续。

  1. 我的第一个问题是,为什么 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. 第二个问题:这里发生了什么?问题 1 中的回退行是造成这种情况的原因吗?

Q1:为什么是 2000?

A1:因为你没有给predict.nls一个正确构造的newdata参数。它应该是一个列表或数据框,其中的命名列与模型数据的输入相匹配。阅读 ?predict.nls

If newdata is missing the fitted values at the original data points are returned.

附录:您应该尝试将 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] 项在句法上没有意义。