尝试从R中的GLM预测新数据时出现持续错误

尝试从R中的GLM预测新数据时出现持续错误,r,dataframe,glm,predict,gamma,R,Dataframe,Glm,Predict,Gamma,我得到了一个持续的错误“error:variables'x1',x2',x3'是用不同类型的fit指定的”,同时尝试使用predict in R预测新数据的结果。我在其他模型上成功地运行了这段代码,但由于某些原因,我无法找出这段代码的错误。我已使用以下代码复制了该问题: # make data set.seed(19870630) n <- 1000 df <- data.frame(y = rgamma(n, shape = .5, rate = 1),

我得到了一个持续的错误“error:variables'x1',x2',x3'是用不同类型的fit指定的”,同时尝试使用predict in R预测新数据的结果。我在其他模型上成功地运行了这段代码,但由于某些原因,我无法找出这段代码的错误。我已使用以下代码复制了该问题:

# 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
#生成数据
种子集(19870630)

n之所以会发生这种情况,是因为
scale()
在下面的
x1
描述中将变量转换为单列矩阵(注意
num[1:1000,1]
)。老实说,我不知道这会不会引起麻烦

str(df)
“data.frame”:1000 obs。共有4个变量:
$y:num。。。
$x1:num[1:1000,1]1.448-1.702-0.559-1.1470.732。。。
..-属性(*,“缩放:中心”)=数值49.2
..-属性(*,“缩放:缩放”)=数值28.5
...

您可以通过调用
df来解决这个问题。这看起来很好,但我认为问题不在于属性,而在于
x1
x2
x3
是矩阵/数组,而新输入是数字。创建一个新的定心函数,比如这是另一种方法:
function(x)(x-mean(x))/sd(x)
。在我的分析中,我确实希望保留这些属性,以便将变量转换回绘图。在使用
df之前,我只是将中心和比例属性保存到它们自己的对象中