我正在尝试拟合线性函数,我知道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
,错误为vHigh
和vLow
。
所以,有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")
答案 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
中的误差成反比。如果这是您的整个数据集,那么使用权重是非常值得怀疑的。
最后,您可以阅读“变量错误”模型here和here。阅读完这些内容后,您可能需要查看支持“Deming Regression”的MethComp包(一种类型的变量错误回归)。