以字符为因变量的多元线性回归

Posted

技术标签:

【中文标题】以字符为因变量的多元线性回归【英文标题】:Multiple Linear Regression with character as dependent variable 【发布时间】:2022-01-22 00:55:10 【问题描述】:

我目前正在尝试对 2020 年总统选举中每个州的选民投票率进行多元线性回归。

为了创建这个回归模型,我想使用以下变量:State、Total_Voters 和 Population。

当我尝试运行线性回归时,出现以下错误:

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : NA/NaN/Inf in 'y'

我收集的数据集非常大。我创建了一个新的数据框,其中包含我需要的变量,如下所示:

Turnout_Rate_2020 <- sqldf("SELECT State_Full, F1a AS Total_Voters, population.Pop AS Population FROM e_2020 INNER JOIN population ON population.State = e_2020.State_Full")

之后我删除所有 NA 值:

Turnout_Rate_2020[is.na(Turnout_Rate_2020)] <- 0

之后我再次过滤数据框并过滤掉所有未报告的状态:

Turnout_Rate_2020 <- sqldf("SELECT State_Full, Total_Voters, Population FROM Turnout_Rate_2020 WHERE Total_Voters <> 0 AND Total_Voters >= 0 GROUP BY State_Full")

最终数据框如下所示:

有以下总结:

但是,当我现在尝试运行多元线性回归时,我得到了上面展示的错误。该命令如下所示:

lmTurnoutRate_2020 <- lm(State_Full ~ Population + Total_Voters, data = Turnout_Rate_2020)

我对线性回归很陌生,但我渴望学习。我已经通过 *** 看了相当多,但无法弄清楚。

如果有人能帮助我,将不胜感激。

一次完整的脚本:

Turnout_Rate_2020 <- sqldf("SELECT State_Full, F1a AS Total_Voters, population.Pop AS Population FROM e_2020 INNER JOIN population ON population.State = e_2020.State_Full")

# Change all NA to 0
Turnout_Rate_2020[is.na(Turnout_Rate_2020)] <- 0

summary(Turnout_Rate_2020)

# Select all again and filter out states which did not report. (values that were NA)
Turnout_Rate_2020 <- sqldf("SELECT State_Full, Total_Voters, Population FROM Turnout_Rate_2020 WHERE Total_Voters <> 0 AND Total_Voters >= 0 GROUP BY State_Full")

# Does not work and if I turn variables around I get NaN values.
lmTurnoutRate_2020 <- lm(State_Full ~ Population + Total_Voters, data = Turnout_Rate_2020)
summary(lmTurnoutRate_2020)

# Does not work
ggplot(lmTurnoutRate_2020, aes(x=State_Full,y=Population)) + geom_point() + geom_smooth(method=lm, level=0.95) + labs(x = "State", y = "Voters")

【问题讨论】:

lm(普通最小二乘回归)需要一个数字的因变量。 State_Full 不是数字。 @Roland 你能否指出如何运行回归的方向,即使State_Full 不是数字?数据集中的所有内容都基于这些状态非常感谢您的回复:) 你真的需要更多地研究这个主题,因为在这一点上你更有可能弊大于利。您正在寻找的是一种分类算法,线性回归(或任何类型的回归)不再是一种选择。哪种分类算法?有很多,你必须决定。 “每个州的选民投票率”基本上是数字。您可能只是对实际的因变量感到困惑。我建议你咨询统计学家。 请阅读r标签页顶部的信息。特别是,其他人必须通过简单地将输入和代码复制并粘贴到他们的 R 会话中来重现示例。输入需要使用dput 显示。就目前而言,除了您自己之外没有人可以这样做,因为缺少输入。 【参考方案1】:

1) 问题中缺少输入,因此我们将使用 mtcars 并将 cyl 设为字符列。 lm 无法处理,但我们可以从 cyl 创建一个 0/​​1 模型矩阵并运行它。这将为每个级别的 cyl 执行单独的 lm。这仅适用于因变量具有少量水平的情况,就像我们在这里一样。如果您的因变量是自然的或已被切割成少量的水平,就会出现这种情况。

(可能在这种情况下,我们希望使用逻辑回归,如 glm 和 family=binomial() 或序逻辑回归,如 MASS 中的 polr 或 nnet 包中的序数包或多项式,但我们将用 lm 显示它只是为了表明它可以做到,虽然它可能不应该是因为只有两个值,因变量不够高斯。)

mtcars2 <- transform(mtcars, cyl = as.character(cyl))
lm(model.matrix(~ cyl + 0) ~ hp, mtcars2)

给予:

Call:
lm(formula = model.matrix(~cyl + 0) ~ hp, data = mtcars2)

Coefficients:
             cyl4       cyl6       cyl8     
(Intercept)   1.052957   0.390688  -0.443645
hp           -0.004835  -0.001172   0.006007

使用 polr(假设级别按照使用 cyl 的顺序排列):

library(MASS)
polr(cyl ~ hp, transform(mtcars2, cyl = factor(cyl)))

给予:

Call:
polr(formula = cyl ~ hp, data = transform(mtcars2, cyl = factor(cyl)))

Coefficients:
       hp 
0.1156849 

Intercepts:
     4|6      6|8 
12.32592 17.25331 

Residual Deviance: 20.35585 
AIC: 26.35585 
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 

另一种可能性是,您的因变量恰好被表示为字符,因为它是如何创建的,但如果在其上使用 as.numeric(...) 则可能是数字。如果没有输入,我们无法判断,但使用我们的示例,我们可以做到这一点,尽管这很可能是不合适的,因为 cyl 只有 3 个值,因此不能足够接近高斯。不过,您的数据可能有所不同。

lm(cyl ~ hp, transform(mtcars2, cyl = as.numeric(cyl)))

给予:

Call:
lm(formula = cyl ~ hp, data = transform(mtcars2, cyl = as.numeric(cyl)))

Coefficients:
(Intercept)           hp  
    3.00680      0.02168  

【讨论】:

以上是关于以字符为因变量的多元线性回归的主要内容,如果未能解决你的问题,请参考以下文章

多元线性回归的计算

多元线性回归时引入和剔除变量的p值设为多少为宜

回归分析 R语言 -- 多元线性回归

多元线性回归模型在1%的情况下显著是怎么看的

多元线性回归公式的计算方法?

多元线性回归公式推导及R语言实现