为数据框的子集创建预测并附加到原始文件
Posted
技术标签:
【中文标题】为数据框的子集创建预测并附加到原始文件【英文标题】:Create forecast for subsets of dataframe and append to original file 【发布时间】:2018-01-02 16:31:13 【问题描述】:我正在使用 R 3.3.2。
我想根据往年的分数来预测各个子排名的机构分数。然后我需要将这些预测分数作为新行添加到原始数据框中。我的输入是一个 csv 文件
我想使用最小二乘线性模型,发现“lm”和“predict”完全符合我的需要。
我知道这是一个非常初学者的问题,但希望有人可以帮助我。请参阅下面的数据和代码以及我已经启动的两个解决方案。
score<-c(63.6, 60.3, 60.4, 53.4, 46.5, 65.8, 45.8, 65.9,
44.9, 60, 83.5, 81.7, 81.2, 78.8, 83.3, 79.4, 83.2, 77.3,
79.4)
year<-c(2013, 2014, 2015, 2016, 2014, 2014, 2015, 2015,
2016, 2016, 2011, 2012, 2013, 2014, 2014, 2015, 2015,
2016, 2016)
institution<-c(1422, 1422, 1422, 1422, 1384, 1422, 1384,
1422, 1384, 1422, 1384, 1384, 1384, 1422, 1384, 1422,
1384, 1422, 1384)
subranking<-c('CMP', 'CMP', 'CMP', 'CMP', 'SSC', 'SSC', 'SSC',
'SSC', 'SSC', 'SSC', 'ETC', 'ETC', 'ETC', 'ETC', 'ETC', 'ETC',
'ETC', 'ETC', 'ETC')
d <- data.frame(score, year, institution,subranking)
#-----------SOLUTION 1 -------------------
p<- unique(d$institution)
for (i in (1:length(p)))
x<- d$score[d$institution==p[i]]
y<- d$year[d$institution==p[i]]
model<- lm(x~y)
result<-predict(model, data.frame(y = c(2017,2018,2019,2020)))
z<- cbind(result,data.frame(y = c(2017,2018,2019,2020)))
print(z)
##----------SOLUTION 2 -------------------
calculate_predicted_scores <- function(scores, years) predicted_scores <-0
mod = lm(scores ~ years)
predicted_scores<-predict(mod, data.frame(years = c(2017,2018,2019,2020)))
return(predicted_scores)
为了说明,这就是我想在最后得到的——黄色行是预测:
【问题讨论】:
【参考方案1】:您可以按照这个非常有用的answer 中的描述使用扫帚尝试 dplyr
library(dplyr)
library(broom)
pred_per_group = d %>% group_by(subranking, institution) %>%
do(predicted_scores=predict(lm(score ~ year, data=.), data.frame(year = c(2017,2018,2019, 2020))))
pred_df = tidy(pred_per_group, predicted_scores)
然后,使用rbind
将生成的带有预测的数据框添加到您的数据框。
pred_df <- data.frame(score=pred_df$x, year=rep(c(2017,2018,2019,2020), 5), institution=pred_df$institution, subranking=pred_df$subranking)
result <- rbind(d, pred_df)
8 月 3 日编辑:由于您想结束自己对编码的追求,我将按如下方式进行:
p<- unique(d$institution)
r <- unique(d$subranking)
for (i in (1:length(p)))
for(j in seq_along(r))
score<- d$score[d$institution==p[i] & d$subranking==r[j]]
year<- d$year[d$institution==p[i] & d$subranking==r[j]]
if(length(score)== 0)
print(sprintf("No level for the following combination: Institution: %s and Subrank: %s", p[i], r[j]))
else
model<- lm(score~year)
result<-predict(model, data.frame(year = c(2017,2018,2019,2020)))
z<- cbind(result,data.frame(year = c(2017,2018,2019,2020)))
print(sprintf("For Institution: %s and Subrank: %s the Score is:",p[i], r[j]))
print(z)
给予
[1] "For Institution: 1422 and Subrank: CMP the Score is:"
result year
1 51.80 2017
2 48.75 2018
3 45.70 2019
4 42.65 2020
[1] "For Institution: 1422 and Subrank: SSC the Score is:"
result year
1 58.1 2017
2 55.2 2018
3 52.3 2019
4 49.4 2020
[1] "For Institution: 1422 and Subrank: ETC the Score is:"
result year
1 77.00 2017
2 76.25 2018
3 75.50 2019
4 74.75 2020
[1] "No level for the following combination: Institution: 1384 and Subrank: CMP"
[1] "For Institution: 1384 and Subrank: SSC the Score is:"
result year
1 44.13333 2017
2 43.33333 2018
3 42.53333 2019
4 41.73333 2020
[1] "For Institution: 1384 and Subrank: ETC the Score is:"
result year
1 80.66000 2017
2 80.26286 2018
3 79.86571 2019
4 79.46857 2020
【讨论】:
@Ago ***.com/help/someone-answers:接受答案很重要,因为它既奖励解决您问题的海报,又通知其他人您的问题已解决 您能否帮助我了解如何通过使用我在原始脚本中开始的两种解决方案替代方案获得相同的结果? 您说“我想根据前几年的分数来预测各种子排名的机构分数”,但是在两种解决方案(1 和 2)中,您都放出了子排名变量。在我的回答中,双循环或调整功能可以完成 dplyr 和 broom 所做的事情,但那是你真正想要的吗?我的意思是方法上不是程序上的。您不想将回归方程中的机构/次级变量作为因素吗?如果您说是或者我不确定,我建议您访问并在 CrossValidated 中提问,因为方法问题超出了 StakOverflow 的范围。 我想和你在回答中使用 dplyr 和 broom 一样。我只是无法弄清楚如何创建双循环/调整函数,然后如何从循环/函数中提取结果并将它们添加到数据框中。我想我主要是因为我对数据类型的了解有限而陷入困境。 好的,当您在方法上很清楚时,然后检查更新以了解如何使用您的解决方案进行编程的另一种方式 Nr。 1以上是关于为数据框的子集创建预测并附加到原始文件的主要内容,如果未能解决你的问题,请参考以下文章