【问题标题】:Assesing the goodness of fit for the multinomial logit in R with the nnet package使用 nnet 包评估 R 中多项式 logit 的拟合优度
【发布时间】:2014-05-25 22:37:02
【问题描述】:

我使用 nnet 包中的 multinom() 函数在 R 中运行多项逻辑回归。nnet 包不包括 p 值计算和 t 统计量计算。我找到了一种使用来自this page 的两个有尾 z 检验来计算 p 值的方法。举一个计算多项式 logit 的检验统计量的示例(不是真正的 t 统计量,而是等效的),我计算了 Wald 的统计量:

mm<-multinom(Empst ~ Agegroup + Marst + Education + State, 
             data = temp,weight=Weight)
W <- (summary(mm1)$coefficients)^2/(summary(mm1)$standard.errors)^2

我取系数的平方,然后除以系数的标准误差的平方。然而,似然比检验是逻辑回归拟合优度的优选度量。由于对似然函数的理解不完整,我不知道如何编写代码来计算每个系数的似然比统计量。使用multinom() 函数的输出计算每个系数的似然比统计量的方法是什么?感谢您的帮助。

【问题讨论】:

    标签: r logistic-regression multinomial goodness-of-fit


    【解决方案1】:

    从@jolisber 的响应中,我提取了一个函数,以便任何人都可以执行此操作并将值存储在 df 中。好吧,我将完整的字符向量存储在 df 中。

    likehoodmultinom2 <- function(model_lmm) 
    {
    
      i <- 1
      values<- c("No funciona") 
    
      for (var in model_lmm$coefnames[-1]) { # Qutiamos el -1 de coefnames para no obener un NA
    
      values[i] =(paste(var, "--", lrtest(model_lmm, var)[[5]][2]))
      i=i+1
    
      }
      return (values)
    }
    

    但是我无法获得第一个元素(变量)p 值。我不知道为什么。我不能忽略 model_lmm$coefnames 中的 [-1]。已编辑。我将 i=0 编辑为 i=1;忘记了 R 向量从那个开始:D。

    希望这对每个人都有效:D

    编辑 2

    还做了 1 以便它可以存储在 df 中。

    likehoodmultinom_p <- function(model_lmm) 
    {
    
      i <- 1
    
      variables <-c("No funciona")
      values <- c("No funciona") 
    
    
      for (var in model_lmm$coefnames[-1]) { 
    
      variables[i] =paste(var)
      values[i]= lrtest(model_lmm, var)[[5]][2]
      i=i+1
       ## Contributed to stack at: 
      }
      return (data.frame(variables,values))
    }
    

    【讨论】:

      【解决方案2】:

      使用car 包中的Anova 函数对模型中的每个项进行似然比检验。

      library(nnet)
      data(iris)
      
      
      mm <- multinom(Species ~ ., data=iris, trace=F)
      
      ### car package
      library(car)
      Anova(mm)
      

      【讨论】:

        【解决方案3】:

        让我们看看使用 Species(分类变量)和 Petal.Length(连续变量)从 iris 数据集中预测 Sepal.Length。让我们首先使用model.matrix 将我们的因子变量转换为多个二进制变量并构建我们的神经网络:

        library(nnet)
        data(iris)
        mat <- as.data.frame(model.matrix(~Species+Petal.Length+Sepal.Length, data=iris))
        mm <- multinom(Sepal.Length~.+0, data=mat, trace=F)
        

        现在我们可以对模型中的变量进行似然比检验:

        library(lmtest)
        lrtest(mm, "Speciesversicolor")
        # Likelihood ratio test
        # 
        # Model 1: Sepal.Length ~ `(Intercept)` + Speciesversicolor + Speciesvirginica + 
        #     Petal.Length + 0
        # Model 2: Sepal.Length ~ `(Intercept)` + Speciesvirginica + Petal.Length - 
        #     1
        #   #Df  LogLik  Df  Chisq Pr(>Chisq)
        # 1 136 -342.02                      
        # 2 102 -346.75 -34 9.4592          1
        

        要对所有变量运行似然比测试,我想你可以只使用一个循环并为每个变量名称运行。我只提取了这个循环中的 p 值。

        for (var in mm$coefnames[-1]) {
          print(paste(var, "--", lrtest(mm, var)[[5]][2]))
        }
        # [1] "Speciesversicolor -- 0.999990077592342"
        # [1] "Speciesvirginica -- 0.998742545590864"
        # [1] "Petal.Length -- 3.36995663002528e-14"
        

        【讨论】:

        • 这很有帮助。但是,我需要为每个我不知道如何计算的系数计算似然比统计数据。
        • @Koba 我更新了为变量添加似然比检验。
        • 我会接受你的回答。但是,我可能不得不提到,我所有的变量都是分类的。例如,我有一个包含 5 个年龄组(类别)的变量 Agegroup。这导致模型中有 5 个虚拟变量,例如multinom(EmploymentStatus ~ Agegroup,...)。调用中的公式等价于EmploymentStatus = Agegroup1 + Agegroup2 + Agegroup3 + Agegroup 4 + Agegroup5。 multinom 调用为我提供了截距和每个年龄组的系数的输出。使用您的建议,我在 multinom 调用中得到了 Agegroup 变量的重要性,但不是......
        • ...每个年龄组系数的显着性。如果您愿意进一步研究这个问题,我可以更新问题并添加我的 multinom 调用的输出。
        • @Koba 我已更新示例以使用因子变量
        猜你喜欢
        • 2020-07-31
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 2016-01-23
        • 2014-02-19
        相关资源
        最近更新 更多