如何从线性拟合中提取线数和相应的方程

2024-03-28

我有数据,我期望有几个以下形式的线性相关性

y_i = a_i + b_i * t_i,      i = 1 .. N

where N是先验未知的。问题的简短版本是:考虑到适合

  • 我怎样才能提取N?
  • 我怎样才能提取方程?

在下面的可重现示例中,我有数据(t,y)以及相应的参数p1(级别p1_1, p1_2) and p2(级别p2_1, p2_2, p2_3)。 因此数据看起来像(t, y, p1, p2)其中有at most2*3 不同的最佳拟合线和随后的线性拟合at most2*2*3非零系数。

我遇到以下问题:假设我有三个方程

y1 = 5 + 3*t (for p1=p1_1, p2=p2_1)
y2 = 3 + t   (for p1=p1_2, p2=p2_2)
y3 = 1 – t   (for p1=p1_2, p2=p2_3)

Running cv.glmnet(y ~ t * p1 * p2, ...) yields

(Intercept)        5
t                  3 => y1 = 5 + 3t
p1p1_2            -2 => y2 = 3 + 3t?
p2p2_2             .
p2p2_3            -2 => y3 = 1 + 3t?
t:p1p1_2          -2 => y4 = 3 + t (or y4 = 1 + t?)
t:p2p2_2           .
t:p2p2_3          -2 => y5 = 1 - t
p1p1_2:p2p2_2      .
p1p1_2:p2p2_3   -0.1 => y6 = 0.9 – t?
t:p1p1_2:p2p2_2    . 
t:p1p1_2:p2p2_3    .

期望的结果:程序应该建议 4 个方程 y1,正确的 y4、y5 和 y6,希望有一个充分的理由(哪一个?)来忽略 y6。

Running lm(y ~ t * p1 * p2) yields

(Intercept)        5
t                  3 => y1 = 5 + 3t
p1p1_2            -4 => y2 = 1 + 3t?
p2p2_2             2 => y3 = 3 + 3t
p2p2_3             .
t:p1p1_2          -4 => y5 = 1 - x (or y4 = 3 - t?)
t:p2p2_2           2 => y6 = 3 + t?
t:p2p2_3           .
p1p1_2:p2p2_2      .
p1p1_2:p2p2_3      .
t:p1p1_2:p2p2_2    .
t:p1p1_2:p2p2_3    .

期望的结果:程序应建议 3 个方程 y1、y3 和 y6

我是否忽略了一些显而易见的事情?

可重现的例子

第三列是包含噪声的虚拟因子。为了简单起见,不考虑此列

# Create testdata
sigma <- 0.5
t <- seq(0,10, length.out = 1000) # large sample of x values
# Create 3 linear equations of the form y_i = a*t_i + b
a <- c(3, 1, -1) # slope
b <- c(5, 3, 1) # offset

# create t_i, y_ti (theory) and y_i (including noise)
d <- list()
y <- list()
y_t <- list()
for (i in 1:3) {
  set.seed(33*i)
  d[[i]] <- sort(sample(t, 50, replace = F))
  set.seed(33*i)
  noise <- rnorm(10, 0, sigma)
  y[[i]] <- a[i]*d[[i]] + b[i] + noise
  y_t[[i]] <- a[i]*d[[i]] + b[i]
}
# Final data set
df1 <- data.frame(t=d[[1]], y=y[[1]], p1=rep("p1_1"), p2=rep("p2_1"), 
                  p3=sample(c("p3_1", "p3_2", "p3_3"), length(d[[1]]), replace = T))
df2 <- data.frame(t=d[[2]], y=y[[2]], p1=rep("p1_2"), p2=rep("p2_2"), 
                  p3=sample(c("p3_1", "p3_2", "p3_3"), length(d[[1]]), replace = T))
df3 <- data.frame(t=d[[3]], y=y[[3]], p1=rep("p1_2"), p2=rep("p2_3"), 
                  p3=sample(c("p3_1", "p3_2", "p3_3"), length(d[[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)), ]

# What the raw data looks like:
plot(x = mydata$t, y = mydata$y)

cols <- rainbow(length(levels(mydata$p1))*length(levels(mydata$p2))*length(levels(mydata$p3)))
rm(.Random.seed, envir=.GlobalEnv)
cols <- sample(cols) # most likely similar colors are not next to each other;-)

# Fit using lm disabled - just uncomment and comment the part below
# fit <- lm(y ~ t * p1 * p2, data = mydata)
# coef <- as.matrix(fit$coefficients)
# mydata$pred <- predict(fit)

# Fit using glmnet
set.seed(42)
fit_type <- c("lambda.min", "lambda.1se")[1]
x <- model.matrix(y ~ t * p1 * p2, data = mydata)[,-1]
fit <- glmnet::cv.glmnet(x, mydata$y, intercept = TRUE, nfolds = 10, alpha = 1)
coef <- glmnet::coef.cv.glmnet(fit, newx = x, s = fit_type)
mydata$pred <- predict(fit, newx = x, s = fit_type)

# plots
plot(d[[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(d[[2]], y_t[[2]], col = "black", lty = 3)
lines(d[[3]], y_t[[3]], col = "black", lty = 3)

# The following for loops are fixed right now. In the end this should be automated using 
# the input from the fit (and the knowledge how to extract N and the lines above).
pn <- 0
for (p1 in 1:length(levels(mydata$p1))) {
  for (p2 in 1:length(levels(mydata$p2))) {
    pn <- pn + 1
    tmp <- mydata[mydata$p1 == levels(mydata$p1)[p1] & mydata$p2 == levels(mydata$p2)[p2], ]
    points(x = tmp$t, y = tmp$y, col = cols[pn]) # original data
    points(x = tmp$t, y = tmp$pred, col = cols[pn], pch = 3) # estimated data from predict
    if (length(tmp$pred) > 0) {
      abline(lm(tmp$pred ~ tmp$t), col = cols[pn])
    }
  }
}

相关文章:

  • 基于子组的线性回归 https://stackoverflow.com/questions/40765869/analysis-using-linear-regression-based-on-subgroups: 展示如何使用多级分析。对我来说,它仍然没有解释如何获得最佳拟合线。 ggplot2 显示了其中 6 个,但对我来说 这是一个谜。请注意,我使用了一组不同的测试数据,这些数据更容易解释(线条分开良好,噪声更少,整数a and b).
  • 不同的级别有不同的颜色 https://stackoverflow.com/questions/41143746/how-to-display-different-levels-in-a-multilevel-analysis-with-different-colors: 解释如何显示线条,如果行数已知 and 所有级别都是相关的.

我认为您误解了回归结果。如果方程包含项p1_m and p2_n,那么它还必须包含交互作用t:p1_m and t:p2_n。它不可能是其中之一,而不是另一个。样本数据中有三对系数:

> unique(mydata[,3:4])
#       p1   p2
# 96  p1_2 p2_2
# 1   p1_1 p2_1
# 135 p1_2 p2_3

看着lm结果,我们将方程重构为:

  1. y = 5 + 3t + p1p1_2 + (t:p1p1_2)*t + p2p2_2 + (t:p2p2_2)*t = 3 + t;
  2. y = 5 + 3t + p1p1_1 + (t:p1p1_1)*t + p2p2_1 + (t:p2p2_1)*t = 5 + 3t;
  3. y = 5 + 3t + p1p1_2 + (t:p1p1_2)*t + p2p2_3 + (t:p2p2_3)*t = 1 - t.

这些与您在开始时指定的方程相匹配,因此没有歧义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从线性拟合中提取线数和相应的方程 的相关文章

  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • 用于更改向量中元素顺序的闪亮小部件

    在很多网站上 您都有一个拖放界面来更改列表中元素的顺序 我正在寻找类似的东西闪亮 我希望用户能够拖放列表中的元素 通过更改顺序来更改优先级 现在我有一个滥用的解决方案selectizeInput 这是可行的 但当选择列表变得更大时 它很快就
  • R markdown 引文标识符

    R markdown 允许使用 YAML 元数据部分中的参考书目元数据字段指定参考书目文件 例如 title Sample Document output html document bibliography bibliography bi
  • r - 从我的应用程序下载shinyapps代码

    我正在尝试从shinyapps io 在另一台电脑上下载我的shiny 应用程序代码 我按照这个例子 https support rstudio com hc en us articles 204536588 从 shinyapps io下
  • 如何转置 R markdown 文档中的表格?

    假设我打印一个名为summary table的数据框 如下所示 summary table data frame a c 1 2 3 b c 11 12 13 c c 21 22 23 d c 31 32 33 e c 41 42 43 f
  • 使用 plyr daply 将数据帧转换为矩阵

    我正在尝试使用daply函数在plyr包 但我无法让它正确输出 尽管组成矩阵的变量是数字 但矩阵的元素是列表 而不是变量本身 例如 以下是一小部分数据 Month Vehicle Samples 1 Oct 10 31057 256 2 O
  • R igraph - 保存布局?

    我想知道是否可以 保存 igraph 网络的布局 以便其他人能够重现相同的图表 目前 Fruchterman Reingold 算法总是创建一个新的网络 par mfrow c 1 2 g lt erdos renyi game 100 1
  • 当添加列较少时追加到现有 SQLite 表,而不将数据库读入 R

    是否有一些简单的方法 无论是在 SQL 端还是在 R 端 将 data frame 附加到具有更多列的现有表 缺失的列应该用 NA 填充 如果它能够优雅地处理比表 1 列数更多的表 2 那么会加分吗 library RSQLite Crea
  • 用闪亮的 R 设计 DT 中的展开行按钮

    我正在尝试设计 DT 中可用的展开行按钮的样式 样式可用here https datatables net examples api row details html 我用于创建数据表的代码是 library DT datatable cb
  • 访问动态创建的 Shiny 模块的返回值

    我正在寻找构建一个闪亮的应用程序 它动态创建返回简单表单的模块 通过 callmodule 我有两个未解决的问题 希望得到一些指导 首先 当向用户提供多个表单 通过单击按钮 时 先前呈现的表单上的值将恢复为默认值 如何停止这种行为 以便值保
  • 计算数据帧 R 中字符串的频率

    我想计算数据框中某些字符串的频率 strings lt c pi pie piece pin pinned post df lt as data frame strings 然后我想计算字符串的频率 counts lt c pi in pi
  • 如何在r中进行左连接[重复]

    这个问题在这里已经有答案了 我有两个数据集一和二 数据集一 a b c 111 a 1 112 b 2 113 c 3 114 d 4 115 e 5 数据集二 e d g 222 ss 11 111 ff 22 113 ww 33 114
  • R Leaflet:添加多边形时传递 popupOptions。

    Within addPolygons 有一个popup参数就像addPopups 功能 区别 我认为 是当弹出窗口创建时addPolygons 可以单击多边形内的任意位置来触发弹出窗口 但是如果addPopups 被使用 单个lng and
  • SQL Server RODBC 连接

    有没有人有使用 RODBC 并连接到 MS SQL Server 2005 或 2008 的连接字符串示例 谢谢 library RODBC dbhandle lt odbcDriverConnect driver SQL Server s
  • 使用 SP 包中的 SpatialPoints() 转换坐标参考系 (CRS) 以创建空间数据框

    Issue 我有一个形状文件我已将其导入到 R 中 并为正在进行的分析选择了感兴趣的变量 我的最终目标是插值点数据 海豚 ID 获取海面温度 SST 堆栈中每个单独的光栅文件的值70 栅格来自名为 ncin SST 的对象 该对象是使用函数
  • R Shiny UI 子选项复选框?

    我有一个基本的 RShiny 应用程序 它有一个反应式复选框 它根据复选框中选择的数据 df 列 绘制时间序列数据 我当前的代码生成一个带有复选框输入的 UI 如下所示 Load R packages library shiny libra
  • data.table:从不存在的列到现有列的“get”失败,静默失败

    gt d lt data table x 1 5 gt d x 6 y get i 9 Error in get i 9 object i 9 not found gt d y 1 add a new column y gt d x 6 y
  • 使用开源闪亮服务器时,我的图标不会显示在我的应用程序的浏览器选项卡上

    我一直在尝试找到一种方法将 ico 与托管在开源闪亮服务器上的闪亮应用程序的快捷方式关联起来 最终 我希望 ico 显示为我的应用程序快捷方式的图形 而且 我希望用户在创建应用程序的快捷方式时显示 可用此图标 听起来很简单 但事实证明这是一
  • 准备编程竞赛的缩写和函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 递归累积函数

    我需要在 R 中编写一个累积求和函数 但我一直碰壁 该函数具有以下结构 a x1 a x2 a 2 x1 a x3 a 2 x2 a 3 x1 a x4 a 2 x3 a 3 x2 a 4 x1 等等 cumsum 似乎不适用于此类功能 有

随机推荐