使用 plot3D 完成的 3D 散点图产生奇怪的行为
3D scatterplot done with plot3D producing strange behaviour
我正在尝试使用库 plot3D
在 3D 散点图中显示最适合的平面。当下面的代码是 运行 时,一切看起来都很好,但是如果我用第二个 fit
替换 fit
我会得到奇怪的行为,飞机不再是平面。我希望两个版本都能产生相同的画面。怎么回事?
library(plot3D)
df <- structure(list(X = 1:10, TV = c(230.1, 44.5, 17.2, 151.5, 180.8,
8.7, 57.5, 120.2, 8.6, 199.8), radio = c(37.8, 39.3, 45.9, 41.3,
10.8, 48.9, 32.8, 19.6, 2.1, 2.6), newspaper = c(69.2, 45.1,
69.3, 58.5, 58.4, 75, 23.5, 11.6, 1, 21.2), sales = c(22.1, 10.4,
9.3, 18.5, 12.9, 7.2, 11.8, 13.2, 4.8, 10.6)), .Names = c("X",
"TV", "radio", "newspaper", "sales"), row.names = c(NA, 10L), class = "data.frame")
x<-df$TV
y<-df$radio
z<-df$sales
fit <- lm(z ~ x + y)
# fit <- lm(df$sales ~ df$TV + df$radio)
x.pred <- seq(min(x), max(x), length.out = 5)
y.pred <- seq(min(y), max(y), length.out = 5)
xy <- expand.grid( x = x.pred, y = y.pred)
z.pred <- matrix(predict(fit, newdata = xy), nrow = 5, ncol = 5)
scatter3D(x, y, z,
surf = list(x = x.pred, y = y.pred, z = z.pred)
)
简短的回答是:两种配合都是正确的。然而,第二个 predict
没有找到要预测的正确列名。
如果您希望第二次适合使用:
fit <- lm(sales ~ TV + radio, data=df)
...
xy <- expand.grid(TV = x.pred, radio = y.pred)
为什么?因为 predict
总是搜索它在 newdata
.
中训练的列名
您可能注意到上面代码的第一行也发生了变化,我们不再使用 df$var
格式,而是使用 data
参数。发生这种情况是因为使用此格式时 fit$model
等于:
df$sales df$TV df$radio
1 22.1 230.1 37.8
2 10.4 44.5 39.3
3 9.3 17.2 45.9
...
而且我们不能用“$”美元符号命名列名。也就是说我们做不到:
fit <- lm(df$sales ~ df$TV + df$radio)
...
xy <- expand.grid(df$TV = x.pred, df$radio = y.pred)
因为会报错。
如上所述,这两种拟合确实是正确的。如果你运行,
fit <- lm(z ~ x + y)
fit
你会得到,
Coefficients:
(Intercept) x y
2.08052 0.05598 0.15282
并与
fit <- lm(df$sales ~ df$TV + df$radio)
fit
你会得到,
Coefficients:
(Intercept) x y
2.08052 0.05598 0.15282
还有。
最后,注意当predict
和newdata
找不到正确的变量名时,你会收到这样的警告信息:
'newdata' had 25 rows but variables found have 10 rows
我认为这应该是一个错误。但它可能会在下一个版本中得到修复。关于此问题的其他一些来源是:
- Getting Warning: " 'newdata' had 1 row but variables found have 32 rows" on predict.lm
- R 'newdata' had 7 rows but variables found have 182 rows
我正在尝试使用库 plot3D
在 3D 散点图中显示最适合的平面。当下面的代码是 运行 时,一切看起来都很好,但是如果我用第二个 fit
替换 fit
我会得到奇怪的行为,飞机不再是平面。我希望两个版本都能产生相同的画面。怎么回事?
library(plot3D)
df <- structure(list(X = 1:10, TV = c(230.1, 44.5, 17.2, 151.5, 180.8,
8.7, 57.5, 120.2, 8.6, 199.8), radio = c(37.8, 39.3, 45.9, 41.3,
10.8, 48.9, 32.8, 19.6, 2.1, 2.6), newspaper = c(69.2, 45.1,
69.3, 58.5, 58.4, 75, 23.5, 11.6, 1, 21.2), sales = c(22.1, 10.4,
9.3, 18.5, 12.9, 7.2, 11.8, 13.2, 4.8, 10.6)), .Names = c("X",
"TV", "radio", "newspaper", "sales"), row.names = c(NA, 10L), class = "data.frame")
x<-df$TV
y<-df$radio
z<-df$sales
fit <- lm(z ~ x + y)
# fit <- lm(df$sales ~ df$TV + df$radio)
x.pred <- seq(min(x), max(x), length.out = 5)
y.pred <- seq(min(y), max(y), length.out = 5)
xy <- expand.grid( x = x.pred, y = y.pred)
z.pred <- matrix(predict(fit, newdata = xy), nrow = 5, ncol = 5)
scatter3D(x, y, z,
surf = list(x = x.pred, y = y.pred, z = z.pred)
)
简短的回答是:两种配合都是正确的。然而,第二个 predict
没有找到要预测的正确列名。
如果您希望第二次适合使用:
fit <- lm(sales ~ TV + radio, data=df)
...
xy <- expand.grid(TV = x.pred, radio = y.pred)
为什么?因为 predict
总是搜索它在 newdata
.
您可能注意到上面代码的第一行也发生了变化,我们不再使用 df$var
格式,而是使用 data
参数。发生这种情况是因为使用此格式时 fit$model
等于:
df$sales df$TV df$radio
1 22.1 230.1 37.8
2 10.4 44.5 39.3
3 9.3 17.2 45.9
...
而且我们不能用“$”美元符号命名列名。也就是说我们做不到:
fit <- lm(df$sales ~ df$TV + df$radio)
...
xy <- expand.grid(df$TV = x.pred, df$radio = y.pred)
因为会报错。
如上所述,这两种拟合确实是正确的。如果你运行,
fit <- lm(z ~ x + y)
fit
你会得到,
Coefficients: (Intercept) x y
2.08052 0.05598 0.15282
并与
fit <- lm(df$sales ~ df$TV + df$radio)
fit
你会得到,
Coefficients: (Intercept) x y
2.08052 0.05598 0.15282
还有。
最后,注意当predict
和newdata
找不到正确的变量名时,你会收到这样的警告信息:
'newdata' had 25 rows but variables found have 10 rows
我认为这应该是一个错误。但它可能会在下一个版本中得到修复。关于此问题的其他一些来源是:
- Getting Warning: " 'newdata' had 1 row but variables found have 32 rows" on predict.lm
- R 'newdata' had 7 rows but variables found have 182 rows