处理可以同时采用多个级别的分类变量

机器算法验证 r 分类数据 多重回归 多层次分析
2022-04-05 22:07:29

我最近发布了一个包含许多部分的问题,我想只关注一个我在原始帖子中没有强调的问题。

我的数据是一个记录列表,每个记录代表一个教育研讨会活动。我有一个连续变量,代表每次研讨会带来的收入,这是我的回归中的响应变量。我还有一些作为因素/IV的分类变量。

这些分类因素之一是主持活动的演讲者。问题在于,有时不止一个演讲者主持一个特定的活动。迄今为止,我们所有的扬声器都是从 154 个扬声器中抽取的。大多数时候,只使用一个扬声器,但在大约 10% 的数据点中,使用了两个、三个甚至四个扬声器。目前,这在我的数据中用斜线表示(“扬声器一/扬声器二/扬声器三”)。我编写了一个 Python 脚本,可以找到给定日期间隔的研讨会的平均收入,这些研讨会采用给定级别的分类变量(例如,它可以返回 2008 年所有研讨会的平均收入,其中演讲者一号是主持人)...我的脚本可以很好地读取多扬声器格式,将“/”两侧的名称作为单独的扬声器读取。

不幸的是,R 似乎无法做这样的事情......我对我的数据进行了多元回归,显然它将“扬声器一”、“扬声器二”和“扬声器一/扬声器二”视为三个不同的扬声器。我的多重 r 平方值小于 0.5,所以我希望解决这个问题将有助于改进模型......如何最好地进行?

1个回答

两种模型浮现在脑海中:收入可能来自每个演讲者的出席,或者可能来自演讲者的出席,由他们对事件的参与加权。在任何一种情况下,编码都是相似的:每个说话者对应一个变量,当说话者不参与时为零,当说话者参与时为零。在第一个模型中,当说话者参与事件时,变量的值将为 1,否则为 0。在第二个模型中,这些模型可能会先验地重新加权。

您可以尝试几种具有多种加权方案的模型,看看哪种方法效果最好:毕竟,这个问题有点探索性。

这给我们留下了编码模型的实际问题。为每个发言者创建一列很简单,但评论中表达的关注点与生成的公式表达式的长度和复杂性有关。幸运的是,可以动态创建公式这是一个插图。首先,让我们创建一些模拟数据。每排至少有一个发言者,通常有两个或三个发言者:

set.seed(17)
n.records <- 1000
n.speakers <- 154
i <- c(rep(1,3), rep(0, n.speakers-2))
x.matrix <- sapply(1:n.records, function(j) sample(i, n.speakers))
x <- as.data.frame(t(x.matrix))

让我们将列命名为“Speaker1”、“Speaker2”等(并保留此名称列表以供以后使用):

colnames(x) <- colnames <- lapply(1:n.speakers, function(i) sprintf("Speaker%d",i))

输入响应变量:

x$y <- rnorm(n.records)

让我们看看这个响应如何依赖于说话者数据。为此,我们根据之前保留的列名创建一个公式:

formula <- as.formula(paste("y ~", paste(colnames, collapse="+"))
fit <- lm(formula, data=x)
summary(fit)

没问题: R沉着应对这种长度的公式。扩展这个公式以包含其他变量很简单;例如,硬编码余数并将其粘贴到此计算公式的末尾。