【问题标题】:Getting persistent error when trying to predict new data from a GLM in R尝试从 R 中的 GLM 预测新数据时出现持续错误
【发布时间】:2021-06-06 14:51:17
【问题描述】:

在尝试使用 R 中的 predict 预测新数据的结果时,我收到一个持续性错误“错误:变量 'x1'、'x2'、'x3' 指定了不同的类型”。我'我已经在其他模型上成功运行了这段代码,但由于某种原因,我无法弄清楚这个代码有什么问题。我已经用以下代码复制了这个问题:

# make data
set.seed(19870630)
n <- 1000
df <- data.frame(y = rgamma(n, shape = .5, rate = 1),
                 #runif(n, 0, 1), # trows same error
                 x1 = runif(n, 0, 100),
                 x2 = runif(n, 0, 100),
                 x3 = runif(n, -1, 1))

df$x2 <-  df$x1*df$x1

# refine data by scaling
df$x1 <- scale(df$x1, center = TRUE)
df$x2 <- scale(df$x2, center = TRUE)
df$x3 <- scale(df$x3, center = TRUE)

# double check
head(df); plot(df)

# fit model
mod <- glm(y ~ x1 + x2 + x3, data = df, family=Gamma(link="log"))

# confirm, success
summary(mod)


# make data to retain predictions
## first get realistic ranges of variables of interest, other vars will be held at mean
(x1_span <- c(rep(seq(min(df$x1), max(df$x1)), length = 50)))
(x2_span <- c(rep(seq(min(df$x2), max(df$x2)), length = 50)))


df_pred_x1_x2 <- data.frame(x1 = x1_span,
                            x2 = x2_span,
                            x3 = mean(df$x3))

# generate function for prediction ml predicted values
predict_fun <- function(my_glm) {
  predict(my_glm, newdata = df_pred_x1_x2)   # this is predict.glm
}

df_pred_x1_x2$y_value_pred <- predict_fun(mod) # error

# "Error: variables ‘x1’, ‘x2’, ‘x3’ were specified with different types from the fit"
                                                      
# End March 8, 2021

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: r dataframe glm predict gamma


    【解决方案1】:

    发生这种情况是因为scale() 在下面对x1 的描述中将变量变成了单列矩阵(注意num [1:1000, 1])。老实说,我永远不确定这会或不会造成麻烦......

    str(df)
    'data.frame':   1000 obs. of  4 variables:
     $ y : num  ...
     $ x1: num [1:1000, 1] 1.448 -1.702 -0.559 -1.147 0.732 ...
      ..- attr(*, "scaled:center")= num 49.2
      ..- attr(*, "scaled:scale")= num 28.5
    ...
    

    您可以通过调用df &lt;- lapply(df,drop) 来解决此问题,以删除额外的维度(在您适合模型之前)。 @dlaggy 指出你也可以定义自己的缩放函数(function(x) (x-mean(x))/sd(x));你也可以定义

    myscale <- function(...) drop(scale(...))
    

    请注意,与使用 c()(我在之前的回答中建议的)不同,它会删除尺寸其他属性,drop() 只会删除尺寸 - 所以你可以保持你的比例/中心属性与数据一起进行。

    【讨论】:

    • 这看起来不错,但我认为问题不在于属性,而在于 x1x2x3 是矩阵/数组,而新输入是数字。像这样创建一个新的居中函数是另一种方法:function(x) (x - mean(x)) / sd(x)
    • 谢谢你们,非常有用的解决方法,我能够让预测工作。就我的分析而言,我确实希望将这些属性保留在某个地方以将变量转换回用于绘图。在使用df &lt;- apply(df,drop)之前,我只是将中心和比例属性保存到自己的对象中。
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多