如何基于R语言结合GDP数据按年份预测菠菜消费量?
农产品消费量年度预测实现方案(基于R语言神经网络)
问题背景
我用R语言结合多因素做农产品预测,已经算出各品类的MSE值,但不知道怎么按年份预测各品类的消费量。
现有数据结构
structure(list(Year = 2016:2021, GDP = c(9544.25, 9969.5, 11086.11,11231.54, 10361.28, 11407.68), Spinach = c(6.1, 7.7, 7.7, 8.4, 7.6, 8.2)))
已编写的R代码
# 计算第2列和第3列的均值与标准差 mean_data <- c(mean(mydata[, 2]), mean(mydata[, 3])) sd_data <- c(sd(mydata[, 2]), sd(mydata[, 3])) # 使用指定的均值和标准差仅对第2列和第3列进行标准化 data_scaled <- mydata data_scaled[, c(2, 3)] <- scale(data_scaled[, c(2, 3)], center = mean_data, scale = sd_data) # 创建数据拆分索引 index <- sample(1:nrow(data_scaled), round(0.50 * nrow(data_scaled))) # 创建训练集和测试集 train_data <- as.data.frame(data_scaled[index, ]) test_data <- as.data.frame(data_scaled[-index, ]) # 获取标准化数据的列名 n = names(data_scaled) n # 基于训练数据构建神经网络模型,以GDP为自变量预测Spinach net = neuralnet(Spinach ~ GDP, data=train_data, hidden=c(5,5), linear.output=TRUE) plot(net) # 在测试集上计算预测值 # 修正:compute仅需传入自变量GDP predict_net_test <- compute(net, test_data[, "GDP"]) # 计算Spinach预测结果的均方误差(MSE) actual_spinach_values <- test_data$Spinach predict_net_test <- predict_net_test$net.result MSE.net <- mean((actual_spinach_values - predict_net_test)^2) cat("Spinach预测结果的均方误差(MSE):",MSE.net, "\n")
实现年度消费量预测的步骤
1. 逆标准化还原真实预测值
由于训练时对数据做了标准化,神经网络输出的是标准化后的数值,需要还原为实际消费量:
# 对测试集的预测值做逆标准化,还原为真实消费量 pred_spinach_actual <- predict_net_test * sd_data[2] + mean_data[2] # 还原测试集的实际菠菜消费量(因为之前也做了标准化) actual_spinach_actual <- test_data$Spinach * sd_data[2] + mean_data[2] # 合并年份、实际值和预测值 test_year_result <- data.frame( Year = test_data$Year, Actual_Spinach = actual_spinach_actual, Predicted_Spinach = pred_spinach_actual ) print(test_year_result)
2. 预测未来年份的菠菜消费量
要预测未来年份的消费量,需先准备对应年份的GDP数据,再重复标准化-预测-逆标准化流程:
# 假设2022-2023年的GDP数据(实际需替换为真实数据) future_year_data <- data.frame( Year = 2022:2023, GDP = c(12000, 12500) ) # 对未来GDP做标准化(使用训练数据的均值和标准差) future_year_data$GDP_scaled <- (future_year_data$GDP - mean_data[1]) / sd_data[1] # 用训练好的模型预测标准化后的菠菜值 pred_future_scaled <- compute(net, future_year_data$GDP_scaled)$net.result # 逆标准化得到真实消费量 pred_future_actual <- pred_future_scaled * sd_data[2] + mean_data[2] # 整理未来年份的预测结果 future_year_result <- data.frame( Year = future_year_data$Year, Predicted_Spinach = pred_future_actual ) print(future_year_result)
3. 关键说明
- 必须使用训练数据的均值和标准差进行标准化/逆标准化,不能用新数据的统计量,否则会导致预测偏差。
- 如果有多个预测因素(比如除了GDP还有其他变量),只需对所有自变量做同样的标准化处理,再传入模型即可。
内容的提问来源于stack exchange,提问作者Harika
相关产品推荐
相关产品推荐

