【问题标题】:Predicting new data using glm and cv.glmnet in R (including interactions and categorical variables )在 R 中使用 glm 和 cv.glmnet 预测新数据(包括交互和分类变量)
【发布时间】:2020-07-12 00:25:39
【问题描述】:

我想建模一个回归公式,包括交互和分类变量。我有兴趣使用 glm 和 glmnet::cv.glmnet。我对适合模型的函数感到满意,但不太确定我是否使用训练有素的模型来正确预测样本数据。这是一个例子。

Formula <- "Sepal.Length ~ Sepal.Width + Petal.Length + as.factor(Species):Petal.Width + Sepal.Width:Petal.Length +  as.factor(Species) +  bs(Petal.Width, df = 2, degree = 2)"

data("iris")
Inx <- sample( 1: nrow(iris), nrow(iris),  replace = F)

iris$Species <- as.factor(iris$Species)

train_data <- iris[Inx[1:100], ]
test_data <- iris[Inx[101:nrow(iris) ],]

#---- glm -----------------
ModelMatrix <- predict(caret::dummyVars(Formula, train_data, fullRank = T, sep = ""), train_data)
glmfit <- glm(formula = as.formula(Formula) , data = train_data)

prd_glm <- predict(glmfit, newx = ModelMatrix, type = "response")

#------- glm cross validation --------------
cvglm <- glmnet::cv.glmnet(x = ModelMatrix,
                           y = train_data$Sepal.Length,
                           nfolds = 4, keep = TRUE, alpha = 1, parallel = F, type.measure = 'mse')

ModelMatrix_test <- predict(caret::dummyVars(Formula, test_data, fullRank = T, sep = ""), test_data)
prd_cvglm <- predict(cvglm, newx = ModelMatrix_test,  s = "lambda.1se", type ='response')

【问题讨论】:

    标签: r regression prediction glm


    【解决方案1】:

    您可以使用模型矩阵或公式,但不能同时使用两者,因为一旦您提供了公式,任何 glm 都会在内部生成模型矩阵。你只考虑一次。因此,在您的情况下,假设直接拟合模型矩阵:

    library(splines)
    library(caret)
    library(glmnet)
    
    data(iris)
    Inx <- sample(nrow(iris),100)
    iris$Species <- factor(iris$Species)
    
    train_data <- iris[Inx, ]
    test_data <- iris[-Inx,]
    
    Formula <- "Sepal.Length ~ Sepal.Width + Petal.Length + Species:Petal.Width + Sepal.Width:Petal.Length +  Species +  bs(Petal.Width, df = 2, degree = 2)"
    
    glmfit <- glm(as.formula(Formula),data=train_data)
    

    你可以看到这和用公式拟合是一样的:

    ModelMatrix <- predict(caret::dummyVars(Formula, train_data, fullRank = T, sep = ""), train_data)
    y = train_data[,"Sepal.Length"]
    fit_dummy = glm(y ~ ModelMatrix)
    table(fitted(glmfit) == fitted(fit_dummy))
    TRUE 
     100
    

    我们根据测试数据进行预测:

    prd_glm <- predict(glmfit, newdata = test_data, type = "response")
    

    那么对于 glmnet:

    cvglm <- cv.glmnet(x = ModelMatrix,y = train_data$Sepal.Length,nfolds = 4, 
        keep = TRUE, alpha = 1, parallel = F, type.measure = 'mse')
    
    ModelMatrix_test <- predict(caret::dummyVars(Formula, test_data, fullRank = T, sep = ""), test_data)
    prd_cvglm <- predict(cvglm, newx = ModelMatrix_test,  s = "lambda.1se", type ='response')
    

    您可以看到它们有何不同:

    plot(prd_glm,prd_cvglm)
    

    【讨论】:

    • 嗨@Nile,如果是其他问题,请将其作为单独的问题发布。否则你的问题和我的答案将不匹配,完全令人困惑。
    • 请尊重 SO 也意味着为整个社区提供有用的问题和答案的存储库。以后如果其他人遇到和上面的回答一样的问题,我的回答和你的问题会有所帮助
    • 通过编辑和更改它以满足不同的需求,这破坏了 SO 的整个目的,并且对每个人都不是很有建设性或有用的。请遵守此@Nile
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多