创建公式以生成设计矩阵的列<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我是 JMP 的初学者,在 JMP 社区中找不到与我的问题类似的答案。 假设我有一个包含多个列的数据表,用户需要从数据表中选择列,然后根据选择的列生成一个设计矩阵。 所选列和设计矩阵将在新数据表中创建。 但这还不够。 如果用户想要更改新数据表中所选列中的值,则设计矩阵将相应更新。 我的问题是我无法使用以下代码正确更新设计矩阵:
// 创建一个窗口来选择列
// 省略一些代码来创建窗口
CheckAndConvert = Expr(
selectedColumns = c << 获取项目;
// 如果输入有效,我们继续
如果(N 项(选定列)> 0,
赢 << 关闭窗口;
A = Column(selectedColumns);
s = A << 获取矩阵; // 提取 s 中的选择列
// 创建新的数据表“设计矩阵”
dt = New Table("设计矩阵");
dt << New Column("slice", Numeric, Values(s[0, 1])); // 将s复制到新数据表的“slice”列
// 创建设计矩阵的相应列并将它们添加到新数据表中
For( i=1, i<=Col Max(dt:slice), i++,
dt << 新列(“X”||Char(i),数字,
最后之后,
公式(
如果(dt:切片==我,1,
0
)
)
);
);
);
);
PS:在不改变slice列的值的情况下运行代码可以得到正确的答案,但是如果我改变slice的值就无法更新X列。 注意X列的个数是slice列中的最大值,不同值不固定。 在下面的图片中,我展示了在测试数据中选择第 1 列和第 2 列的示例。
提前致谢,
蒲龙
回复:创建公式以生成设计矩阵的列我很抱歉。 我再次阅读了您的请求,意识到在这种情况下 JSL 函数都无济于事。 它们旨在为线性回归的分类因素的影响创建列。
这是一个脚本,它将采用具有因子水平的矩阵,并为二次多项式中的每个项创建一个列的矩阵:
Names Default to Here( 1 );
x2fx = Function( { x }, { n factors, n treat, fx, f, f1, f2 },
n factors = N Col( x );
n treat = N Row( x );
fx = J( n treat, 1, 1 );
For( f = 1, f <= n factors, f++,
fx ||= x[0,f];
);
For( f1 = 1, f1 < n factors, f1++,
For( f2 = f1+1, f2 <= n factors, f2++,
fx ||= x[0,f1] :*</img> x[0,f2];
);
);
For( f = 1, f <= n factors, f++,
fx ||= x[0,f]^2;
);
fx;
);
X = [1 10,
2 20,
3 10,
4 20,
5 15,
6 15];
D = x2fx( X );
Show( D );
制作自己的功能并不难。
回复:创建公式以生成设计矩阵的列请参阅帮助 > 脚本索引。 更改浏览器以显示功能。 然后选择 Matrix 函数组。 你会在这里找到几个函数来从设计矩阵(因子水平)制作模型矩阵(对于术语)。
回复:创建公式以生成设计矩阵的列
我想我有一个类似的 - 如果不是相同的 - 问题。
我想从类似于 Matlab 中的 x2fx 的预测变量创建设计矩阵。
例如:通过选择预测变量并指定设计类型(二阶交互作用),然后生成设计表。
请参阅下面来自 Matlab 的示例:(但我想在 JMP 中执行此操作)。
示例 1
以下转换 2 个预测变量<FONT face="Courier New" size="3">X1</FONT>和<FONT face="Courier New" size="3">X2</FONT> (列的<FONT face="Courier New" size="3">X</FONT> ) 到带有项的完全二次模型的设计矩阵<FONT face="Courier New" size="3">持续的</FONT>,<FONT face="Courier New" size="3"> X1</FONT> ,<FONT face="Courier New" size="3"> X2</FONT> ,<FONT face="Courier New" size="3"> X1.*X2</FONT> ,<FONT face="Courier New" size="3"> X1.^2</FONT> , 和<FONT face="Courier New" size="3">X2.^2</FONT> .
X = [1 10
2 20
3 10
4 20
5 15
6 15];
D = x2fx(X,'quadratic')
D =
1 1 10 10 1 100
1 2 20 40 4 400
1 3 10 30 9 100
1 4 20 80 16 400
1 5 15 75 25 225
1 6 15 90 36 225 回复:创建公式以生成设计矩阵的列非常感谢你的帮助。
我今天已经找到了解决问题的方法。
回复:创建公式以生成设计矩阵的列好的,非常感谢。
所以听起来缺少的部分是能够在报告窗口中编辑(数字)列的单元格,在这种情况下,您可以使用“NumberColEditBox()”。 对于字符列,您可以使用“StringColEditBox”。 通过结合这两者,您可以在您的代码控制的编辑器窗口中显示任何表格(尽管我猜您需要跳过行状态和表达式列):
名称默认到这里( 1个) ;
// 使用数字列
dt =打开( “$SAMPLE_DATA/大类.JMP” ) ;
名称= “高度” ;
验证值=柱子( dt ,名称) <<获取值;
// 界面
净重=新窗户( “编辑单元格” ,行政长官=编号列编辑框(名称,验证值) ,按钮盒( “更新” ,更新细胞)) ;
// 更新脚本
更新细胞=
表达式(
净重<<关闭窗口;
新值=行政长官<<获取矩阵;
dt <<开始数据更新;
柱子( dt ,名称) <<设定值(新值) ;
dt <<结束数据更新;
) ;
回复:创建公式以生成设计矩阵的列谢谢你的回复。 您对工作流程的理解正是我正在做的。
关于“定义切片”:
我已经设计了窗口来完成这个任务。
关于“更新切片”:
困难在于自动更新用户所做的任何更改。 我可以生成设计矩阵,但我不知道如果用户在切片列中进行了一些更改,如何自动更新设计矩阵。 此外,如果我知道如何自动更新设计矩阵,通过稍微调整代码来自动生成基于设计矩阵的其他列将不是问题。
谢谢,
蒲龙
回复:创建公式以生成设计矩阵的列非常感谢您提供更详细的解释。 也许我可以用不同的词回应它以确保我已经理解?
假设第一个表(包含所有可能的切片)称为 dt0。 想想你上面的关键步骤:
- 用户在 dt0 中选择一个列(一个切片),并制作一个新表(称为 dt1),其中仅包含该切片,加上设计矩阵的列(加上您提到的其他派生列,但不要拼写) .
- 您希望用户稍后能够修改 dt1 中的切片列并让 dt1 中的其他列“自动”更新。
我想您最终的加载项将有两个菜单选项:“定义切片”和“更新切片”。 如果我对上面 1. 的描述是正确的,那么通过调整我已经建议的代码可以很容易地获得这个“设计切片”脚本:表 dt1 可以放在一个共享文件夹中,这样其他人就可以得到它,你可以添加任何内容您想要的元数据到表或其中的列。
“更新切片”脚本可以向用户显示共享文件夹中的所有可用表,并允许他们选择一个。 不过此时,他们不会直接编辑表格:相反,他们会看到一个报告窗口,允许他们修改表格中切片列的值。 在这里,“修改”可能意味着更新现有值或添加新行。 当他们在此报告中单击 OK 表示他们很高兴时,dt1 可以自动更新以反映他们的所有更改,您还可以根据需要更新元数据。 当然,这个“更新”代码与“定义切片”是通用的。
除非我误解了,否则这个工作流程似乎是合理的,甚至可能比让用户免费访问 dt1 本身更好。
回复:创建公式以生成设计矩阵的列由于这是第一次使用 JMP,我将尝试用 JMP 脚本语言来描述我的问题。 简而言之,我有一个数据表,其中有一个“切片”列,我想根据切片列生成设计矩阵,并根据设计矩阵生成其他一些列。 我需要做的是开发一个实现这个任务的 JMP 插件,以便其他同事也可以使用我的插件进行计算机实验。
首先,我想开发一个选择切片列的窗口,并生成一个包含切片列和设计矩阵的数据表,并保存公式如果稍后更改切片列中的某些值,则自动更新设计矩阵. (我需要保存公式,因为我的项目经理要求它,但如果我想出更好的解决方案,我可以在不使用公式列的情况下说服他。)
现在,我可以创建窗口,并生成包含切片列和设计矩阵的数据表,但是如果我更改切片列中的值,设计矩阵将无法更新。
关于切片列:
我知道 JMP 中的设计功能可以自动生成设计矩阵,但如果我想要公式列,它就没有帮助。 所以我编写了自己的函数来生成我的设计矩阵,如我的脚本所示。 假设我有切片列 a = [1, 1, 2, 3]'。 然后设计矩阵将生成为
1 0 0
1 0 0
0 1 0
0 0 1。
切片列可能变化很大,因此很难通过手动查看切片列来了解设计矩阵有多少列。 此外,切片列中的值可以任意修改。
我认为创建生成设计矩阵的关键步骤如下:
1.选中切片列,点击“确定”按钮,会生成一个新的表格,其中包括切片列和设计矩阵。 显然,此步骤涉及人工干预。
2、如果我手动修改新表中slice列的一些值,那么原来的设计矩阵会自动删除,生成对应的新设计矩阵。
其次,我还需要根据设计矩阵生成一些列,我也写了生成它们的脚本,但我不知道如何将它们保存为公式列。 如果我知道如何保存设计矩阵的公式列,这个问题就不是问题了。
最后,如果我成功创建了设计矩阵和一些列,那么我会将它们打包为一个插件,并在许多不同的情况下进行测试。
谢谢你的建议。 如果我让自己明白了,请告诉我。
蒲龙
回复:创建公式以生成设计矩阵的列我当然可能是错的(取决于您需要解决方案的通用性),但我觉得公式列不是尝试此操作的最佳方式。 源表中的一列(通常)映射到多列这一事实,以及此类列的数量是源列中级别的(可变)数量这一事实使这变得困难。
在提供另一个建议之前,也许您可以更详细地描述您设想的工作流程,好吗? 还指出哪些步骤涉及人工干预。
回复:创建公式以生成设计矩阵的列感谢您的帮助。
我需要从一列生成设计矩阵,这样我也可以在列中的值发生变化时更新设计矩阵。 事实上,我想创建一个公式来根据选定的列生成设计矩阵,并保存该公式,以便在修改选定列中的某些值时更新设计矩阵。
在我的代码中,生成了设计矩阵,但如果我更改所选列中的某些值,我将无法获得更新的设计矩阵,这是我正在努力解决的问题。 如果您能就我的问题提供一些建议,我将不胜感激。
谢谢,
蒲龙
回复:创建公式以生成设计矩阵的列我不太确定你在找什么。 但鉴于您是 JMP 的新手,下面的代码可能会给您一些想法。
名称默认到这里( 1个) ;
// 测试表
dt =新表( “测试” ,
新专栏( “C1” ,数字,连续的,公式(随机整数( 1个, 5个))) ,
新专栏( “C2” ,数字,连续的,公式(随机整数( 1个, 5个))) ,
新专栏( “C3” ,数字,连续的,公式(随机整数( 1个, 5个))) ,
添加行( 10 )
) ;
// 界面
新窗户( “更新设计” ,
面板盒( “选择一列看设计” ,
润滑剂=排队箱( NCol ( 2个) ,
clb =列表框( dt ,全部,数字,最大项目( 1个) ,最小项目( 1个) ,脚本) )
)
) ;
// 根据 clb 中的选择动态更新 line up box lb 的脚本
脚本=
表达式(
// 获取选中列中的值
值=柱子( dt , clb <<得到选择) <<获取矩阵;
// 删除任何现有的矩阵框
尝试(姆<<删除) ;
// 获取矩阵框中的设计矩阵
姆=矩阵盒(设计(值)) ;
// 追加新的矩阵框
润滑剂<<附加(姆) ;
) ;