为列中的每个组创建线性回归模型 [英] Creating a linear regression model for each group in a column
本文介绍了为列中的每个组创建线性回归模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我指的是这个答案: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
是一个列表,您可以用不同的方式将其转换为数据框。使用melt
和pivot_wider
可以获得与原始数据类似的格式。
这篇关于为列中的每个组创建线性回归模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文