• R语言
  • 线性拟合的时候强迫过某一点

在R里进行线性拟合时,如果强迫拟合直线过某一点?
多谢
lm(y~x-1)强迫过原点,楼主可以适当变换,强制过你要求的那个点。
[未知用户]

完全不一样。 假设是 $ Y = \beta X + \epsilon$ 过点 $(a,b)=(x_1,\lodts,x_n,y_0)$, 其中$b=y_0$那么可以写成
lm( c(y,b) ~ rbind(x,a) )
或者使用linear contrast 的办法,比如glht(multcomp)
[未知用户]

多谢指教,但是在实际做的时候有些问题:
比如,根据y=6x+7模拟一些数据来回归,强制规定过点(2,19)
x=seq(0,10,0.1)
y=y=6*x+7+runif(101,min=-1,max=1)

a=2
b=19

lm( c(y,b) ~ rbind(x,a) )
会出现错误信息
[quote]
Error in model.frame.default(formula = c(y, b) ~ rbind(x, a), drop.unused.levels = TRUE) :
variable lengths differ (found for 'rbind(x, a)')

[/quote]
library(quadprog)

lmconst <- function(y,x,x0,y0){
    
    x = cbind(1,x)
    n = dim(x)
    p = x[2]
    n = n[1]
    beta = rep(0,)
    A = matrix(c(1,x0),ncol=1)
    b0 = y0
    Dmat = t(x)%*%x
    dvec = t(x) %*% y
    coef = solve.QP(Dmat, dvec, A, bvec = y0, meq=1)$solution
    names(coef)[1] = "Intercept"
    coef
}

x=seq(0,10,0.1)
y = matrix(6*x+7+runif(101,min=-1,max=1),ncol=1)
x=matrix(x,ncol=1)

re = lmconst(y,x,2,19)
re
re[1]+2*re[2]

x = matrix(runif(100),ncol=2)
y = x%*%c(6,2)+1 + rnorm(50)

re = lmconst(y,x,c(2,1),15)
re
re[1]+2*re[2]+re[3]
假设这个不是楼主作业,数值解如上。