手动实现回归似然比检验

时间:2018-04-10 23:00:56

标签: r testing statistics linear-regression

我试图实施自己的线性回归似然比检验。

测试是你采用简化模型的平方和和完整模型的平方和,并将其与F统计量进行比较。

但是,我在实现该函数时遇到了一些麻烦,特别是在处理虚拟变量时。

This是我正在使用的数据集并在上面测试函数。

到目前为止,这是代码: 函数输入是设置矩阵mat,响应矩阵只有一列,索引(变量)是测试,以及测试所在的alpha值。

linear_regression_likelihood <- function(mat, response, indices, alpha) {
  mat <- as.matrix(mat)
  reduced <- mat[,c(1, indices)]

  q <- 1 #set q = 1 just to test on data

  p <- dim(mat)[2]
  n <- dim(mat)[1]

  f_stat <- qf(1-alpha, df1 = p-q, df2 = n-(p+1))
  beta_hat_full <- qr.solve(t(mat)%*%mat)%*%t(mat)%*%response
  y_hat_full <- mat%*%beta_hat_full
  SSRes_full <- t(response - y_hat_full)%*%(response-y_hat_full)


  beta_hat_red <- qr.solve(t(reduced)%*%reduced)%*%t(reduced)%*%response
  y_hat_red <- reduced%*%beta_hat_red
  SSRes_red <- t(response - y_hat_red)%*%(response-y_hat_red)



  s_2 <- (t(response - mat%*%beta_hat_full)%*%(response - mat%*%beta_hat_full))/(n-p+1)

  critical_value <- ((SSRes_red - SSRes_full)/(p-q))/s_2
  print(critical_value)
  if (critical_value > f_stat) {
    return ("Reject H0")
  }
  else {
    return ("Fail to Reject H0")
  }
}

这是设置代码,我以正确的格式设置矩阵。数据是以CSV文件读取的。

data <- data[, 2:5]

mat <- data[, 2:4]


response <- data[, 1]


library(ade4)
df <-data.frame(mat$x3)
dummy <- acm.disjonctif(df)
dummy
mat <- cbind(1, mat[1:2], dummy)

linear_regression_likelihood(mat, response, 2:3, 0.05)

这是我一直在犯的错误。

Error in solve.default(as.matrix(c)) : system is computationally singular: reciprocal condition number = 1.63035e-18

我知道它与乘法后的矩阵的逆矩阵有关,但函数无法这样做。我认为这可能是因为虚拟变量的值太小,但我不确定是否有任何其他方法来包含虚拟变量。

我正在做的测试是检查因子变量x3是否对响应y有任何影响。我使用内置函数验证的实际答案表明我们未能拒绝原假设。

1 个答案:

答案 0 :(得分:1)

错误源自

beta_hat_full <- qr.solve(t(mat)%*%mat)%*%t(mat)%*%response

如果您逐步完成功能,则会看到错误

  

qr.solve中的错误(t(mat)%*%mat):奇异矩阵&#39; a&#39;在解决

这里的问题是您的模型矩阵没有完整的列排名,这意味着您的回归系数不是唯一的。这是你&#34;虚假&#34;的结果。 x3。为了确保满级,您需要删除一个虚拟列(或手动删除拦截)。

在以下示例中,我从A中删除了dummy列,这意味着生成的x3系数会衡量B中单位变化的影响,{{1 }和C 反对 D

A

一张便条

如果您使用了基本R&#39的函数# Read data data <- read.csv("data_hw5.csv") data <- data[, 2:5] # Extract predictor and response data mat <- data[, 2:4] response <- data[, 1] # Dummify categorical predictor x3 library(ade4) df <-data.frame(mat$x3) dummy <- acm.disjonctif(df) dummy <- dummy[, -1] # Remove A to have A as baseline mat <- cbind(1, mat[1:2], dummy) # Apply linear_regression_likelihood linear_regression_likelihood(mat, response, 2:3, 0.05); # [,1] #[1,] 8.291975 #[1] "Reject H0" ,可以避免错误,这可以确保在&#34; dummyfying&#34;分类变量(model.matrix也在model.matrixlm中隐式调用,以处理分类,即glm变量。

看看

factor

默认情况下会忽略mm <- model.matrix(y ~ x1 + x2 + x3, data = data) 变量factor的第一个级别。 x3在(正确)&#34; dummification&#34;之后与mm相同。