predict() 应该显示一个值,但会生成太多值

predict() should display one value, but generates way too much values

我有一个德国足球联赛的数据集,它显示了联赛中的每支球队、球员的价值、进球和得分。弗赖堡足球队打进 19 球,进球率为 1.12。现在我想根据创建的线性模型预测弗赖堡队在球员值为 5 的情况下可以预期多少个进球。 如果我 运行 指定的代码行,该函数显示的不是一个值,而是每个团队的 18 个值。我怎样才能改变这一点,我只是为弗赖堡队获得价值? (这应该是使用线性模型的预测27.52。)

m3 <- lm(bundesliga$Goals ~ bundesliga$PlayerValue)
summary(m3)
nd <- data.frame(PlayerValue = 5) 
predict(m3, newdata = nd)

数据集:

您以 R 不鼓励的方式指定了您的模型。

首选方式是:

m3 <- lm(Goals ~ PlayerValue, data=bundesliga)

然后使用您的命令预测会按预期工作:

nd <- data.frame(PlayerValue = 5) 
predict(m3, newdata = nd)
#       1 
#27.52412 

虽然 lm 的帮助页面确实说 data 参数是可选的,但在模型中指定它允许其他函数(例如 predict)起作用。 predict.lm的帮助页面中有注释:

备注 首先在newdata中查找变量,然后按照通常的方式查找(这将包括拟合中使用的公式的环境)。如果找到的变量与 newdata 中提供的变量的长度不同,将发出警告。

这就是为什么您的原始命令不起作用并且您收到警告消息的原因:

predict(m3, newdata = nd)
       1        2        3        4        5        6        7        8        9 
40.06574 28.31378 26.08416 25.45708 25.31773 25.22483 24.22614 23.55261 23.36681 
      10       11       12       13       14       15       16       17       18 
21.60169 20.51011 20.23140 20.25463 19.58110 19.48820 18.60564 18.60564 18.51274
#Warning message:
#'newdata' had 1 row but variables found have 18 rows

你公式的环境不是德甲数据框,所以R找不到PlayerValue


数据:

bundesliga <- structure(list(PlayerValue = c(10.4, 5.34, 4.38, 4.11, 4.05, 4.01, 
3.58, 3.29, 3.21, 2.45, 1.98, 1.86, 1.87, 1.58, 1.54, 1.16, 1.16, 1.12), 
Goals = c(34, 32, 34, 35, 32, 16, 26, 27, 23, 13, 10, 21, 22, 18, 24, 21, 12, 19)), 
class = "data.frame", row.names = c(NA, -18L))