使用for循环基于预测值填充列时出错

时间:2017-12-31 12:11:13

标签: r for-loop prediction

编辑:现在完全可执行。还是谢谢你的阅读!问题编号(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数据框中的小时数,从我想继续的位置开始。

  1. 我的第一个问题是,为什么预测(NL_Model,P_TEMP $ HOURS)会创建2000个值,我可以调节这个数量,所以我不必在之后删除行吗?
  2. 其次,预测的臭氧值基于另一个模型,这次是线性的:

    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中丢弃行的原因是什么?

1 个答案:

答案 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]项没有语法意义。