在R中的数据框中写入回归结果时出错

m3eecexj  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(112)

我正在R中执行一系列年度横截面回归,从Excel工作簿中导入数据,其中每张工作表对应一年,这些从1995年到2018年。我面临两个问题,第一个是我不明白我怎么能把系数列表和它们的p-第二个问题是,当我将每个模型的bp和bg测试合并到循环中时,它会抛出以下错误:

Error in y - z$residuals : non-numeric argument to binary operator

字符串
头(datos)是:
x1c 0d1x的数据
该数据集可在https://wormhole.app/opeBQ#NVBkLHzguFPUVY0N4hbErg
脚本如下:

library(lmtest)
    library(olsrr)
    library(tseries)
    library(readxl)
    library(openxlsx) 
    library(dplyr)
    
    años <- 1995:2018 
    
    resultados <- list()
    
    for (año in años) {
      # Define el nombre del archivo Excel (puedes modificarlo según tus necesidades)
      archivo_excel <- "C:/Users/Kevin/Desktop/Bases/base_Regresiones.xlsx"
      
      # Importa los datos desde la hoja correspondiente al año
      datos <- read_excel(archivo_excel, sheet = as.character(año))
    
      # Realiza la regresión con tus datos. Por ejemplo, aquí se asume que tienes dos columnas: 'variable_independiente' y 'variable_dependiente'.
      modelo <- lm(y ~ ., data = datos)
      
      # Calcula los estadísticos requeridos
      r_squared <- summary(modelo)$r.squared
      f_statistic <- summary(modelo)$fstatistic[1]
      ssr <- deviance(modelo)
      jb_test <- jarque.bera.test(residuals(modelo))
      bg_test <- bgtest(modelo)
      bp_test <- bptest(modelo)
      
      # Almacena los resultados en la lista, incluyendo el R-squared y el estadístico F
      resultados[[as.character(año)]] <- list(
        Año = año,
        R_squared = r_squared,
        F_statistic = f_statistic,
        u_squad = ssr,
        JBtest = jb_test$p.value,
        bgtest = bg_test$p.value,
        bptest = bp_test$p.value
      )
    }
    
    # Crear un DataFrame a partir de la lista de resultados
    resultados_df <- do.call(rbind, resultados)


我得到了这个结果

Año  R_squared F_statistic u_squad  JBtest   
1995 1995 0.9480865 148.5375    10.46748 0.4176042
1996 1996 0.9485575 149.972     10.31898 0.2332913
1997 1997 0.9462563 142.0284    10.8743  0.3334412
1998 1998 0.9464819 143.84      10.8509  0.5535448
1999 1999 0.9475053 145.5997    10.57655 0.4754198
2000 2000 0.9472141 144.7519    10.81674 0.3440291
2001 2001 0.9504769 156.0998    10.27286 0.8708391
2002 2002 0.9494986 151.6648    10.43004 0.8408953
2003 2003 0.9502323 155.2925    10.36924 0.6420716
2004 2004 0.9501257 154.9432    10.38435 0.8029328
2005 2005 0.9498327 153.991     10.4385  0.2381718
2006 2006 0.9518624 160.8269    10.04476 0.3467262
2007 2007 0.9513862 159.1718    10.17184 0.3430534
2008 2008 0.9468287 144.8315    10.96748 0.4548003
2009 2009 0.9525406 163.2413    9.350981 0.5795036
2010 2010 0.948046  148.4155    10.10924 0.6508358
2011 2011 0.9510188 157.9168    9.487844 0.5200191
2012 2012 0.948731  150.507     9.751045 0.5669693
2013 2013 0.9453135 140.5932    10.37591 0.4488269
2014 2014 0.9465016 143.8963    10.07656 0.4465016
2015 2015 0.9469356 145.1395    10.06823 0.2957086
2016 2016 0.9479821 148.223     9.874893 0.2328414
2017 2017 0.9452753 140.4895    10.42455 0.1856073
2018 2018 0.9451515 140.154     10.45936 0.2261362


我希望得到如下内容:


nxagd54h

nxagd54h1#

底线:我认为你需要同时使用bptestbgtest的公式接口,即尝试

bg_test <- lmtest::bgtest(y ~ ., data = datos)
bp_test <- lmtest::bptest(y ~ ., data = datos)

字符串
我对测试不够熟悉(也不熟悉你的数据),无法确切地知道,但我相信bgtest不知道如何处理"lm"类的对象。下面是一个演示,使用来自?bptest的示例数据作为起点:

set.seed(42)
     x <- rep(c(-1,1), 50)
     ## generate heteroskedastic and homoskedastic disturbances
     err1 <- rnorm(100, sd=rep(c(1,2), 50))
     err2 <- rnorm(100)
     ## generate a linear relationship
     y1 <- 1 + x + err1
     y2 <- 1 + x + err2
lmtest::bptest(y1 ~ x)
#   studentized Breusch-Pagan test
# data:  y1 ~ x
# BP = 9.012, df = 1, p-value = 0.002682
lm(y1 ~ x)
# Call:
# lm(formula = y1 ~ x)
# Coefficients:
# (Intercept)            x  
#       1.047        1.010  
lmtest::bptest(lm(y1 ~ x))
# Warning in formula$x : partial match of 'x' to 'xlevels'
#   studentized Breusch-Pagan test
# data:  lm(y1 ~ x)
# BP = 9.012, df = 1, p-value = 0.002682


它使用Error:进行测试而没有 * 失败 * 的事实并不意味着它是正确的。关于partial match的警告告诉我,它试图在内部将"lm"对象转换为它知道如何处理的对象。当出现“部分匹配”警告时,这意味着我们的x变量在这里实际上被解释为xlevels=,这肯定不是我们认为应该发生的事情。

相关问题