为什么predict()函数返回点预测在函数包装器之外,而拟合值在

时间:2019-06-12 15:32:26

标签: r

predict()将返回模型的拟合值,如果我尝试将其放入具有正确转换变量的代码的函数中。如果在函数包装器之外运行相同的代码块,则代码将返回我要查找的点预测。一旦代码在函数包装器之外运行,用户定义的函数将返回独立代码块返回的点预测,而实际上将忽略任何新的函数输入。

我已经尝试过自己运行代码块(在函数调用之外),并且它的运行方式与我预期的一样(返回点预测)。

require(e1071)
require(tidyverse)

df1 <- mtcars

df_resp <- log10(df1$mpg + 1)
df_pred <- select(df1, -mpg, -cyl, -vs, -gear, -carb, -am)
df_pred_scale <- scale(df_pred, center = T, scale = T)


attr_center <- attr(df_pred_scale, 'scaled:center')
attr_scale <- attr(df_pred_scale, 'scaled:scale')

df_pred_scale <- cbind.data.frame(df_pred_scale, as.factor(df1$cyl))
colnames(df_pred_scale) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")

df_pred <- cbind.data.frame(df_pred, as.factor(df1$cyl))
colnames(df_pred) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")

for(i in 1:6) assign(paste0('x', i), df_pred_scale[,i])

 svr_mpg <- svm(df_resp ~ x1 + x2 + x3 + x4 + x5 + x6,
           epsilon = 0.1,
           gamma = 0.1,
           cost = 1,
           cross = 5)

包装在函数predict_mpg中的这段代码旨在返回点预测 由于某种原因,它实际上返回svr_mpg内部的拟合值

predict_mpg <- function(cylinder, horsepower){

  df_test <- df_pred %>% filter(., cyl == cylinder)

  data_point <- df_test[1,]

  for(i in 1:5)  data_point[,i] <- median(df_test[,i])

  data_point$hp <- horsepower

  df_norm <- scale(data_point[,1:5], t(attr_center), t(attr_scale))
  df_set <- data.frame(df_norm, data_point[,6])
  colnames(df_set) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")
  for(i in 1:6) assign(paste0('x', i), df_set[,i])

  predict(svr_mpg, newdata = df_set) %>% 10^. -1

}

在下面的代码块之前运行此命令将导致 svr_mpg内部的值被返回 如果在下面的代码块之后运行,它将基本上忽略马力和油缸的输入 而是返回下面代码的预测点

predict_mpg(6, 250)

下一个代码块与函数predict_mpg中的代码相同 由于某种原因,此代码将返回我想要的点预测

cylinder <- 6
horsepower <- 250 

df_test <- df_pred %>% filter(., cyl == cylinder)

data_point <- df_test[1,]

for(i in 1:5)  data_point[,i] <- median(df_test[,i])

data_point$hp <- horsepower

df_norm <- scale(data_point[,1:5], t(attr_center), t(attr_scale))
df_set <- data.frame(df_norm, data_point[,6])
colnames(df_set) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")
for(i in 1:6) assign(paste0('x', i), df_set[,i])

predict(svr_mpg, newdata = df_set) %>% 10^. -1

我希望函数返回一个值,即点预测,但实际上是返回svr_mpg的拟合值

1 个答案:

答案 0 :(得分:2)

这将是我的版本。最重要的部分是我在data.frame上而不是在单独的变量上运行模型。如果您不首先使用newdata参数,我不确定data会做什么。

library(e1071)
library(tidyverse)

df1 <- mtcars %>% 
  select(-vs, -gear, -carb, -am) %>% 
  mutate(
    mpg = log10(mpg + 1),
    cyl = as.factor(cyl)
  ) %>% 
  mutate_at(vars(-mpg, -cyl), ~scale(.)[,1])

svr_mpg <- svm(   # Gives a warning for me!
  mpg ~ .,
  df1,   
  epsilon = 0.1,
  gamma = 0.1,
  cost = 1,
  cross = 5
)

predict_mpg <- function(cylinder, horsepower){
  df_set <- df1 %>% 
    filter(cyl == cylinder) %>% 
    mutate_if(is.numeric, median) %>% 
    slice(1) %>% 
    select(-mpg) %>% 
    mutate(hp = horsepower)
  predict(svr_mpg, newdata = df_set) %>% 10^. -1
}
predict_mpg(6, 250)