【问题标题】:Multivariate regression from scratch error从零开始的多元回归错误
【发布时间】:2018-06-02 17:26:13
【问题描述】:

我正在从头开始计算多元回归。 我有这个代码:

#Multivariate regression 
  set.seed(18814)
  n = 200
  p = 300
  real_p=4
  X=matrix(rnorm(n*p), nrow=n, ncol=p)
  y <- apply(X[,1:real_p], 1, sum) + rnorm(n)
  data1=cbind(X,y)
  betas <- solve(t(X) %*% X)%*%t(X) %*% y

  #Using lm()
  data1=as.data.frame(data1)
  lm=lm(y~X, data = data1)
  lm$coefficients

在代码的第一部分,我从头开始计算它,然后使用lm() 函数进行计算。

我收到草稿版本的此错误:

solve.default(t(X) %*% X) 中的错误: 系统在计算上是奇异的:倒数条件数 = 3.73902e-20

我不明白这是什么意思!

使用lm() 函数我得到了系数,但其中很多是NA 的。 我该怎么做才能获得与使用lm 相同的解决方案,即使使用NA 也是如此。

我非常感谢任何建议。

【问题讨论】:

  • 变量多于观察值。如果你想使用你的解决方案来估计参数,那就不行了。
  • “计算奇异”意味着不能从数据中唯一确定系数(因为回归模型中的变量多于观察值)。具体来说,矩阵 X'X(其中 X 是回归的设计矩阵,X' 是它的转置)没有唯一的逆矩阵。但是这个矩阵需要是可逆的才能确定所有的回归系数。

标签: r


【解决方案1】:

你必须保持数据观察的数量多于数据中数据属性的数量

进行如下更改:

 set.seed(18814)
 n = 300
 p = 200
 real_p=4
 X=matrix(rnorm(n*p), nrow=n, ncol=p)
 y <- apply(X[,1:real_p], 1, sum) + rnorm(n)
 data1=cbind(X,y)
 betas <- solve(t(X) %*% X)%*%t(X) %*% y

 #Using lm()
 data1=as.data.frame(data1)
 lm=lm(y~X, data = data1)
 lm$coefficients

在上述情况下,它不会给出错误,而且系数也不是 NA 值

【讨论】:

  • 如果数据观察的数量多于数据属性的数量,那么就没有足够的微分方程来确定回归中的系数
  • 我认为您在这里没有正确使用术语微分方程
  • 可能是,但在数学和推导中确实包括偏微分。提出一些正确表达这个想法的建议。