【问题标题】:Error filling column with for loop based on predicted values根据预测值使用 for 循环填充列时出错
【发布时间】: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 数据框中的小时数,我想从那里继续。

  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 中的行回退是造成这种情况的原因吗?

【问题讨论】:

标签: r for-loop prediction


【解决方案1】:

Q1:为什么是 2000 年?

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

如果 newdata 缺失,则返回原始数据点处的拟合值。

附录:您应该尝试将 list(HOURS=P_TEMP$HOURS)data.frame(HOURS=P_TEMP$HOURS) 作为 newdata 参数。将公式中的 MyData$HOURS 和 MyData$TEMP 引用到 nls 也是不明智的。公式中不应包含 data-object 名称,而应包含列名称。

Q2:P_TEMP$O3[O] &lt;- O3_P 创建错误。为什么?

A2:因为 R 不使用 0 作为向量的最低索引,因此分配给第 [0] 项没有语法意义。

【讨论】:

  • Q1:你的意思是数据框中用于创建模型的列名和要预测的df的名称必须相同吗?已经是这样了,但它仍然不起作用...... Q2:这不是零,而是像“臭氧”中的 O。还是你的意思是别的?
  • A1:事实并非如此。表达式 P_TEMP$HOURS 没有名称,也不是列表。 A2:对于O0 的混淆,我们深表歉意。该错误可能确实与将格式不正确的参数传递给 newdata 的长度错误有关。您应该尝试过list(HOURS=P_TEMP$HOURS)data.frame(HOURS=P_TEMP$HOURS)。将公式中的 MyData$HOURS 和 MyData$TEMP 引用到 nls 也是不明智的。公式中不应包含数据名称,而应包含列名称。
  • Q1:成功了!转换为命名列表会创建所需数量的值。谢谢! Q2:这仍然会产生错误:replacement has 3416 rows, data has 1416。突然更多的价值观?我现在使用 Ozon_P=list(H=P_TEMP$HOURS) 而不是 as.numeric,但两者都给出相同的数字。
  • 多部分问题在 SO 上已弃用。
  • 也许你的索引应该是seq_along(Ozon_P)。 (您没有非常完整地描述代码各部分的目标。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多