I'm missing something, but I'm not sure what. This is a snippet of syntax based on Kirill's macro for separating a matrix horizontally. I have data with two groups, coded 1 and 2. That separates the matrix into two separate matrices. 'Get x' produces a matrix
of dependent variables. 'Get y' extracts the vector of 1's and 2's presorted. The syntax only works if !gr labeled the same as 'y'. The glitch is in the division of matrix 'x'. Prior to that, 'y' can refer to any !gr. However, in order for the division to
work, !gr must be coded the same as the second 'get' variable (see blue highlighted). In this case it's 'y', but it could be any name for the vector used to split the 'x' matrix. !max refers to the maximum value by which to split matrix 'x'. I'm assuming others
using matrix will be able to spot the error in my logic.
define seo (vars=!charend('/')/gr=!charend('/')/max=!charend('/')) .
set mxloops=100000000 .
/* Separate the two groups. */
compute srt=!gr .
sort cases by srt(A) .
matrix .
get x/var=!vars .
get y/var=!gr .
compute ind=t(1:nrow(x)) .
compute lst=0 .
!do !i=1 !to !unquote(!max) .
compute flag=(!gr=!i)&*ind .
compute fst=lst+1 .
compute last=cmax(flag) .
do if last .
compute lst=last .
compute !conc(x,!i)=x(fst:lst,:) .
end if .
!doend .
print fst .
print lst .
print flag .
end matrix .
!enddefine.
restore .
sep vars=dv1 to dv3/gr=y/max='2' .
Thanks in advance.
Brian
|
Perhaps comment each matrix line with your intention. Would be happy to review after that.
===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD |
Maybe you start with calling the correct macro name: "seo" or "sep"? Mario Giesel Munich, Germany
Am Dienstag, 17. Dezember 2019, 11:15:54 MEZ hat David Marso <[hidden email]> Folgendes geschrieben:
Perhaps comment each matrix line with your intention. Would be happy to review after that. ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD |
Thanks, Mario, but that's just a typo. The macro works fine until the syntax that splits the macro, starting with '!do !i=1 !to !unquote(!max).' I'll take David's advice and comment each line.
Brian
From: SPSSX(r) Discussion <[hidden email]> on behalf of Mario Giesel <[hidden email]>
Sent: Tuesday, December 17, 2019 5:25 AM To: [hidden email] <[hidden email]> Subject: Re: Matrix Macro Syntax Problem Maybe you start with calling the correct macro name:
"seo" or "sep"?
Mario Giesel
Munich, Germany
Am Dienstag, 17. Dezember 2019, 11:15:54 MEZ hat David Marso <[hidden email]> Folgendes geschrieben:
Perhaps comment each matrix line with your intention. Would be happy to review after that.
=====================
To manage your subscription to SPSSX-L, send a message to
[hidden email] (not to SPSSX-L), with no body text except the
command. To leave the list, send the command
SIGNOFF SPSSX-L
For a list of commands to manage subscriptions, send the command
INFO REFCARD
|
In reply to this post by bdates
Variable names in the dataset are not directly accessed within the
matrix-endmatrix command. If you add a 'SET MPRINT ON.' you will see the generated macro code. The line get y /var = !gr. reads the *dataset* variable y into the *matrix* variable y. They are not identical! Later, in the !do loop you have the line compute flag = (!gr = !i) &* ind . which will substitute your call with 'gr=y' to be compute flag = (y = !i) &* ind . This will work as the names are identical. When called with another variable, ie 'gr=z', the substitution generates compute flag = (z = !i) &* ind . This fails as z is here an unknown matrix variable. The correct line in the macro should be compute flag = (y = !i) &* ind . as whatever !gr is read into *matrix* y HTH, PR (My additions in capital letters) *Always helpful with demo data*. DATA LIST LIST / y z dv1 dv2 dv3 (5F8.0). BEGIN DATA 1 1 1 1 1 1 1 3 3 3 2 2 2 2 2 2 2 4 4 4 END DATA. DATASET NAME TwoGroupMatrix. SET MPRINT ON. define sep (vars = !charend('/') /gr = !charend('/') /max = !charend('/') ) . set mxloops = 100000000 . /* Separate the two groups. */ compute srt = !gr . sort cases by srt(A) . matrix . get x /var = !vars . get y /var = !gr . compute ind = t(1:nrow(x)) . compute lst = 0 . !do !i = 1 !to !unquote(!max) . compute flag = (y = !i)&*ind . compute fst = lst+1 . compute last = cmax(flag) . do if last . compute lst = last . compute !conc(x,!i) = x(fst:lst,:) . end if . !doend . print fst . print lst . print flag . PRINT X. PRINT X1. PRINT X2. DISPLAY. end matrix . !enddefine. COMMENT : following line not preceeded by preserve restore . sep vars = dv1 to dv3 /gr = y /max = '2' . sep vars = dv1 to dv3 /gr = z /max = '2' . bdates wrote > I'm missing something, but I'm not sure what. This is a snippet of syntax > based on Kirill's macro for separating a matrix horizontally. I have data > with two groups, coded 1 and 2. That separates the matrix into two > separate matrices. 'Get x' produces a matrix of dependent variables. 'Get > y' extracts the vector of 1's and 2's presorted. The syntax only works if > !gr labeled the same as 'y'. The glitch is in the division of matrix 'x'. > Prior to that, 'y' can refer to any !gr. However, in order for the > division to work, !gr must be coded the same as the second 'get' variable > (see blue highlighted). In this case it's 'y', but it could be any name > for the vector used to split the 'x' matrix. !max refers to the maximum > value by which to split matrix 'x'. I'm assuming others using matrix will > be able to spot the error in my logic. > > ... > > Thanks in advance. > > Brian > > ===================== > To manage your subscription to SPSSX-L, send a message to > LISTSERV@.UGA > (not to SPSSX-L), with no body text except the > command. To leave the list, send the command > SIGNOFF SPSSX-L > For a list of commands to manage subscriptions, send the command > INFO REFCARD -- Sent from: http://spssx-discussion.1045642.n5.nabble.com/ ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD |
Perfect! Thank-you so much.
Brian
From: SPSSX(r) Discussion <[hidden email]> on behalf of PRogman <[hidden email]>
Sent: Thursday, December 19, 2019 3:43 PM To: [hidden email] <[hidden email]> Subject: Re: Matrix Macro Syntax Problem Variable names in the dataset are not directly accessed within the
matrix-endmatrix command. If you add a 'SET MPRINT ON.' you will see the generated macro code. The line get y /var = !gr. reads the *dataset* variable y into the *matrix* variable y. They are not identical! Later, in the !do loop you have the line compute flag = (!gr = !i) &* ind . which will substitute your call with 'gr=y' to be compute flag = (y = !i) &* ind . This will work as the names are identical. When called with another variable, ie 'gr=z', the substitution generates compute flag = (z = !i) &* ind . This fails as z is here an unknown matrix variable. The correct line in the macro should be compute flag = (y = !i) &* ind . as whatever !gr is read into *matrix* y HTH, PR (My additions in capital letters) *Always helpful with demo data*. DATA LIST LIST / y z dv1 dv2 dv3 (5F8.0). BEGIN DATA 1 1 1 1 1 1 1 3 3 3 2 2 2 2 2 2 2 4 4 4 END DATA. DATASET NAME TwoGroupMatrix. SET MPRINT ON. define sep (vars = !charend('/') /gr = !charend('/') /max = !charend('/') ) . set mxloops = 100000000 . /* Separate the two groups. */ compute srt = !gr . sort cases by srt(A) . matrix . get x /var = !vars . get y /var = !gr . compute ind = t(1:nrow(x)) . compute lst = 0 . !do !i = 1 !to !unquote(!max) . compute flag = (y = !i)&*ind . compute fst = lst+1 . compute last = cmax(flag) . do if last . compute lst = last . compute !conc(x,!i) = x(fst:lst,:) . end if . !doend . print fst . print lst . print flag . PRINT X. PRINT X1. PRINT X2. DISPLAY. end matrix . !enddefine. COMMENT : following line not preceeded by preserve restore . sep vars = dv1 to dv3 /gr = y /max = '2' . sep vars = dv1 to dv3 /gr = z /max = '2' . bdates wrote > I'm missing something, but I'm not sure what. This is a snippet of syntax > based on Kirill's macro for separating a matrix horizontally. I have data > with two groups, coded 1 and 2. That separates the matrix into two > separate matrices. 'Get x' produces a matrix of dependent variables. 'Get > y' extracts the vector of 1's and 2's presorted. The syntax only works if > !gr labeled the same as 'y'. The glitch is in the division of matrix 'x'. > Prior to that, 'y' can refer to any !gr. However, in order for the > division to work, !gr must be coded the same as the second 'get' variable > (see blue highlighted). In this case it's 'y', but it could be any name > for the vector used to split the 'x' matrix. !max refers to the maximum > value by which to split matrix 'x'. I'm assuming others using matrix will > be able to spot the error in my logic. > > ... > > Thanks in advance. > > Brian > > ===================== > To manage your subscription to SPSSX-L, send a message to > LISTSERV@.UGA > (not to SPSSX-L), with no body text except the > command. To leave the list, send the command > SIGNOFF SPSSX-L > For a list of commands to manage subscriptions, send the command > INFO REFCARD -- Sent from: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fspssx-discussion.1045642.n5.nabble.com%2F&data=02%7C01%7Cbdates%40SWSOL.ORG%7C7e6094053143483e096b08d784c1b953%7Cecdd61640dbd4227b0986de8e52525ca%7C0%7C0%7C637123839899062043&sdata=qFk3HYxBLFIp9PSfdUEe0I9VLX7WbMFlbxpxydTJANw%3D&reserved=0 ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD |
Free forum by Nabble | Edit this page |