与先前已知的斜率线性拟合

时间:2013-12-20 18:01:05

标签: r linear-regression weighted

我正在尝试拟合线性函数,我知道R:

中此数据的斜率
> flN
   eCenter      eLow     eHigh     arrivalTime_4_8 timeError_4_8  vCenter     vLow    vHigh
1  56.4997  60.25967  52.73972 2012-05-17 02:01:44      41.01283 2.298964 2.236939 2.367869
2 105.5787 108.02476 103.13254 2012-05-17 01:57:37      27.06803 1.787009 1.771748 1.802860
3 164.0613 166.50385 161.61884 2012-05-17 01:49:47      60.42015 1.530334 1.522997 1.537860
4 226.9886 229.78374 224.19346 2012-05-17 01:49:20      50.83871 1.386016 1.381233 1.390904

我的Y是arrivalTime_4_8,Y中的错误是timeError_4_8。 对于上限值和下限值,我的X为vCenter,错误为vHighvLow

所以,有3个问题(我会按顺序排列):

1 - 如何拟合具有设定斜率的线性函数?我尝试使用lm,但我无法找到将斜率放在那里的方法:

lm(formula = arrivalTime_4_8 ~ vCenter, data = flN)

2 - 我知道我必须使用权重= 1 / sqrt(错误)来获得加权拟合,但我如何使用时间轴进行此操作?

3 - 如果我在2轴上进行误差测量,如何计算要使用的权重?一个简单的平方和?

> dput(flN)
structure(list(eCenter = c(56.4996953402131, 105.578651367445, 
164.061343347697, 226.988601498086), eLow = c(60.2596687117468, 
108.024759195324, 166.503850666149, 229.78374170578), eHigh = c(52.7397219686794, 
103.132543539565, 161.618836029245, 224.193461290392), arrivalTime_4_8 = structure(c(1337216504.88343, 
1337216257.43636, 1337215787.45439, 1337215760.18075), tzone = "", class = c("POSIXct", 
"POSIXt")), timeError_4_8 = c(41.0128309582924, 27.0680250428967, 
60.4201539087451, 50.8387114506802), vCenter = c(2.29896400265163, 
1.78700866407098, 1.53033400915538, 1.38601563560752), vLow = c(2.23693860876912, 
1.77174836673712, 1.52299693760316, 1.38123278889559), vHigh = c(2.36786898717605, 
1.80286021104626, 1.5378599964982, 1.39090403398638)), .Names = c("eCenter", 
"eLow", "eHigh", "arrivalTime_4_8", "timeError_4_8", "vCenter", 
"vLow", "vHigh"), row.names = c(NA, -4L), class = "data.frame")

2 个答案:

答案 0 :(得分:2)

如果您有一个已知的斜率vCenter_slope,则可以使用偏移量:

vCenter_slope <- 600.7472
flN <- transform(flN,w=1/as.numeric(timeError_4_8)^2)
m1 <- lm(as.numeric(arrivalTime_4_8) ~ 1 + offset(vCenter*vCenter_slope),
           data = flN, weights=w)
as.POSIXct(coef(m1),origin="1970-01-01")
## "2012-05-16 20:37:05 EDT"

如果你想使用权重,事实证明你必须转换为数字。我认为权重应该是反方差权重,而不是反SE权重。我不知道timeError_4_8代表SE或方差,我假设是SE。

对于X变量中的错误 - 如果你想正确处理这个问题,你将不得不研究测量误差模型,这是一个很大的主题。另一方面,如果你想从模型中得到的只是预测(而不是估计真实的斜率或相关性),那么你可以忽略X中的错误。

答案 1 :(得分:2)

回应@jbssm评论,@ BenBolker解决方案似乎给出了非常合理的结果:

vCenter_slope <- 600.7472
flN <- transform(flN,w=1/as.numeric(timeError_4_8)^2)
# slope fixed
m1 <- lm(as.numeric(arrivalTime_4_8) ~ 1 + offset(vCenter*vCenter_slope), data = flN, weights=w)
# slope chosen by lm(...)
m0 <- lm(as.numeric(arrivalTime_4_8) ~ vCenter, data=flN, weights=w)

library(ggplot2)
ggp <- ggplot(flN)
ggp <- ggp + geom_point(aes(x=vCenter,y=arrivalTime_4_8))
ggp <- ggp + geom_errorbar(aes(x=vCenter, ymin=arrivalTime_4_8-timeError_4_8,ymax=arrivalTime_4_8+timeError_4_8),width=0)
ggp <- ggp + geom_errorbarh(aes(x=vCenter, y=arrivalTime_4_8, xmax=vHigh, xmin=vLow),height=0)
ggp <- ggp + geom_abline(slope=600.7472, intercept=coef(m1)[1])
ggp <- ggp + geom_abline(slope=coef(m0)[2], intercept=coef(m0)[1],color="red")
ggp

红线允许lm(...)设置斜率,黑线使用固定斜率。请注意,黑线距离前两个vCenter点比您预期的更远,因为您的加权与vCenter中的误差成反比。如果这是您的整个数据集,那么使用权重是非常值得怀疑的。

最后,您可以阅读“变量错误”模型herehere。阅读完这些内容后,您可能需要查看支持“Deming Regression”的MethComp包(一种类型的变量错误回归)。