以字符为因变量的多元线性回归
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
【讨论】:
以上是关于以字符为因变量的多元线性回归的主要内容,如果未能解决你的问题,请参考以下文章