使用 by Variable 保存线性回归的参数估计值我正在尝试对按第三列分组的两列进行线性回归,但遇到了困难。 我想要一列具有该行的斜率,另一列具有该行的截距。
简短的背景:
我有 30k 种不同的配方,每种配方都经过 13 种不同水平的酸测试。 我想了解 pH 值的斜率与酸浓度的函数关系。 对于我的范围(和目的),我可以将其作为线性回归来完成。
我的数据表是这样设置的,但有 30k 公式组合和 13 个酸水平,总共 390k 行。
| 公式 |
酸度 |
酸碱度 |
|---|
组合A
|
5 |
6.7 |
| 组合B |
5 |
6.75 |
| 组合C |
5 |
6.5 |
| 组合A |
10 |
6.4 |
| 组合B |
10 |
6.45 |
我知道我可以用 Fit Y by X 绘制它们,对数据进行分组,然后添加线性拟合,但是 1) 需要 30k 组永远花费时间,2) 从该报告中提取斜率是很痛苦的
我目前已按“酸度”拆分表格,拆分“pH”,并保留“配方”。 我知道有类似的东西,并且想要一种方法来填写右边的两列。
| 公式 |
酸碱度5 |
酸碱度10 |
酸度15 |
酸碱度20 |
坡 |
截距 |
|---|
| 组合A |
数据 |
数据 |
数据 |
数据 |
|
|
| 组合B |
数据 |
数据 |
数据 |
数据 |
|
|
| 组合C |
数据 |
数据 |
数据 |
数据 |
|
|
第一个选择是使用公式。 如果我需要编写脚本,我也可以这样做。
谢谢
回复:按列对数据集进行线性回归<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我找到了以下计算表达式的方法。
SS_TOT = 求和( i = 1, N 行( dt1 ), (列( dt1, k ) - 一个平均值) ^ 2 / N 行( dt1 ) );
但计算是针对所有“k”列进行的。
关于如何包含一些分组分离的任何提示?
SS_TOT[gp#1] / SS_TOT[gp#2] ...
回复:按列对数据集进行线性回归回到这个话题。
我了解所有操作并可以应用于我的数据,但仍然对以下部分非常不清楚:
β = J(ng, 2, .);
对于 (g=1, g <= ng, g++,
thisGroup = Loc(groupID == g);
beta[g, 0] = Transpose(Inv(xVals[thisGroup, 0]`*xVals[thisGroup, 0])*xVals[thisGroup, 0]`*yVals[thisGroup]);
);
除了创建 beta 矩阵并将所有数据替换到新表中之外,无法弄清楚发生了什么......
你能帮我理解这一点吗?
回复:按列对数据集进行线性回归将考虑您最后的评论进行检查。 谢谢伊恩
回复:按列对数据集进行线性回归一旦获得了每个组的拟合系数(如上所述),您就可以获得预测值,从而获得残差和残差平方和(对于每个组)。 平方和(对于每组)也很容易,所以你就拥有了获得所需的一切R 平方(对于每个组)。
但请记住,当您向 JSL 添加更多操作时,需要的时间会更长(尽管在这种情况下仍然比使用平台更快)。 当然,还需要有人编写和验证代码!
回复:按列对数据集进行线性回归伊恩
谢谢,这是一个很好的矩阵方法。
有没有办法获得 Rsquare?
回复:按列对数据集进行线性回归巧合的是,我正要指出,如果您知道需要线性回归并且只需要参数,那么 JSL 会快得多。 下面的代码在我的笔记本电脑上花费了大约 100 秒。
名称默认到这里( 1 ) ;
// 制作一些分组数据
GS = 10 ; // 组大小
吴= 30000 ; // 组数
组ID =升序(重复(( 1 ::吴) `, GS )) ;
值= J (行(组ID ) , 1 ,随机正态()) ;
y值= J (行(组ID ) , 1 ,随机正态()) ;
// 将数据放入表中
dt1 =新表( “分组回归数据” ,
新专栏( “团体” ,数字,标称,价值观(组ID )) ,
新专栏( “X” ,数字,连续的,价值观(值)) ,
新专栏( “是” ,数字,连续的,价值观( y值)) ,
) ;
// 取消注释此块以使用 Fit Y By X 进行拟合
/*
// 使用 Y 按 X 拟合
fxy = dt1 << 双变量(Y( :y ), X( x ), 拟合线( {线条颜色( {208, 64, 86} )} ), By(:Group));
// 将拟合后的参数放入表中
//(要以交互方式执行此操作,请右键单击报告中的任何参数估计表并选择“创建组合数据表”)
fxyRep = fxy << 报告;
dt2 = fxyRep[1][TableBox(3)] << makeCombinedDataTable;
// 分割 dt2
dt3 = dt2 << 拆分(拆分依据( :Term ), Split( :Estimate ), Group( :Group ), 剩余列( Drop All ));
dt3 << setName("通过 X 拟合 Y 的参数估计值");
关闭(dt2,不保存);
*/
/// 在 JSL 中进行线性回归,绕过平台。 。 。
// (1) 从表中获取数据
值=柱子( dt1 , “X” ) <<获取矩阵;
y值=柱子( dt1 , “是” ) <<获取矩阵;
组ID =柱子( dt1 , “团体” ) <<获取矩阵;
// (2) 将单位向量添加到设计矩阵中
值= J (行(值) , 1 , 1 ) ||值;
// (3) 对每组进行线性回归并存储结果
贝塔= J (吴, 2 , 。 ) ;
为了( G = 1 , G <=吴, G ++,
本组=洛克(组ID == G ) ;
贝塔[ G , 0 ] =转置(库存(值[本组, 0 ] `*值[本组, 0 ]) *值[本组, 0 ] `* y值[本组]) ;
) ;
// (4) 制作结果表
dt4 =表格(贝塔) ;
dt4 <<设置名称( “JSL 的参数估计” ) ;
柱子( dt4 , “第 1 列” ) <<设置名称( “截距” ) ;
柱子( dt4 , “第2栏” ) <<设置名称( “X” ) ;
回复:按列对数据集进行线性回归彼得的剧本会对你很有帮助。但是,作为参考,如果您要通过 JMP 而不是 JSL 来执行此操作(这通常会浪费时间,具体取决于是否是一次性分析),那么如果您适合 y-by-x,则可以“广播”您的拟合线,如果需要,去喝杯咖啡,然后当 JMP 运行完成后,右键单击其中一个参数估计表并选择“制作组合数据表”以获取包含估计值的表。这就是如何在没有脚本的情况下执行Peter的脚本。
回复:按列对数据集进行线性回归从 Ian Cox 的帖子中获取了大部分相关代码这里。这将进行分析,然后将所有斜率和截距放入表格中。
dt =新表( “样本数据” ,添加行( 6 ) ,
新专栏( “公式” ,特点,标称,
设定值( { “组合A” , “组合C” , “组合B” , “组合C” , “组合A” , “组合B” } )
) ,
新专栏( “酸度” ,数字,连续的,格式( “最好的” , 12 ) ,
设定值( [ 5 , 15 , 5 , 5 , 10 , 10 ] )
) ,
新专栏( “酸碱度” ,数字,连续的,格式( “最好的” , 12 ) ,
设定值( [ 6.7 , 4.8 , 6.75 , 6.5 , 6.4 , 6.45 ] )
)
) ;
// 通过 X 运行拟合 Y
乙肝病毒= dt <<双变量(
是( :酸碱度) ,
X ( :酸度) ,
拟合线( {线条颜色( { 213 , 72 , 87 } )} ) ,
经过( :公式)
) ;
// 对报表层的引用:bivREp也是一个列表
比夫代表=乙肝病毒<<报告;
//“制作组合数据表”避免了向“bivRep”中的每个项目发送消息
dt2 =比夫代表[ 1 ] [表格框( 3 )] <<制作组合数据表;
回复:按列对数据集进行线性回归对于大型数据集和大量 #groupID 来说,运行 JSL 非常有用。有没有办法迭代非数字 groupID。
当然还需要一个列来存储非数字的 GroupID。