使用您的数据,
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
如果您有控制数据初始排列的能力,将数据以列为时间序列存储可能会更容易,而不是以行为基础。这样做可以避免在通过
lm.fit()
进行拟合时需要转置大矩阵。理想情况下,您希望数据最初按以下方式排列:
[,1] [,2] [,3]
day1 1 3 1
day2 2 2 1
day3 3 1 5
即,将行作为时间点而不是像现在这样的单独系列。这是因为R期望数据的排列方式。请注意,在lm.fit()
调用中,我们必须转置您的dat
,这将涉及到一个大对象的复制。因此,如果您可以控制这些数据在进入R之前的排列/提供方式,那么对于大问题会有所帮助。
lm.fit()
被用作底层精简代码,用于lm()
,但我们避免了解析公式和创建模型矩阵的复杂性。如果您想要更高效的方法,您可能需要自己进行QR分解(代码在lm.fit()
中执行此操作),因为lm.fit()
会进行一些健全性检查,如果您确定数据不会导致奇异矩阵等问题,则可以省略这些检查。
1:3
(在这种情况下),在更一般的情况下是seq_len(nrow(dat))
。 - Gavin Simpson