为列中的每个组创建线性回归模型 [英] Creating a linear regression model for each group in a column

查看:15
本文介绍了为列中的每个组创建线性回归模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我指的是这个答案:https://stackoverflow.com/a/65076441/14436230

我正在尝试使用每一年的过去值预测2019年的";Education";值,方法是lm(Education ~ poly(TIME,2))

但是,我必须将名为function(TIME)的lm应用到我能够在m中为每个位置分别创建的";location";。

按照所附链接中的答案,我可以运行我的代码,直到my_predict。当我运行sapply时,收到错误 Error in UseMethod("predict") : no applicable method for 'predict' applied to an object of class "list"

有人能告诉我我的错误吗?如有任何帮助,我将不胜感激。


linear_model <- function(TIME) lm(Education ~ poly(TIME,2), data=table2)

m <- lapply(split(table2,table2$LOCATION),linear_model)

new_df <- data.frame(TIME=c(2019))

my_predict <- function(TIME) predict(m,new_df)

sapply(m,my_predict)   #error here 

编辑:

我现在可以预测2020和2021年每个地点和2021年的教育价值,如下所示。

linear_model <- function(x) lm(Education ~ TIME, x)
m <- lapply(split(tableLinR,tableLinR$LOCATION),linear_model)
new_df <- data.frame(TIME=c(2020, 2021), row.names = c ("2020.Education", "2021.Education"))
my_predict <- function(x) predict(x,new_df)
result <- sapply(m,my_predict)

然而,我实际上希望对更多的自变量(例如教育、GDP、工时、PPI等)这样做。如我的列标题所示:

有人能建议我如何为代码创建循环以使用预测值创建数据帧吗?我已经挣扎了这么多个小时,但都没有成功。

推荐答案

您的函数语法有一些错误。函数通常编写为Function(X),然后将x与要使用的数据替身。

例如,在您定义的linear_model函数中,如果您要单独使用它,则应写为:

linear_model(data)
但是,因为您是在lapply函数中使用它,所以查看起来有点棘手。LApply只是循环,并将linear_model函数应用于您从split(table2,table2$LOCATION)获得的每个数据框。

my_predict也会发生同样的情况。

无论如何,这对您应该有效:

linear_model <- function(x) lm(Education ~ TIME, x)

m <- lapply(split(table2,table2$LOCATION),linear_model)

new_df <- data.frame(TIME=c(2019))

my_predict <- function(x) predict(x,new_df)

sapply(m,my_predict)  

编辑答案

可能有更有效的方法来循环预测,但以下是我的方法:

pred_data <- list()

for (i in 3:6){
   linear_model <- function(x) lm(x[,i] ~ TIME, x)
   m <- lapply(split(tableLinR,tableLinR$LOCATION),linear_model)
   new_df <- data.frame(TIME=c(2020, 2021), row.names = c("2020", "2021"))
   my_predict <- function(x) predict(x,new_df)
   pred_data[[colnames(tableLinR)[i]]] <- sapply(m,my_predict)
 }

 pred_data <- melt(pred_data)
 pred_data <- as.data.frame(pivot_wider(pred_data, names_from = L1, values_from = value))
首先,您创建了一个空列表,您将在其中保存循环的输出。在for (i in 3:4)中,您放置了要从中进行预测的列的间隔。结果pred_data是一个列表,您可以用不同的方式将其转换为数据框。使用meltpivot_wider可以获得与原始数据类似的格式。

这篇关于为列中的每个组创建线性回归模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆