从lm提取线性方程

时间:2018-10-03 13:39:46

标签: r lm

假定我具有依赖项为y(t)且参数为p1p2p3的数据 这可能会影响值y(t)。 我创建了3个线性方程,具体取决于 参数p1p2-p3y(t)没有影响,这意味着它遵循随机分配。 您可以在问题结尾处找到可复制的示例。

这三个方程是

p1 p2   Equation   
 1  1   5 + 3t
 2  1   1 - t
 2  2   3 + t

包含随机数据的3个方程的图如下所示:

enter image description here

现在,如果我根据随机数据调用lm()(有关公式,请参见here),我将得到以下结果。

lm(formula = y ~ .^2, data = mydata)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.14707 -0.22785  0.00157  0.23099  1.10528 

Coefficients: (6 not defined because of singularities)
            Estimate Std. Error  t value Pr(>|t|)    
(Intercept)  4.83711    0.17548   27.565   <2e-16 ***
t            2.97316    0.02909  102.220   <2e-16 ***
p12         -3.86697    0.21487  -17.997   <2e-16 ***
p22          2.30617    0.20508   11.245   <2e-16 ***
p23               NA         NA       NA       NA    
p32          0.16518    0.21213    0.779   0.4375    
p33          0.23450    0.22594    1.038   0.3012    
t:p12       -4.00574    0.03119 -128.435   <2e-16 ***
t:p22        2.01230    0.03147   63.947   <2e-16 ***
t:p23             NA         NA       NA       NA    
t:p32        0.01155    0.03020    0.383   0.7027    
t:p33        0.02469    0.03265    0.756   0.4508    
p12:p22           NA         NA       NA       NA    
p12:p23           NA         NA       NA       NA    
p12:p32     -0.10368    0.21629   -0.479   0.6325    
p12:p33     -0.11728    0.21386   -0.548   0.5843    
p22:p32     -0.20871    0.19633   -1.063   0.2896    
p23:p32           NA         NA       NA       NA    
p22:p33     -0.44250    0.22322   -1.982   0.0495 *  
p23:p33           NA         NA       NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4112 on 136 degrees of freedom
Multiple R-squared:  0.9988,    Adjusted R-squared:  0.9987 
F-statistic:  8589 on 13 and 136 DF,  p-value: < 2.2e-16

如果我只想考虑具有高重要性的参数,我会主张忽略接近零的参数。如果我理解正确,零参数不会导致“换行”。然后,我获得以下简化的模型(为便于阅读,对值进行了四舍五入):

            Estimate
(Intercept)        5 ***
t                  3 ***
p12               -4 ***
p22                2 ***
t:p12             -4 ***
t:p22              2 ***

然后我将根据估算值重建理论模型,如下所示 以上(仅高度重要的参数!):

p1 p2   Equation                       Result 
 1  1   5+3t                           5+3t   
 1  2   5+3t+p22+t:p22*t               7+5t   
 2  1   5+3t+p12+t:p12*t               1-t   
 2  2   5+3t+p22+t:p22*t+p12+t:p12*t   3+t    

现在,7 + 5t显然是错误的,但是我不确定原因。 我猜想,lm先后添加了参数,因此相应的模型 上面的模型中没有y ~ t:p2

question和其中的引用可能是相关的,但我没有查看lm的结果-因此,与之无关。

可复制的示例:

r <- generate_3lines(sigma = 0.5, slopes = c(3, 1, -1), offsets = c(5, 3, 1))
t_m <- r$t_m; y_m <- r$y_m; y_t <- r$y_t; rm(r)

mydata <- generate_randomdata(t_m, y_m, y_t)

# What the raw data looks like:
plot(t_m[[1]], y_t[[1]], type = "l", lty = 3, col = "black", main = "Raw data",
     xlim = c(0, 10), ylim = c(min(mydata$y), max(mydata$y)), xlab = "t", ylab = "y")
lines(t_m[[2]], y_t[[2]], col = "black", lty = 3)
lines(t_m[[3]], y_t[[3]], col = "black", lty = 3)
points(x = mydata$t, y = mydata$y)

fit <- lm(y ~ .^2, data = mydata) # Not all levels / variables are linearly
print(summary(fit))

和功能

generate_3lines <- function(sigma = 0.5, slopes = c(3, 1, -1), offsets = c(5, 3, 1)) {
  t <- seq(0,10, length.out = 1000) # large sample of x values
  t_m <- list()
  y_m <- list()
  y_t <- list()

  for (i in 1:3) {
    set.seed(33*i)
    t_m[[i]] <- sort(sample(t, 50, replace = F))
    set.seed(33*i)
    noise <- rnorm(10, 0, sigma)
    y_m[[i]] <- slopes[i]*t_m[[i]] + offsets[i] + noise
    y_t[[i]] <- slopes[i]*t_m[[i]] + offsets[i]
  }
  return(list(t_m = t_m, y_m = y_m, y_t = y_t))
}

generate_randomdata <- function(t_m, y_m, y_t) {
  # Final data set
  df1 <- data.frame(t = t_m[[1]], y = y_m[[1]], p1 = rep(1), p2 = rep(1),
                    p3 = sample(c(1, 2, 3), length(t_m[[1]]), replace  =  T))
  df2 <- data.frame(t = t_m[[2]], y = y_m[[2]], p1 = rep(2), p2 = rep(2),
                    p3 = sample(c(1, 2, 3), length(t_m[[1]]), replace  =  T))
  df3 <- data.frame(t = t_m[[3]], y = y_m[[3]], p1 = rep(2), p2 = rep(3),
                    p3 = sample(c(1, 2, 3), length(t_m[[1]]), replace = T))
  mydata <- rbind(df1, df2, df3)
  mydata$p1 <- factor(mydata$p1)
  mydata$p2 <- factor(mydata$p2)
  mydata$p3 <- factor(mydata$p3)
  mydata <- mydata[sample(nrow(mydata)), ]
  return(mydata)
}

在@MrFlick输入后进行编辑:现在,问题也在Cross Validated

评论:看来,ggplot中的拟合度并不是真正自动的,请参见here

1 个答案:

答案 0 :(得分:0)

简而言之,模型和lm的结果都可以。如this answer on cross-validated中所述,7+5t只是对没有数据的范围的推断。此外,综合数据具有共线性。