使用您的数据,
day1 <- c(1,3,1)
day2 <- c(2,2,1)
day3 <- c(3,1,5)
output.intercept <- c(0,4,-1.66667)
output.slope <- c(1,-1,2)
dat <- data.frame(day1,day2,day3)
我想你想要这样的东西:
fits <- lm.fit(cbind(1, seq_len(nrow(dat))), t(dat))
t(coef(fits))
这使
R> t(coef(fits))
x1 x2
[1,] 0.000 1
[2,] 4.000 -1
[3,] -1.667 2
这些可以dat
像这样添加
dat <- cbind(dat, t(coef(fits)))
names(dat)[-(1:3)] <- c("Intercept","Slope")
R> dat
day1 day2 day3 Intercept Slope
1 1 2 3 0.000 1
2 3 2 1 4.000 -1
3 1 1 5 -1.667 2
如果您对数据最初的排列方式有任何控制权,那么以另一种方式存储数据可能会更容易,将列作为时间序列而不是行,因为它可以避免在拟合时必须转置大矩阵 via lm.fit()
。理想情况下,您希望数据最初排列如下:
[,1] [,2] [,3]
day1 1 3 1
day2 2 2 1
day3 3 1 5
即作为时间点的行而不是你现在拥有的单个系列。这是因为 R 期望数据的排列方式。请注意,我们必须dat
在lm.fit()
调用中转置您的内容,这将需要一个大对象的副本。因此,如果您可以控制这些数据在进入 R 之前如何排列/提供,那将有助于解决大问题。
lm.fit()
使用它,因为它是底层的精益代码,lm()
但我们避免了解析公式和创建模型矩阵的复杂性。如果您想要更高效,您可能需要自己进行 QR 分解(代码lm.fit()
用于执行此操作),因为有一些事情lm.fit()
可以作为健全性检查,如果您确定您可以取消这些检查数据不会导致奇异矩阵等。