强制LM系数为一个值

时间:2016-08-01 14:49:32

标签: r lm

我正在开展一个关于螺丝重量的项目。

我循环播放,发现了如下所示的多种组合:

head style       measurement  intercept     slope
a                1            x             1.0
a                2            x             2.2
a                3            x             4.1
b                1            x             1.2
b                2            x             2.0
b                3            x             4.1

如果我知道具有相同测量值的那个应该具有相同的斜率。所以a-1应该与b-1具有相同的斜率。有没有办法我可以运行另一个lm,我将斜率设置为一组数字?

2 个答案:

答案 0 :(得分:0)

目前还不完全清楚你在问什么,但我们假设您的原始数据看起来像这样:

head_style measurement  x  y
a          1            .  .
a          1            .  .
a          1            .  .
a          2            .  .
...
b          1            .  .

所以你到目前为止所做的是为y~xmeasurement的每个组合拟合单独的模型(head_style)。现在假设您希望斜率仅依赖于measurement和拦截,以依赖于measurementhead_slope

首先,确保measurement是一个因素

my_dat <- transform(my_dat,measurement=factor(measurement))

现在适合单个lm模型:

lm(y~head_style:measurement + measurement:x, data=my_data)

这应该为head_stylemeasurement的每个组合提供单独的拦截,并为measurement的每个值提供不同的斜率。

答案 1 :(得分:-1)

您可以使用nls函数执行此操作。只需将斜率范围约束设置为您想要的斜率。这是一个例子:

data(mtcars)
df <- mtcars

fitlm <- lm(hp~wt,data=df)
summary(fitlm)

fitnls <- nls(hp~a+b*wt,algorithm="port",data=df,
              start=c(a=0,b=50),lower=c(a=-Inf,b=50),upper=c(a=Inf,b=50))
summary(fitnls)