我试图实施自己的线性回归似然比检验。
测试是你采用简化模型的平方和和完整模型的平方和,并将其与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有任何影响。我使用内置函数验证的实际答案表明我们未能拒绝原假设。
答案 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.matrix
和lm
中隐式调用,以处理分类,即glm
变量。
看看
factor
默认情况下会忽略mm <- model.matrix(y ~ x1 + x2 + x3, data = data)
变量factor
的第一个级别。 x3
在(正确)&#34; dummification&#34;之后与mm
相同。