So, in this one, we're going to pre-process the data and do some quality assurance stuff to it. And I'm going to be moving it tiny bit faster than I was in the earlier module. So when I say pre-processing, I mean before you get into the gating and the clustering and all of that actual analysis stuff, you have to pre-process your data and make sure that what you're starting with is something that makes sense. So things such as compensation, which we expect you guys to already understand that really well and know what the best way is to do it, Ryan already addressed that. Also how to transform your data. So the transformation is important. In Flowjo, when you're looking at your data, it kind of doesn't really transform your data, but it transforms it for display purposes, right? So that it looks nicer so that you can gait it on the screen. Choice of transformation is very important, as I will show you on the next slide. Also remember that how we had when we were plotting the forward scatter, side scatter, dot plots of the flow frame. And there were these dots sort of at the end of the plots that were the margin events of forward scatter because the cytometer is not capable of recording values greater than a certain value and it just assigns that value to the ones that are greater. That's kind of like a technical kink that we should clear up in order to facilitate the automated gait later.  And then at the end, before dinner, I will do quality assurance. Some example remember Ryan was going over some of the quality assurance things and there was this HTML web page with these green dots and yellow dots and red dots. We're going to actually make one, one of those. And I'm just going to focus on some simple ones just so that you get accustomed to how to work with that package that creates those quality assurance HTML web pages so that when you're later reading the vignette for that package, you will know what's going on and be able to do fancier stuff. So pre-processing steps, they vary from data set to data set. Different data sets have different sort of little issues you have to clean up. But this is the common, the common ones. That's all you have to compensate your data well, otherwise further analysis will be meaningless. I have seen many data sets where they send me the data set. It's already been compensated poorly and all the information about how it was compensated is they just don't know what they did, what the software was doing, but they're still giving me the data and hoping that I can do something with it. I can't. Like Ryan said, garbage in, garbage out. If you give me crappy data, there's nothing I can reverse engineer about is going to get into its original, higher quality condition. There's also issues with poor staining or poor experimental design, panel design, whatever, cytometer issues where no matter what you do, you just can't, the compensation is terrible. There's nothing you can do to make the data be good. And again, there's nothing we can do about that. If that's your data, then that's too bad. So when you said the compensation was terrible and they don't know what they did, they were actually manually changing the compensation. Yes. And also. It was a big inquire. I believe that that's what, it's a very excellent question. They couldn't really give me a straight answer. And I don't know why that was, but also in Flojo they watched around with something and they flojo did something, but they didn't know what Flojo was doing and they just assumed that if they just can't hand me the files, I should be able to magically, like reproduce everything that Flojo ever did, like as a machine. So there's also cases where biologically speaking, the physical parameters of the experiment set up make it so that, you know, certain stains just don't go well together, right?  I'm saying I will not do that for you. I cannot. No, no, no, no. What I'm saying, what I tend to do is we use single, we use beads with a single color stain, and then we set up a compensation, so collect beads with a single color, it's when we've, when we've, when we think we've got our volumes about arrived, then you can collect single color comps and then let be recalculate the matrix. Yep. If you go back and collect some more cells and if the vultures still look about right, then you've probably got your comps and your vultures about right. Yep. That sounds like something very good. Yeah, so that's... No, it doesn't always happen, so make sure it happens, because if it doesn't, then... So just keep doing that. Because I'll keep doing the right thing. Yes. So that's one thing that I just have to point out that if you have poor starting data, there's nothing I can do about it. Then the next step, you construct a procedure to objectively remove debris, doublets, margin event, all of these pre-processing things, and objectively means that because we're going to be automating all of this, you're not going to be gating each and every sample separately or anything like that. Are you going to try to think of some kind of way that you can do it objectively? So the crime was saying manual gating. There's a lot of variability. You give it to one person and then to the next, they gait different things. Slightly different, but maybe if you gait 25 populations in a row, in the end, you end up with completely different populations than you started with. So... As soon as it... No. How long... But we can do it. Yeah. That's questionable. We have the tools to do it. Sure. Yeah. We have to do it. We do it all the time. Yeah. We have to have some objective function in your head. Work is a double. Yeah. And so usually it's based on position. So you find port side, you find stuff that's above someone. Yeah. Use force to get, force better. Use force better. You can use any number of... That's... Yeah. And you think best describes what a doublet is. All of the... All of these procedures, removing the debris, doublets, margin events, they're all... The way that you construct this code, this procedure, is you think about how do I do this manually in Flojo? Well, you know, I go like this. What is the... How do you go like this? Well, I try to get rid of all the really low forward scatter things. And, you know, capture most of them, but not in the really far away.  So you try to encode that logic into R. And we will do this. Good job. The R part is the R part. Yeah. Putting it into logical terms is definitely... Yeah. Try to describe... People have this intuitive sense of what it is. What it seems like very difficult to be able to write down as a variable and a chain, and it becomes things. And it becomes harder to program. It's a program that requires set of rules. You have to be able to explain it to a computer how you're gating. You can't just tell me, oh, you get it like this. No. What does this mean? They're a little bit... Yeah, exactly. What do you mean, exactly? We'll get there. So after you have removed your debris and all of these useless cells you don't want to be working with, you transform your data carefully. And after that, of course, after the transformation, you're going to be able to remove the dead cells and then proceed with the regular analysis, the interesting analysis where you do your gating or discover your diagnosis or whatever you're doing. So today we're just going to be pre-processing. It's probably the most... More important than the actual gating part. So I'm going to talk a little bit about transformations. Log... It's a lot of the channels that you measure on a log scale, right? So when you look at them, your plot will have 0, 10 to the 1, 10 to the 2, 10 to the 3 on the... It's because it's on a log scale. So we have to transform the values so that they make sense to us when we look at them. Log by definition cannot handle negative values. A lot of the negative numbers are undefined, mathematically speaking. So in flogel, that's when all these negative cells, instead of undefined, flogel just sets them to be 0 right on the margin. So that's when you sometimes get a warning that you have too many cells on the margin.  When you have a compensation, you know how a lot of the values actually get pushed to be negative? Because your compensation is good. So sometimes if you have too many negative values and you use log, they're going to end up on the axis and you're not going to be seeing what your data actually looks like. You're just going to be looking at some dots and the plot in a bunch on the margin that really it doesn't... It's not very informative. So what people do instead is use the bi-exponential. Bi-exponential is just a class, a family of functions that how many here have heard of arcs-inch? Yeah, heard it. It's one type of bi-exponential function. Another one is logical. Has anyone heard of logical?  Actually, I don't know, but I assume this is what Flogel is doing. Because Flogel doesn't tell you exactly the formula that they're using but it's essentially using a logical transform. It's just another type of bi-exponential transform. And arc-sinch is defined for negative values. So it's better than log in that sense because if you give it a negative value it's not going to put it on the margin on the axis. But it kind of has this kink where it kind of splits artificially positive numbers and negative numbers into make it look like two separate populations sometimes. I will show you a picture in a minute. The logical transform addresses that issue with arc-sinch. So it's better than log because it handles negative values and it's better than arc-sinch because it has more parameters that you can sort of play around with to make your transformation look even better for your specific type of data that you have. Someone said they were interested in the transformation math stuff. Who was that? You? Okay. So mathematically speaking, what is log? It's the inverse of this function. Y equals e to the x. Is everyone familiar with the number e? Usually I guess you'd be working 10 to the x, log 10 scale, but this is the natural log scale. So the inverse of this function is ln y. It's natural log. So when you're talking about a log transform it's inverting this function basically. Here's arc-sinch. It has the same e to the x part but it's adjusted by e to the minus x which is a small number. The inverse of this function is log of y plus square root of y squared plus 1. If you think about this, here if you put a negative value into log y it will be undefined. You can't take the log of a negative number. Here if you put a negative number it will get squared plus 1 and then square root it so it's a little bigger than itself, just negative. So it will never be undefined. It will always give real value. So that's the benefit. It could be very, very small. Yeah, it will be very, very small so it will be artificially... It's just artificially closed up above zero. Yeah, something like that. It's exactly just so that you can take the log of it and then when you take the log of a very, very small number it actually has a very negative value. So yes, here's the... So remember arc-sinch is defined as the inverse of this. The inverse of this function which the solution for is here. This is the bi-exponential in general and this is sort of where the logical transform which is the one that as you probably guessed is the best one because I mentioned it that's better than all the others. This is what its form is.  Same with B and same with W. So there's actually all of these in F and D. So there's all of these parameters that you can tweak to make the transformation optimum. Don't worry, we're not going to be asking you to be choosing these numbers. We're going to estimate them for you. But just to give you an idea of where the logical transformation comes from you start out with log that looks so simple and you end up with something that is the same idea as log but really just fancy it up a little bit so that it can be tweaked and it can... we can do the best we can with the transformation of the data. Here's an example of the same sample we were working with earlier. Forward Scatter, Side Scatter. Oh, we're not using RStudio yet. I will let you know as soon as we get to the code part. So remember how it was really squished and I had to plot it, cut it off at like 5,000 and it was still kind of squished looking? This is when you do a log transform on the Side Scatter channel. Suddenly it looks much better, right? How many people think it looks better? Good. Here is when you do arc cinch. It looks almost the same as log, right? Here's when you do the logical transform. They all kind of these three look kind of the same. Not really any benefit over which one should you choose. Why is that? Because Side Scatter by the physics of it never has negative values, right? So taking the log of it, you're not going to run into the issue of taking the log of negative numbers. Arc cinch, you're not going to run into the issue of artificially splitting negative and positive numbers into two separate populations. Logical didn't really have too many issues to begin with. So in this scenario, if you're looking at trying to pick a transformation for the Side Scatter channel, it really doesn't make any difference which one you choose. Just choose one and be consistent. Might as well choose logical. Here's an example of where it does matter. This is the same sample and I'm plotting the R780 channel, which is the one with CD3, measuring CD3. This is no transformation.  You can't really make sense of this. So when you open it, I don't know flow. I think by default it does log or tries to do log or I'm not sure. I think you can use the problem to allow a client to find possible transformation, other ones default and follow the pages a lot more. Yeah.  There's actually 13.89% of cells who would be on the axis because there's 13% of the cells have CD3 expression negative. So when you take the log of these numbers, they seem to kind of disappear. Instead, if I did the arc since transform, this is what I would get. This part of the plot is exactly the same as this entire plot. These cells are the ones that were negative and see how they are kind of artificially split from this population. These cells should really be combined with these. It should be CD3 positive, CD3 negative, not CD3 positive, CD3 negative, CD3 really negative. So that's what arc since has this little kink that it does. And this is what the logical does. Because of all these extra parameters, we can tell it, you know what, there's actually way more negatives. Don't shoot them off at the end. Just kind of try to bunch them with these low-valued ones. So this is... Yeah, it can. It's a bit divided by 2. Yeah. That's not the thing that varies actually. What they would probably have is some kind of parameter here, like a times e to the x minus b times... I think that's the only thing that can really vary there. You can. I think just the cofactor takes care of that problem. Just the 2? No. I'm not sure if it's just you. It's not the 2. There is something else. Yeah, there is something else. And the logical is just the generalization of exactly that. It's the generalization of exactly adding a cofactor and changing that. So it's just logical. So now we're going to be doing stuff in RStudio. Okay. So especially for those of us with slower computers, this here removes all of the current variables that are stored in our R session. So right now I can do x, like that we did earlier in the day. They're still there. But when I execute this command, it's going to delete all of them. It's like starting fresh. Now there's no x. This kind of helps prevent you from getting messed up just because we're starting a new module.  So just running this will automatically close all the plots. So they're not stored in your memory and are trying to maintain all the previous plots that you did. It's just going to make it faster for you. And we already loaded this package before, but let's just make sure it's there.  This is where our files were stored. So what did I do here? I named this variable to be there. Remember, there it gives you basically a list of all the files in the directory you're specifying. So I wanted it in this folder to remember, what did I have in there again? Right. All my files. So if I want to read in the first file, I can actually remember read.fcs. You have to supply the exact file name with the path of it and everything. So here's a new function we're going to learn, paste. It kind of is the concatenate for strings. So I pasted together the string fullfcs slash, which I know is my folder name, plus the first file in that directory. And you get this. Does this make sense? Why are you doing this? It's just if you have, for example, an Excel file sheet or an Excel sheet, and there's a list of file names in there, but only the file names are not going to tell you what directory they're stored in on your system, right? On your computer. So you want to read in all of the ones that it says next to them that they're HIV positive. So you're going to read in your Excel sheet into R. You're going to locate all of the rows that have HIV positive diagnosis and take those file names. And you can't say read.fileName. You have to specify which folder it is, where it is. It comes in really handy all the time. You will see this when you're reading vignettes. So... It's another way. It's another way. Yeah. Something like that, yeah. This step equals quotation marks, nothing, and quotation marks just means how should I separate these two strings that I'm concatenating? You can separate them by the number eight. It will insert this number eight here. So I didn't want them to be separated by anything. And now you can read the flow frame like this. Because now first file has the exact file name. Before we had to type it out exactly in quotation marks and have the folder name and everything. This is just one way that you can help automate the file names. And that's just the same flow frame as before. Now the first thing we're going to do is talk about compensation. This data set is not compensated. It has been... A compensation matrix has been created for it, but the data we have is raw. It's uncompensated, so we have to apply the compensation. If you remember where we had this long conversation about this, all of these gibberish keywords here and we decided some of them maybe are useful, some of them not so much. There was one here, spill, that contains the spill over matrix. It's automatically saved. So if you execute these lines, I've just printed out just a small portion of them here on the screen. What does this mean? Have you ever seen a compensation matrix? In Flowjo, you can export it, right? This is what it is. So when you say it's... Compensation matrix. Yeah. Does this make sense? Everyone's familiar with what this represents? I don't even know. 7% of this stain has spilled over into that one and you have to adjust it, basically. That's what it's saying. Oh, sorry, I didn't print it all out on my screen because it would be on separate lines. So how do we compensate? You use the function compensate. Very convenient. They use the old BDBs because you can't compensate the 450 channel with BDBs. So the 450 compensations are zero. Oh, okay. So that's bad? But it's just what it is. So you can't compensate 450. This is the point where I trust the biologist knows what they're doing. We trust them a lot. Exactly. So let's compensate. So you can see that this function compensate came from the package flow core. So it's one of those core functions that is one of those things you typically do with flow cytometry data. So it's part of the standard flow cytometry analysis package. And you can see how it works. It takes a parameter X and a parameter spillover where spillover is the spillover of compensation matrix and X is an object of class flow frame or flow set. So all I did was compensate. I put my flow frame in there and my compensation matrix. And how can we tell that it's been compensated? So you guys can run this while I'm doing the presentation. If you run summary F, it's another function you can run on a flow frame object. And it gives you sort of an overview of the distribution of your data. So within that flow frame F, the minimum forward scatter value is 23,410. The maximum one is 262,100. The median, so that's like your MFI here, the median, right, is 41,000. And it has this for all... I have only printed out some of them. I don't want to have too much stuff going on. This is for the F, the original flow frame before we compensated. Now the one that we compensated, we call it f.com, so we keep track of where we're at. When I do summary of that one, the forward scatter and side scatter summaries, they're identical. There was no compensation down on the scatter, sorry, the three scatter channels, right? We don't compensate those. This one seemed to have changed very, very little. I mean, this is negative 67.28, negative 67.34. So this one was already pretty clean channel. The compensation didn't really affect it too much. But look at this one. This one had some significant spillover into it. Suddenly I went from having a minimum value of minus 67 to a minimum value of minus 26,000, right? So this is just to prove to you the compensation was applied. Does this make sense? Now, yes. Again, we defined the compensation information that generated the matrix M was already in the FCS file. Yes, it was already automatically embedded. We linked and saved it. So when we load a compensated FCS file, as a flow joke, it already comes up as compensated. But when you load it into, ah, it's not compensated, we just have to run it. So the flow joke is automatically running. Yeah, and automatically applying it, yeah. Cool. Yeah. We're basically trying to do what flow joke does behind the scenes. With a little more polarity, right? I'm delighted that I'm basically learning how flow joke works. Yeah, well, that's the thing. I don't know exactly how flow joke works. It's a mystery. It's a mystery. It's a secret. Okay, so we're clear on compensation. The one thing about compensation is it's very important that if you're analyzing your own data, that's wonderful. But if you're analyzing someone else's data, there's always this huge miscommunication about is the data already compensated? Like you just said, some people think that just because when they open it on flow joke and it looks compensated, that it must have been compensated to begin with. They don't realize flow joke is secretly compensating for them. So sometimes they'll give me the data and say, oh yeah, it's already compensated. And I'll work with it and ask them, are you sure? Yes, absolutely, it's already compensated. And then I spent some months working on it and realized it wasn't compensated. I don't want to say that it was just a miscommunication. So that's something to be... It's always set to true. In my experience, that's what I thought when I first saw that keyword. There is a keyword that is something like this. Yeah, it's just misleading. Yeah, it misled me. Okay, so I'll assume we're good on compensation. It's just compensate and specify your matrix. If for some reason what some people do is this matrix will be stored in there from Diva or whatever, but then they'll go and open it up in flow joke, delete that and compensate it themselves in flow joke. Then you can actually, instead of giving this matrix M, you can essentially replace all of these entries with the entries you got from flow joke if you feel that that's a better compensation for your data. And then again, you would just do compensate F, M the exact same way. Okay, so now I'm going to do a little... So this was on compensation. The data that we're working on is the HIV data Ryan mentioned briefly. It has 466 samples and 13 colors. We don't have the computational power right now to be doing this in the workshop. So what I've done is I've just chosen 20 samples and I have only... Unfortunately, it's not going to be super interesting what we end up with biologically, but for illustration purposes, it should be good enough. I have only selected a few colors. Okay, so I have those three files we were working with earlier. There's actually 466 of them. I took 20 of them only, deleted a bunch of the colors because it would be too difficult otherwise. And I only took 20,000 cells of each. They had hundreds of thousands of cells before. If you want the whole data set, it's available for repository.org? I don't think they want it. It's not theirs. But yeah, it is publicly available data. So this is what I have done this. So now you can... I have actually saved it onto the virtual machine. So if you look on the folder, it's right there. Okay, that's the... You shouldn't have this other stuff. Before we define the flow sequence, what you've done is you've already done that and saved it so that you can just... Yeah, basically I... That's exactly what I did. We did one of the three files and you've gone back and forth. I've done 20 and I've deleted some of the colors. So now load fs.rdata. So it has... I guess I can work here. It has 20 files, like I told you. The first one, there it is. It's a flow frame object just like before. It has 20,000 cells. All of them have exactly 20,000 cells. I randomly chose 20,000 from each one. And I have only... kept these markers here. This vivid slash 3d14, that's, I guess, a viability slash dump channel. And then we have Ki67, 3d3, 3d8, 3d4, 3d127. So we're clear on this. So we can plot it. Just the first thing you ever do when you load in your data, plot it, make sure it looks right. And remember these cells here that we were talking about before, that are right here on the margin. How would you get rid of them? If you say you're XLIM, that would only plot it so that you don't see them. But I want to completely get rid of these cells. I don't want to be analyzing them anymore. I want to gate them out, so to speak. Get them. XLIM is part of the... XLIM is just within the plot function. It's just for display purposes. So... I want to remove them. Yeah. Yeah, okay. That's right. So first of all, we all agree 250,000 seems like a legit threshold. Just looking at it. I want to first identify the indices of these cells. Which are... Is it the first cell that's in those margin events? Which cells are they? So which cells are they? We're going to use which for the function which. This here that I have selected right now, Express FS1. What does that mean? What was that? We used that earlier. You're switching the first file closer to expression values. Yep. So it's like the matrix of the values I'm taking. And within that, I'm taking only the column that is forward scatter area. So, if I just took this, these are all the 20,000 cells and these are all the forward scatter values that are present in my flow frame. Which of these are greater than or equal to 250,000? That's essentially what this line says. Is that matrix E that we had before? It's basically the expression values. These are all these numbers where each row was the measurement of each cell. So you're just asking the matrix to tell you... Exactly. Which ones, yeah. So now I have what margin cells contains now. These are all the indices of the cells which are on the margin. The 15th cell had a forward scatter value greater than $250,000. $250,000. The 27th cell that went through the cytometer also landed in that region. The 69th cell also landed in that region and so on. So these are all the cell numbers that I do not want anymore. I don't want to keep them around. How many of them do we have? 601. What can I do with that? I had 20,000 cells to begin with. So this is how you can calculate the percentage of margin events that your data had. 100 times the length of the margin events divided by the number of cells. 3%. So there we have calculated one type of quality thing. 3%. If that number happened to be 50%, you'd probably be pretty unhappy with your data. So clearly when you're analyzing your flow set you're not going to be plotting them one by one, putting a blue line where all the cells are there and then you're going to do this in an automated fashion where maybe all you're going to be looking at at the end is the 3%. And if you have 100 samples and you write a little function that will do this for you automatically you'll see 3%, 2%, 3%, 2%, 50%, 2%. The sample that had the 50%, you probably want to take a closer look at that one or just exclude it. So that's one sort of hint of where we're going to go with quality assurance later today. So let's plot this again. And let's try to visualize these margin events. You guys can all see the red dots, right? The red. So how did I do that? This is one visualization technique that is really helpful when you're gating a population or trying to remove the margin event or something like that. You want to just visually maybe present the results to someone else or just convince yourself that you did the right thing. Remember how A is a matrix here? I took the expression values of the flow frame but only the forward scatter and side scatter channels. This is one way you can plot full cytometry data. Just give it as a matrix. Remember what was PCH about? Yeah, point character, yeah. And the Y limb was just for the display, right? Just so that it looks prettier for us. I just wanted the Y values to go between 0 to 1000 because there's maybe one or two dots higher than that. Now this points function, what it does is it will plot the thing inside of it on top of the current plot you already have. So this first plot is just all the black dots, right? Everything. The second plot, because I'm not saying plot, I'm saying points, is going to keep this plot open and add some points additionally on top of the current plot. And what am I actually plotting this time in red? Substituting the matrix. Exactly. I'm only taking the rows, so remember margin cells are the cell number 6 and 10 and 12 that were margin events. Now I'm taking the rows of these cells and only the forward scatter and side scatter column, right? Because A my A started out being just forward and side scatter so now I'm going to take the forward and side scatter of only the margin events. And I'm going to plot those on top of the existing plot in red. Okay, so far so good. And this C ex equals 2 stands for character expansion. So I want it to be a dot still, just like here I said point character should be a dot, but I want it to be a little bit bigger than these black dots because otherwise it's really difficult to see. And in fact I want those dots to be twice as big. It just helps the margin events pop out a little bit. You can play around with that if you want. Yeah, you did okay. You seem very pleased. Here's one additional plotting feature we can add in order to make these plots presentable. Legend. So you can add a legend to the plot and you can by keyword specify that I want it at the top of the plot somewhere. And the actual legend should read margin events are margin percent percent. So this is another time where this paced function comes in handy. This is the sentence that that produces. I'm going to paste these things together. The words margin events, comma whatever my actual margin percent was remember earlier we calculated it 3.005 and then I'm going to add the string percent so that it's clear. So the color red is clearly why this is red. The red stuff is the one that's the margin events. This pch point character used in the legend. The code 19 corresponds to a solid circle. If you were interested in seeing what the point characters are you can do plot something like this. So the first if you say point character equals one or you don't say anything if you don't specify point character is the period the dot it's going to plot these open circles. 19 is here. So if you're making a plot with a bunch of different things and you want to annotate them using point characters there's a bunch. So now we've identified the margin events. We've in fact plotted them. Now how do we actually take them out of our flow frame? Just plotting them in red doesn't really do anything.  Take them out. And now when you do that you have 19,399 cells left. So we removed 601 cells which were the margin cells. Does this make sense? So far, yeah. So let's see if we'll have anything else here. I don't think so. So so far what we have done is compensated and removed the margin events. I have to show you that we've done that because it's actually... You tell me. Why don't you instead of doing plot again this is what you can do. What am I doing so far? Points. I'm gonna be plotting it on top. I'm gonna do it in green. I'm gonna use dots still but I'm gonna make them just a little bit fatter than the black dots just so that they pop. I didn't plot any green over top of the red, right? Otherwise it would be green. Is that good? Now I'm gonna move on to transformation. Let me just check how long I have. Okay. We've got a lot of stuff to cover. So we talked about transformation. Let's just think about it before we try to apply it to our data. Think about how does it work in R? I just talked about it in theory. You know, this transformation stuff. So let's imagine you have some values that you want to transform. Let's say your values are A, 1, 10, 100. You know, those are standard exponential values, right? If you take the log 10 of A you get 0, 1, 2, 2.7, 3. Does that make sense? Because 1 is 10 to the 0 power. 10 is 10 to the 1st power. 100 is 10 to the 2nd power and so on. A center of A is just another less straightforward transformation. This one is pretty clear because you guys know 1 to 10 to the power, whatever. A center is a little bit more fancy. But again, we put in some values, some other values come out. With the logical transform, however, there's actually a function that generates that transformation. It's not automatically built into R1. Okay? So it's a little fancier. It's been added by... I don't even know which package has it. Or it's just a fancier transformation. So you have to actually generate it. Let's look at the help. So it creates a subset of a bi-exponential transform, hyperbolic sign transformation function, blah, blah, blah, blah, blah, blah.  M, A. You can read about the parameters.  These parameters, W, T, M and A are the things that you're tweaking. So if you don't do... If you don't put anything in this call to the logical transform, it will just use the default values, which are already pretty good. If you wanted to, you can actually play around with these values yourselves and tweak them and see what your data looks like, tweak them again, see what your data looks like. But don't worry, the standard ones work really well. So just heard the whole logical transform package in R is actually written by way more than we actually invented in the logical transform. That's great. Yeah. So it's not as natural as typing in log 10 of A or a inch of A. It's because it is a little bit of a pancier construction of a transformation. So you can't just type logical of a... It's not going to really print anything. It just...  It's not printing them to the screen. So you have to actually print it. And here's what they look like. 0.5, 0.55, 0.95, 1.7, 2.0. Just some transformation of our original numbers, 110, 105,000. Okay. So log transform would give you these numbers. An archsinge transform would give you these numbers. A logical transform gives you these numbers. Now let's try it with some of our actual values, these A values, 110, 180,000. Let's try it with our values. Let's try it with the CD3 values there in the R780 channel. Here's the first four values. Now you guys can run those lines of code yourselves. I'm going to switch to this. So everybody can run these lines here. What are we going to be doing? First of all, remember this MF row where I plotted three plots, one after the other. Now I'm going to do four plots and I want to be able to see all of them at the same time so I can compare between the plots. So I'm doing two by two plotting region. One, two, three, four. It's going to look like this. Two rows and two columns of plotting region. And these two don't worry about they're just to make the margins of the plots a little bit smaller so that they fit on the screen a little bit better. Then I'm going to plot the density of my values. Remember my values are just the raw expression values of the CD3. I'm going to plot the density. Then I'm going to plot the density of the log 10 of those values. Then the density of the arc center of those values. Then the density of the logical transform of those values. Does everybody have those plots? So the first one is the raw untransformed values. You can see how they're all bunched up in the very beginning, the lowest values. You can see that there's two populations probably a CD3 negative and a CD3 positive, right? But they're really bunched up there. They don't look that great so you have to transform them so that your method will be better able to see them. Here's the log transform. That looks pretty good. There's nice peak and another peak but this peak looks very small. Why is that?  Decided their throw away. The arc cinch, this is basically, you know, like a not very well parameterized version of the logical. If you don't play around with the parameters then this is what you end up with, a split right around zero. And then here's the logical. Looks legit, right? For example, you've done many monocytes and you're trying to look at CD3 because of cells that get cinched. Yeah? Yeah. Because then you've got, you've still got some other cells that are not lymphocytes. Yeah. Not much more than lymphocytes. Yeah? Okay. So by doing this we kind of convince ourselves using the logical transform. Transform is valid here that it doesn't look like there's anything weird going on. You know, it's pretty straightforward dataset. So now this next code it's going to generate this plot. Okay? So let's go through it line by line and see what it does. So again I'm making my screen two by two. I'm gonna plot, you know, the untransformed, the log tens, the arc cinch and the logical. Okay? A next deeper question. You've already called something F.  Now the old F is gone. I have replaced it with this new clean. Exactly. But the new F is based on the old F. It's a form of transformation with clean margins. So it's okay because it's a separate, it's actually a separate variable. Exactly. Yeah. It just seems a little bit... So the reason why is because actually theoretically speaking you should be replacing it all the time because that saves space in your memory. Your computer is like, I have this variable called F. Now I have this variable called f.cleanmargin. Now I have this variable called f.cleanmargin.7. Now I have this. But if I say, here's my variable F, my variable F cleanmargin. Now my new variable F I'm gonna... It's a little bit more efficient. And we just call it different things because they're bright and shiny. Well, yeah, right now I want us to be learning it. Exactly. And also, because in these next steps I'm gonna be plotting this thing and I don't want to type f.cleanmargin. It's also laziness factors into it. It's also for clarity just so you can read it better. So this first line again generates this 2x2 plot region. The first thing, notice how I'm using the flow-vis package plotting. This time I'm just giving it a frame. I'm not using the express f and that smooth equals false because otherwise it looks too, like to me it doesn't look super clear what's going on. The main, the title of that plot is no transformation. Now, how do I transform actually within the flow frame the data? Before I just kinda plotted log10 of the values, right? The values. I just plotted it but how do I actually make it transformed? You just take these values which are the original values, the side scatter values and you just replace them by the log10 of those values. It just... Again, you're replacing the third. Yeah.  And when I do that, I don't know what that happened, when I do that, now I can plot basically the same thing I did up here but now in this f the side scatter values have been replaced with the log10. How's that? It's a little... Produced. Yeah. That's because... not a number. N-A-N means not a number and it's because you're taking the log10 of... Oh wait. Are you doing side scatter or did you just skip ahead to the C3? Oh yeah. When you're running twice, now you're taking the log of the log. So if you accidentally run a line twice, go back to here.  So is that clear? What I did? So now I'm going to do the exact same thing. I'm going to start with the clean margin. But now I'm going to take the arc cinch of the channel and plot that. And then I'm going to do the exact same thing but this time with the logical. And that reproduced that earlier plot that I showed you. Oh actually, I didn't do that. So this is basically, instead of looking at this plot here to assess how your transformation is doing, you could instead do that plot that we just did. And in fact, that's the next step.  It basically makes this exact same plot but instead of for side scatter for the CD3. So I'm going to let you do that and let you know when you're done. I'm going to get some coffee. Okay. I think that's probably good. We're good. So, remember how I told you that the logical transform actually has these parameters that you tweak them and it makes your transformation better. So for this data set it was actually pretty decent already. We didn't need to play around with the parameters at all. The default ones just worked. But there is actually this function that someone really nice wrote, which actually has some mathematical estimation of what is the optimal parameters and uses those. So instead of doing the logical transform you can do the estimate logical transform. Which first takes your sample and tries to look at its distribution of those density plots that we were looking at earlier. It kind of like takes this in, looks at this and tries to figure out what are the best parameters to make it look really nice and clean like this. And it does that for you behind the scenes. If you really, really want to know you can do course question mark and there's logical transform explained in this help as well as the estimate logical. So you can read through all these details and there's some references to papers and stuff that if you really wanted to read. But just take my word for it that it's worth a try. It's not necessarily always going to be the best one but when you're trying to choose a transformation for your data always visualize your data using one transformation and another and another and pick one of those. Don't just go with something blindly and never look to see and make sure that it looks good. It might not be always, there's no one transformation that works on all data sets ever. Unfortunately yet. The logical is pretty safe but and here's how the estimate logical actually works. First you define your transformation using this because it's fancy we use the special function estimate logical and because it estimates the parameters based on your data you must supply it with your data. So you define the transformation based on your data and you also specify which channels you want to transform. So it's not just one at a time you can actually give it all the channels you want transformed. So here's the call names of F remember with all the parameters it's like the columns matrix with all of the data all the cells and taking the third to the ninth channel gives me all the ones that are I know are log scale so I must transform those. So I have here this line creates a logical estimate logical transform for all those channels simultaneously and the way that you apply it on the frame is using this function transform it's written specifically for flow data you specify the flow frame that you have and the transformation function that you have defined. So now F trans has is transformed now we want to visualize that and you know just double check and now we're going to use this new package that is not in bioconductor yet flow density because it has some nice visualizations added to it. First you have to load this other package that's necessary for the visualizations and then the flow density package.  If we don't have that it happens to me it's because I ran over one line a couple of times accidentally and I probably re-transformed it one more time so just go back and move on all the lines up until that one. Okay, so what's this? Forward scatter versus side scatter notice how we have removed the margin events they're not there anymore and I have plotted CD3 versus this here is the viability dump channel so these are the dead cells and this is the CD3 positive live cells Here I have Ki67 versus CD4 I randomly chose these just so that we visualized all the colors so it looks like CD4 has a pretty nice positive and negative fraction Ki67 is kind of I guess I would draw my gate around here somewhere it doesn't really have that many positives and then I have CD8 and CD127 doesn't particularly interesting right now Does this make sense? Looks a little bit more familiar try to copy flow gel a little bit Is that what time is it? What time was the copy break supposed to be at? 3 o'clock Let me just see if we can do a couple more things Well, what did we do so far? We probably want to do the same to the whole flow set not just the long flow frame so we're gonna work with four loops Is anybody familiar with a four loop in programming? Very good Ryan So just to illustrate how it's done in R if you haven't done it in R this is what it is basically you say four and then you put some kind of variable you're gonna refer to within the four loop for I in the values one to three print I squared and there it prints one, four, nine It makes sense It doesn't have to be I and it doesn't have to be numbers it can be a longer variable name like channel in the call name so the parameters of the flow set four to the number of columns No, because that relaxed meaning your variable names should be sensible they shouldn't be generic So I'm gonna use I for channel I'm gonna use Chan because then when I read this print channel I'm printing the channel informative channel names So sort of like running a script so instead of being able to do this for 12 samples that are right Yep whatever is inside of here you do it we did our code for the single flow frame right but so far I mean we did a lot of extra things you know we managed to remove the margin event and transform it now I'm not gonna be removing the margin events for the second one and transforming that one and the third one right here's your flow frame remove the margin events transform but do this for all 20 of them so that's what that's the idea so that's yeah it's a do this while I go yeah so I do this here these two lines to close all the plots because again it's getting a little heavy on the memory usage of the computer and I'm reloading the data again just this one time because we have been kind of running our lines of code a few times here and there we may have accidentally affected the original flow set and I want to start fresh because we want to do this four loop thing properly right now remember how we plotted our flow frame with forward scatter and side scatter and then we saw these cells at the end and decided that 250,000 was the right value to choose well I don't want to be plotting each and every one of the 20 samples and making sure that the 250,000 is indeed the right value to choose for all of them so what I'm gonna do instead when I have a large enough data set so here I have 20 samples instead of plotting on 20 of them I'm gonna take at random a few cells from each of them each of the 20 sets and I'm gonna so it's like a pooled sample I guess you guys do that sometimes as well like controls and stuff right you pool yourselves together to get a better yes yeah so from the first frame I'm randomly selecting let's say a thousand cells randomly and a thousand from this and a thousand from that one and hopefully I can get sort of a broader overview of what all of my data looks like and this is it and the way that I got this random sample from each of the frames I'm not gonna go into detail on that what I have done is supplied you guys with this function that I wrote you can actually open it and see what's in it if you want it's in the folder code and then in the folder support code support functions if you look through this I have all these little functions here that I have written for you that will make life much easier for you so you don't have to every little thing that you do you don't have to you know do it from scratch like we've been doing so far today so it's actually to help you guys out for later it's free code just for you nobody else has this you do this actually all the time huh? yes and it is possible that some of these functions will not work perfectly for you every time but because I have given you the starting point you should feel free to go through them and see how I'm getting the lymphocytes for example I have one function called gate lymphocytes or something like that and remember how we talked about you must put it into logical terms how do you gate out the degree exactly you know oh I do this well how do you do this I have made decisions about how I do this while coding this function if you read through it carefully I have some pretty good you know explanations within the function you can see what my logic behind it is and if you disagree with some part of it feel free to change it to suit your own needs anyways we're not going to go through this at all right now I just want to point out that I have I have this function that I have written get global frame and what it is is basically you just supply the flow set and it gives you this randomly pulled frame that represents the whole flow set in just one frame so you can visualize all of your data into a sort of one as if it was just one so I have done this for you you can go through it on your own time and try to figure out how I did it but for now let's not talk about it just take it for granted in order to make use of my functions tell R that we're going to be using these functions you must make R read my script so the way you do that is using source and now you can actually make use of my function get global frame now global frame I call it global because it's a global over your whole set it's just a flow frame right it's just a flow frame object doesn't have a name because it's not anything really it's just randomly generated and the way I've written my function is it kind of gives you twice as many cells as you start with just to make sure it gets every little artifact that could be in the data set and this you plot it exactly the same way you plot any other flow frame right you put the flow frame and your channel names your wire limit if it looks funny otherwise now instead of just removing the margin cells I decided to just sort of roughly gate the lymphocytes very rough correct me if I'm wrong my opinion is that these cells should be kind of removed they're a little bit no the low end these cells are probably doubles or something like that same with these so really I just want these cells do you agree so these values so far we have none generated in an automatic way yet I just eyeballed it I just looked at it and decided these are the sort of static gate values that I would use to roughly gates the lymphocytes so it's exactly the same thing we did before where we set it at 250,000 except now I have a bunch of them that end up sort of outlining the population that I'm really interested in does that make sense so far how did I like it's kind of difficult to eyeball this right it's you know a bit of a mess so you can actually the side scatters fairly clear you know it's really like there's a bulk of the cells here cut off there but the forward scatter it's a little unclear where to draw the line so if you wanted to one you could use a different visualization plot the density of the forward scatter channel yours will look slightly different because you generated a different randomly selected global frame right so yours will be just slightly different from mine does this make sense sort of what does yours look like very different how did I select something so because I remember how I had 20 samples but I wanted yeah I just took randomly some cells I didn't want to take you know the first 10,000 so does this make sense as a very rough preliminary approach to removing debris it's it's very basic very like it's not like you set a flow join you do a nice little circle around there you know because you know the cells should be all in a circle it's kind of more rough like get rid of these get rid of these but it sort of makes sense right does it no sort of makes sense yeah okay yeah good side scatter it's pretty clear just this one time because we have this is the last thing I'll do before we break for coffee because we only do have 20 samples it's not 100 why don't we just plot these supposive gates you know 35,000 and 125,000 and 600 over top of every one of our samples just to visualize what they look like and convince ourselves that they do indeed work for every one of our samples so it's not perfect right there's still some in some of them it looks like the lower debris is a little there's still some left over but we're not gating out and then there's some that we've gated a little too much maybe but for now for a starting point it's good enough if I had a very large data set let's say 100 samples clearly I'm not going to be plotting each and every one of them and looking but what I would do is randomly select 10 of them and plot those and just just to double check that my data is reasonably of good quality there's not too much variation if I were to do this kind of approach so far so good so what do we do we first sort of preprocessed one single frame by removing the margin events and transforming it then we decided maybe we should go to the whole flow set but we didn't want to be looking at each and every frame one by one so we created this pooled sample and decided to kind of use that as our basis for our logic of creating steps to preprocess so far we're at the point where we have created a we have designed we haven't actually applied but we have designed an approach to remove mostly debris in our flow set and we're going to do that next after the copy break


Producing high-quality home-canned fish is a point of pride for many Alaskans. Canning, also referred to as jarring, is an excellent way to preserve food, allowing fish to be stored safely for up to one year before eating. I'm Sonia Cuckell with the Cooperative Extension Service of the University of Alaska Fairbanks. This session will provide the necessary steps for canning fish in jars. Because fish is naturally low in acid, pressure canning is required to kill dangerous microorganisms. For more information on pressure canning, you may view our complete learning module. Research on food preservation is an ongoing process. The United States Department of Agriculture and the Cooperative Extension Service continuously apply new research findings to their recommendations for food preservation techniques. The guidelines in this module may be revised as additional knowledge is gained that may increase the margin of safety or improve the quality of home-preserved foods. Consult your local Cooperative Extension Office annually for updated information. The equipment necessary for canning fish includes a pressure canner with a dial gauge or a weighted gauge, wide-mouth straight-sided jars, two-piece self-sealing lids, jar lifter, and a sharp knife. Before you begin, read and familiarize yourself with the directions for your canner. If you don't have an instruction manual, contact the manufacturer for a new copy. Make certain that your pressure canner is in good working condition. Inspect the gasket. It should be soft, pliable, and free from defects such as rips or tears that might allow air to escape. The canner must be airtight when it's sealed. Check the safety plug to ensure that it is correctly seated. And hold the canner lid up to the light to be certain that the vent is not blocked. If you're using a dial gauge, have it checked annually for accuracy. Dial pressure gauges may be checked by your local Extension agent. Half pint, pint jars, or quart jars may be used for canning fish. Make sure you follow the specific instructions for the jar size you choose. Procedures and processing times for the quart-sized jars are different. Be sure to use wide-mouth straight-sided jars as they are easier to fill. You will use two-piece lids to seal the jars. The flat lid has a sealing compound. The ring holds the lid in place until the jar is sealed. Lids cannot be reused. Use new lids every time you can. The rings may be reused if they are not bent or rusty. When you catch fish, handle them with care to avoid bruising. Be aware that exposure to the sun or heat may cause the quality of the meat to deteriorate. Bleed fishing immediately after catching to increase its storage life. And remove the internal organs and rinse the fish inside and out. Keep your fish iced, refrigerated, or frozen until you're ready to can. The fish should be stored at temperatures colder than 40 degrees Fahrenheit. You can use either fresh or frozen fish for pressure canning. Many Alaskans choose to freeze their catch for one year. When fishing season arrives again, they take unused fish out of the freezer and can it. This gives fish an effective shelf life of two years. Now, when using frozen fish, it may be thawed in the refrigerator or by placing the wrapped fish under cold running water. To prepare the fish, rinse it in cold water. You can add vinegar to the water up to two tablespoons per quart to help remove slime from the fish. Remove the head, the tail, the fins, and the scales. It's not necessary to remove the skin. You can also leave bones in when canning salmon. For halibut, you'll want to remove the bones as well. Always keep fish refrigerated until you're ready to pack in jars. In preparation for canning, wash your jars in hot soapy water. Run your finger around the rim of the jar to check for scars or nicks that might prevent sealing. Prepare the jar lids and the rings according to manufacturer's directions. Often, you'll be instructed to heat the jar lids to soften the sealing compound. Cut the fish into jar-length fillets or chunks. Keep it simple using the fewest cuts possible. You can leave the skin on or take it off. There is some controversy as to whether the fish should be packed with the skin side out or in. You choose. Either works. Pack the fish solidly into the jars. Press the fish to fill up as much airspace as possible. Filets can be rolled before packing. Leave one inch of headspace between the fish and the top of the jar. Because salmon has a significant fat content, no additional liquid is required. When canning halibut or lean fish, up to four tablespoons of olive oil or vegetable oil may be added to each jar. The oil will add moisture to the product, but will also increase the calories. Salt, seasoning salt, or other spices may be added on top of the packed fish. Check the Cooperative Extension Service publication titled Add Variety to Homecanned Fish for more suggestions. After packing the jar, clean the rim with a damp paper towel or wipe with a dry paper towel to remove any fish oil. Attach the jar lids and the rings. Now, how tight should the rings be? They should be finger tight. Remember that the purpose of the ring is to hold the lid against the jar until it seals. Overtightening the ring may cause the lid to buckle. Tighten the rings slightly beyond the point of resistance. No further. To begin the canning process, center the empty canner on the heat source. And add two to three inches of water. The temperature of the water should be similar to the product in the jars. Put a rack in the bottom of the canner. The rack helps to prevent direct contact between the jars and the heat source, causing the jars to break or crack. Place filled jars on the rack in the bottom of the canner. If your canner is deep enough, jars may be stacked. After the first row is in, put another rack in or offset the jars by placing one in between two others. When your canner is filled, fasten the lids securely. Lids only fit on one way. Most have an arrow showing where to match the lid to the handle. Be sure the lid locks completely. Leave the weight off the vent port or open the petcock. As air inside the canner heats, it expands. This pushes the excess air out of the canner through the vent port. Heat the canner at the highest setting until steady steam flows from the petcock or vent port. Once there is a steady stream, allow the steam to escape for 10 minutes. Now, close the vent by shutting the petcock or by placing the weighted gauge on the vent. The canner will pressurize during the next three to five minutes. When the pressure reaches 11 pounds on a dial gauge or 10 pounds on a weighted gauge canner, begin the timing process. Process pint jars or half pint jars for 100 minutes. Note the starting and ending time in writing just in case. And frequently monitor your canner. If the pressure drops below the recommendation, the canner must be brought back to the recommended level and the timing started over. For altitudes greater than 1,000 feet above sea level, contact your local extension agent for recommended times and pressures. Now, if you decide to use quart jars, there are specific procedures to be followed. When using larger quart-sized jars, more time is required to heat the product thoroughly. The total time it takes to heat and vent the canner filled with quart jars should never be less than 30 minutes. The total time may be more than 30 minutes, especially if you have tightly packed jars, are using cold fish, or a larger-sized canner such as this one. Once you close the vent and bring the canner up to the recommended pressure, process the quart jars for 160 minutes or two hours and 40 minutes. When the timed process is completed, turn off the heat and remove the canner from the heat if possible. Let the canner depressurize. Allow the pressure to drop naturally. Don't apply cold water or a cold cloth to your pressure canner. After 30 to 45 minutes, check to see if the pressure has dropped by tipping the weight or checking the dial gauge. Open the vent when the pressure reaches zero or no steam escapes when the weight is tipped. Then wait 10 minutes. Unfasten the lid and remove it carefully.  Remove the jars from the pressure canner with a lifter and place them on a towel or cooling rack. Allow the jars to cool for 12 hours before moving them again. Never rush the cooling process or your jars may break. Jars should be cooled in an area away from drafts because air blowing on hot jars may also cause breakage. Jars will seal as they cool. When the canning process is complete and your jars have cooled for 12 hours, check the seals by tapping the jar lids. If some jars did not seal, such as this one, you have three options. You can reprocess the unsealed jars within 24 hours using a fresh jar lid. Now reprocessing does not affect the quality of the fish. You may also freeze the contents of the unsealed jars or refrigerate the jars and use the product within three to four days. The rings may be removed from the jars when the cooling process is complete and you've checked the seal. Label your jars with the date, processing method and processing time. Store your canned goods in a cool dark place and for best quality use canned fish within one year.


Hi folks, I'm here with Liam O'Mara, who is running in California's 42nd Congressional District. He has advanced to the general election after making it into the top two back in March, and he is here to talk about his campaign. Liam, welcome. Thank you. Happy to be here. Yeah. So you have such an interesting background. So you are a professor of Middle East history, and you were running against a Republican named Ken Calvert. I've never heard of him. And there's a reason for that. Before coming on, you described him as a ghost. So I want to get to all of that, but first, let us know who you are and why you decided to run for Congress. Oh, let's see. So kind of a big one. The short answer to that is I have a diverse background. I come from a solidly working class family. I'm actually the first person in my family with a college degree, and I didn't go to college right away. I did not expect to. In fact, I didn't even take the SATs in high school. I had no possibility of going to college. And at age 30, I found a way to jump into it. So after that, I mean, I'd had experience already working as a fourth generation long showman in the Port of LA. I worked as a fry cook. I drove trucks. I carried a class A driver's license for 20 years. But I jumped into college and then went straight through to a PhD. So for the last dozen years, I've been teaching at colleges. And I genuinely love that as a job because I feel like I'm giving something back and engaging with people. But I have to look my students in the eyes and tell them things are screwed for you, that things are going downhill. After 40 years of decline in the real economy under neoliberalism, despite all the media lying about the economy, we can talk about that if you want. But the real economy has been shrinking steadily for 40 years. My generation is the first one in American history not to do better than the one before. The millennials are worse off than me, Gen Z is worse off than the millennials. We are in steady decline as a society. And frankly, I'm pissed. And I'm pissed not only as a worker, I'm pissed as someone who understands why this is happening and wants to shake things up and get people talking about the real issues again so we can push back against it. Yeah, I like that you said that because if you're not pissed right now, then I feel like you're not paying attention. And I get that that's kind of a cliche, but it really is true. There's so much going on. There's so much at stake. And I think that everyone in their own way is kind of stepping up and for you to be like the first member of your family to go to college, that's incredible. And now, you know, for me, I was also the same person, same in my family, the first to go to college. And you know, for you now to want to run for Congress. It's awesome to see that, you know, you're willing to step up and fight because that really is difficult. Like to run for Congress is it's a self sacrifice, I feel like. And so anyone who's running, I think is really they're doing a lot, especially if you're running for the right reasons.  So you have a really robust platform you were endorsed by Andrew Yang, Ted Lu. You kind of check all the boxes. So if you like our regular viewer of the humanist report, then I think that you are like the ideal candidate. You explain Medicare for all so well. And I love that, like to find a candidate that goes beyond just the generic endorsement of Medicare for all is very valuable because this is such a complex topic and really winning hearts and minds is crucial to me.  Like how do you explain this to constituents? Yeah. So first off, there's, there are two things about my immediate background that really help with dealing with issues like this. For one thing, I'm a policy wonk by nature. If I want to talk about an issue, I dive into it. I read stacks of books.  I have 34 bookcases and three cats wandering around. So I'm pretty much a nerd about that stuff. But I also, for a living, explain complex ideas to people in a way that's, that's useful. So I'm accustomed to like breaking things down and, and putting it across and I've tried to bring that into the campaign. And I think again, myself having working roots and not being a particularly pretentious ivory tower type, I can just sit there over beers and chat about these issues and try to break them down for people. I actually have a number of people that have joined the campaign as major supporters who had been Republicans their whole lives and just sat down with me and like, dude, I'm a Democrat. Like this makes sense.  It's not at all. Medicare actually gives you more consumer choice and more freedom, far more so than we have now. The key issue that you can have to explain to people, I mean, there's a few things you can come at it with shifts in the framing because people, especially coming from like the left or the liberal perspective on things like Medicare, they'll approach it from a moral standpoint.  It doesn't matter to them. But what could matter are the issues of freedom and cost. If you tell somebody, say for example, a lot of people get their employer, insurance from their employer, right? Now when they get the job, they get told, this is your salary and these are your benefits. Together, that's a compensation package. If we write this legislation correctly, then what happens when the employer is no longer paying $17,000 a year for your insurance and instead paying $1,500 or $2,000 or something like that in to an overall kitty and then you're paying a little bit in here if you're paying like $1,500 to $2,000 a year there, there's an extra $12 or $13,000 just sitting around. It's part of your compensation package. Medicare for all would be the largest raise in pay for the middle class and more than a generation. You tell somebody that you're going to get to keep an extra $12,000 of your own money and you pique a conservative's interest. And then from there, you go on to explain that, well, this would leave all the doctors still private, all the healthcare providers are still private, they're all still doing their own thing, but you can now go to any of them. So I'd be like, Mike's like, hey, Liam, you got to check out this doctor I've got, he's fantastic and I'm like, well, he's out of network, I can't go and I don't have that ability now because they're all these limited networks and if you take that away and it's a single insurance provider, not only do I have the freedom to go anywhere and seek any care at all, you write it again such that it's just rubber stamping things. So the person making the decisions about your healthcare are you and your physician, period.  We already have death panels. They're called for-profit insurance companies and they're going to look at, well, this test is going to cost me $10,000, there's no way I'm giving them that MRI.  They make those decisions already. If you take the profit motive out, then the only choice there really is the physician's choice. You don't have to make money off of somebody. So it's not a government takeover of healthcare, it's replacing the corrupt insurance industry, which is a parasitic middleman that does nothing for anybody. No one loves their insurance, they love their provider and the ability to go to their provider. You give them a gold-plated insurance plan from the state and it does the same thing. And just, the last point I'd make on this that I bring up in the area, too, is the question of cost. And from there, you can make a simple actuarial argument. You've got a whole bunch of different insurance companies, each with x number of people in them, and you have to balance out the sicker with the healthier, so you have to raise the rates higher on the healthier people in order to make up for the cost for the sicker people, right? Put everyone in the same risk pool. Everyone's in the same risk pool. That lowers the cost massively for the entire country.  We're already paying twice as much as it would cost. Like we're already paying for it, we're just not getting it. Yeah, and I feel like if you explain this to someone who doesn't know about all of this, there's like this light bulb moment that goes off because I've convinced many people just in my personal life to support Medicare for all. My mom has done that and she's not necessarily someone who follows politics as closely as I do, but it's just such a common sense position and we shouldn't even have to really further make our case because I feel like we've already won the argument and most Americans agree with us. But just to like further educate people about this, I think it really is important and people have to understand that we're missing out like in comparison with other developed countries. We are getting a really raw deal and that's so unfair. It should make everyone angry. Every single time they pay their insurance bill to a private insurance company, they should be mad. I am and I think that we've gotten people to wake up. It's just a matter of really driving public opinion even further towards where we are. So I feel like you're a great candidate at doing something like this, like explaining to people why the Republican Party, they don't even have a plan. I mean, Democrats, they don't support Medicare for all for the most part. I think that's starting to change in the house, but not necessarily with senators. But in your district, you are running against a Republican. His name is Ken Calvert. So I want to know about it because I'm sure that you are convincing people who you talk to constituents as much as you can during a pandemic. But how close is this district to flipping and what's been the success rate of converting people who have been supporting this individual because I've never heard of him. And you've described him as a ghost. And I find that interesting. He just seems like a seat warmer in Congress. He's not doing anything. So can you talk about him? Yeah, honestly, it's infuriating how difficult it is to get national attention on this district. And one of the things that I've worked hardest to do during this run is to raise the national profile of the district because this is difficult. And it really complicates the fundraising. And a lot of districts that are similarly purple demographically, you can easily raise a million dollars for an opponent to go against and take out one of these Republicans. Here, everyone just assumes it's going to stay safely Republican. It has a Republican voting history for Calvert, at least, but also relatively low turnout. And it's absolutely purple demographically. The key issue is getting somebody who can appeal to those voters to bring in the people who don't normally vote and then to pick up those swing voters. The fact that a lot of people voted for Trump because he was running as a populist helps in this area. I mean, the answer to a right populist is a left populist. I'm talking about kitchen table economics, working class issues. And that picks up a lot of support. Calvert, on the other hand, doesn't really run on his record, doesn't offer solutions to anything. He's like a no man. And actually, he's taken our campaign a lot more seriously than really any challenger he's had in ages. He ran. He did mailers attacking me in the primary, mailers attacking me in the general here with some of the most hyperbolic claims. But in the primary, it was funny. It was like columns of yes and no and red and green. And no one told him red, like green light because he put me in the yes and him in the no for red. But it was like, yeah, Medicare for all, green, new deal, impeachment of Trump. Oh, Lema. And but he offers no solutions of his own. It's always just no, no, no. The only thing he's running on right now is the police. He's running on manipulating fear that somehow votes for Democrats or a vote for anarchy and chaos. And he's calling me like, he's literally calling me a terrorist that I want to burn Riverside to the ground and just the most crazy hyperbolic stuff. But he doesn't actually do anything. In 28 years in the House, he has never chaired a committee. He's often chaired subcommittees and appropriations. And largely because his single biggest donors are all in the military industrial complex. His biggest donors Lockheed Martin. He takes in just scads of cash from defense contractors. So of course he's voted for every single use of force. And for a whole range of deeply authoritarian stuff like warrantless wiretapping of American citizens.  But he doesn't actually do anything to help the economy out here. In fact, quite the opposite. His background before he got into Congress was real estate. And he has continued to make millions in Congress by knowing something was going to be done by the government, buying a chunk of land, and then flipping it while doing nothing to it, which is just crazy.  But he makes all kinds of cash off of real estate. So of course he's very cozy with housing developments out here.  Commuters that come out of LA and Orange County because we're right across the mountains from LA and Orange County. So the land is a bit cheaper out here. People move out here and then commute, right? So the traffic goes to the roof. We have the worst air quality in the state because of the amount of traffic that pours in there with more than a third of the population have been commuted out for work. And his big solution is to every now and then secure a little bit of cash as a rider for a new off-ramp. Look, I'm helping with traffic. I built a new off-ramp. Meanwhile, he's benefiting from all the housing developments that come in. It's just inertia that keeps him in. It's just the amount of money he can take in. He's 98% funded by corporations. That's insane. And really, to sit there and not do anything, to just effectively occupy that seat and still get elected to be in Congress for 28 years, I mean, this is why Congress has such a high disapproval rate. It's because of people like him. I mean, I'm sure he's not the only ghost. There's a lot of people like that who are just basically warming that seat. But it's time for people to wake up and stop just voting out of complacency. I mean, voting in and of itself is important because we have such a low turnout in this country. But if you're voting, make that count. And that's what I think is really important about all of these types of grassroots funded campaigns like yours, because you all really focus on getting out new voters who haven't voted. You mobilize people who stay home because they've never been talked to.  Because nobody reaches out to me. The incumbent doesn't reach out to me. They don't hold town halls. I don't know what I need. I mean, a lot of the issues that we saw was with the CARES Act. A lot of small businesses didn't know how to get access to the loans that were passed with that law. And lawmakers theoretically should be helping them with that to boast about what they just did, delivered to their constituents, and you see nothing. So it's a combination of corruption, but also laziness. Mostly corruption, I think, but laziness as well. And people like Calvert, they're part of the problem. And it's nice to see him actually a little bit afraid. But to call you a terrorist, I mean, if we thought that Trump was being hyperbolic in calling Joe Biden basically a conservative, a socialist, to call you a terrorist is like, that's so beyond the pale that I don't know how they make these types of arguments with a straight face. And I don't know who this appeals to. The people in this district, there's no way that that's resonating with them. Have you seen anything with regard to that? Yeah, I mean, it's not a majority for sure. But there is a pretty nativist and relatively extreme subset of the population that he's appealing to with some pretty bold dog whistles. Yeah. I mean, the one where he called me, well, he's done it more than once, but the one where he called me a terrorist, he actually tied me to a local professor here. He works at UC Riverside, Riza Aslan, who's a well-known scholar of religion. And literally, like me, a scholar who studies these ideas. But because he has a Muslim name, we're both violent extremists who want to destroy the country. And you should be terrified that I know people like this. Are you kidding me? But there are people who are genuinely afraid of that. We had the Black Lives Matter stuff was really starting to show up, and there was a number of rallies in the area. One of them, and this is relatively small, but there was a small rally in the northern part of the district in Norco. And people were just out marching with peaceful signs.  That's a part of his base. It's not all of it.  And he throws them red meat every now and then in order to keep them excited and willing to vote in the same way that Trump does. Trump depends upon the votes of white supremacists, which is why he's so loved to call them out. Because even though it's clearly not majority of the country, they are voting for him. So it is a fact. Yeah.  Because over the past half decade, they've been trying to demonize college students for being SJWs and all these liberal professors. And there's PragerU to try to de-convert all of these people who are going to college and getting radicalized, apparently. So I mean, it's like they create this narrative, but it's not founded in reality. And it sucks that it still works on some people. Not everyone, as you said. But the fact that it has any legs whatsoever, at least legs to convince people, that is a little bit soul-crushing, I'm not going to lie. But the fact that we are starting to make a little bit of progress in terms of getting people to think in a more common sense way, that is a good sign. Although I feel like progress isn't happening fast enough. The internet is the greatest democratization of information ever. It puts so much at our fingertips to correct our ideas.  And people have just passed around the craziest stuff. So it's basically given a lot of really terrible conspiracies new life. So yeah, I'm apparently part of this Jewish Bolshevik conspiracy to destroy America or whatever they've got. It's crazy stuff. It is. Yeah, I'm glad you brought up that point about the internet because I've made this point before too, that we as human beings, for the first time ever, have access to seemingly an infinite amount of information at our fingertips with our phones. But what do we do?  It's frustrating. But in terms of what you would do if you get elected to Congress, I have a question that's super broad, but I always like to ask this of people running for Congress because there's no real playbook that's been written. First of all, how have you been able to adapt campaigning from a pre-COVID world into a mid-COVID world? And second of all, what do you think it would take to actually stop the spread of COVID-19? Because a lot of people, I think, rightfully expect us to deal with this for at least another year, if not multiple years. So how do you adapt right now as someone who's campaigning? And then when you actually get to Congress, what do we actually do that would stop COVID-19, put this behind us? Because it took, I believe, three years for the world to get over the Spanish flu give or take. So are we looking at that type of a situation? I know this is super difficult for you to gauge, but I'm just curious, as a lawmaker, what you think you can do to accelerate the mitigation of the spread of this virus. Honestly, that is by far the easier part of the question. This is not rocket science. This is not difficult. Countries all around the world have dealt with this. I mean, Taiwan had what?  South Korea, a little over 300. I mean, even places that spiked massively like Italy shot way up and then plateaued and fell. And we continue to get worse and worse without really ever reigning this in. And a good part of the reason is that we did not act quickly enough from the beginning and decisions taken by the federal government forced the states to respond, often with blunt measures like full shutdowns. We could have dealt with this without ever having to shut down at all. But instead of acting for several months, the Trump administration was focused on denying that there was a problem.  If we had done that from the beginning, this would not have spread the way it was, did. Masks, contact tracing, proper social distancing measures, that would have been all we needed to do. Instead, they let it spread wildly around the country, continue to deny it. Huge numbers of people still refuse to practice social distancing or mask wearing, including the president and his administration, which we've just seen as had some delayed consequences, but it finally did hit close to home for them. But it's just, it's been deeply destructive to the country as a whole. I mean, we have almost a quarter of the world's deaths in the U.S. with what, 4% of the population? It's just insane. This was mismanaged, and it was mismanaged at the federal level, and people are instead deflecting and blaming the state so they want to attack the New York's government and California's government for, again, these blunt measures that were only forced on them by incompetence. And it's not just the Trump administration. I blame Congress for this overwhelmingly. If Congress had gotten its together and passed some kind of like, okay, I think of the way that a lot of these other countries did it. We gave more unemployment insurance and a one-time stimulus check. Well, that assumes a lot of people lose their jobs. If you lose your job, it's hard to get another one. Tons of jobs will be automated away or replaced afterwards. It creates all kinds of trickle-down costs for the businesses, for individuals. Most countries hit hard by this, used wage subsidies. They simply paid for people to stay home or to work fewer hours. The government stepped up and provided that cash so the businesses weren't hurt.  We let millions of people lose their jobs. Both of those were completely preventable. And our incumbent is a good part of that. He likes to claim that he did something about it. He actually voted against the oversight and the spending that would have helped a bunch of small businesses.  Okay, so this gets me really angry because 200,000 deaths and the worst economic situation since the Great Depression was completely preventable. Our campaign adapted pretty quickly. I have to say I'm grateful to have such a young and nimble campaign staff that we saw the situation. We shifted over to a digital infrastructure immediately and stopped doing in-person events. We started doing weekly town halls through Zoom and then live streaming them to every possible platform so that hundreds of people could watch them on whatever they had. We started a whole lot more aggressive phone banking and text banking. Everyone in the district has heard from us and one way or the other by now, people we don't have phone numbers for they get postcards or whatever. But we're calling, text banking, emailing, tons of advertising and social media, reaching out on radio, everything that we possibly can to get our message out to people even because we can't be out there knock indoors anymore or holding rallies. So you don't get to see that but they can't escape, we're here at least. If we'd had even a fraction of the cash that the incumbent sucks in from the military industrial complex, this would have been no contest. This district is absolutely flippable but it's hard to raise the money to compete with his television ads and whatnot. Yeah, I mean, people, oftentimes, they vote based on name recognition and who they know which is why in these types of house races and even state house races, the person who wins oftentimes is the individual with the most cash. Although a sign of hope for me at least is the fact that we are seeing a lot more success with these types of grassroots campaigns, especially in this election cycle with Kassim Rashid, Jamal Bowman. And that is really encouraging because before it seemed as if like these behemoths in Congress, like there was no way you could defeat them but now we're actually seeing, they're not invincible, it just is a matter of doing the right things, campaigning in the right way, reaching out to enough people to flip it. So here's the thing, before we get to your pitch to viewers as to why they should definitely donate and help volunteer, I wanna ask you a really big picture question that I've been thinking a lot about lately and I don't necessarily believe that there's a right or wrong answer to it specifically but like we really are at a strange time, a dark time in American politics where we're seeing polarization that hasn't been this bad since the Civil War. We're seeing climate catastrophe, money in politics is a huge issue.  You know, we've shifted the Overton window a little bit back to the left with AOC and Bernie Sanders but there's still a lot that needs to be done and I feel like as a new member of Congress you're going to have your work cut out for you. So I wanna ask you just in general, what is something that you think would actually solve all these problems? Like is it a one size fits all solution? Is it just like getting rid of capitalism or is it like a series of reforms like the New Deal? Like in your opinion, what do you think would put us back on track? Because I don't know what the, like the single answer to this is. Like I'm inclined to say, you know, if we reigned in capitalism, preferably abolished it in my opinion, that would help but not necessarily immediately. There's just, there's a lot. So I just kind of wanna pick your brain about this because I feel like you have probably thought about this as well. Yeah. And actually it's a relatively complex answer because it's a complex problem. So I'm only gonna like scratch the surface here. Right, right. But the key thing is, okay, so you mentioned the question of like capitalism at all and abolish capitalism honestly just isn't a thing that we can really realistically do but it can in the sense that we evolve toward these systems and we evolve away from them. People forget that it took centuries for the current capitalist system to evolve. Yeah. A little bit at a time incrementally. It built up into its current shape. Someone didn't just come up and say, I have invented capitalism. The world economy changed. It's a very long-term process and we are moving away from it a little bit at a time. And I think one of the things that might help is maybe a bit of a paradigm shift. If we start thinking a little bit differently here because a lot of the terminology that we use, especially when people throw around terms like capitalism and socialism and of course, Calvert is calling me a radical socialist, whatever. I don't use these terms really either of them to think about the way I wanna look at the economy because it's basically getting stuck in a 19th century argument that doesn't really fit where we're going. We are on the cusp, we're actively engaged in another industrial revolution right now. And it is going to be a much more dramatic one even than the last ones. And the industrial revolutions are what gave us the fight between capitalism and socialism. I mean, the massive abuses in the first industrialization period led directly to the creation of so many radical alternatives. But we're approaching a point where technologically, at least, we could have a post-scarcity society between automation and artificial intelligence and the biotech revolution and everything that's kind of coming along the way in this century. We really should be working 20 hour weeks at best already. And what frustrates me is that right-wing economists for two centuries kept saying that automation would keep decreasing the number of hours we worked and improve our lives and hasn't. I mean, John Stuart Mill in the early 19th century, John Maynard Keynes in the middle of the 20th century, everyone was like, yeah, yeah, we're gonna be, the biggest problem is gonna be the rise of a leisure economy of people just sitting around doing nothing. And instead we're working 50, 60 hour weeks, just to get by with tons of pointless BS jobs. And that's deliberate. We have to break that paradigm and get thinking about where we could go instead. Ultimately, a Star Trek future is possible, but we have to change the way that we're thinking about this and stop playing out the old battles and falling into these old rhetorical traps. Yeah, I like that. That'd be one thing that I'd like to point to, in terms of like one thing that I could really do. So new member of Congress, what would I do? I'm gonna shake people up. I'm gonna be the exact opposite of our current ghost representative. I'm gonna be on the floor of the house making speeches and trying to show up on C-SPAN. I'm gonna be doing interviews in the media. I'm gonna be pushing the conversation and getting us talking about the fundamental issues and what we need to do to address this stuff so that we can head into a future that's better for Americans instead of one where every generation does worse. I don't wanna see us falling steadily into ban a republic. I mean, we're literally, I mean, and this is one of the reasons that like, especially on the left, like accelerationism bothers me. If we tune out from the system, if we don't get involved, if we're not voting and pushing back against these terrible candidates and getting better people in there, we will become an outright fascist dictatorship. The right in this country has already been thoroughly captured by the ideology of neo-fascism. It is what they're talking about. They're not conservatives anymore. They use the term conservatism, conservative, but they're not. Almost no one in the Republican caucus in Congress is a conservative anymore. The ones who were have been retiring steadily over the last 15 years. This fundamentally changed. And because of that, if we are not paying attention, if we are not focused on the future, if we are not putting good people in, this will become a dictatorship. Yeah, yeah. And I always say that, not every single democracy lives forever. We may have always known democracy in the United States, but that doesn't necessarily mean that it's going to always exist. And I really like that you said, a paradigm shift is what's needed because I feel like we are on the cusp of a paradigm shift. Like the fact that we're talking about these types of left-wing ideas, even Medicare for all on national television in and of itself, I think is a signal that times are starting to change, maybe just a little bit. And so, it's not just a matter of, we passed the bill through Congress saying, capitalism is abolished. Like it doesn't work that way. But I think that the way that you described it as, almost like a pendulum where we swing back in the opposite direction. Because we've really moved away from the thinking that got us the new deal. And back then, I'm sure that Americans felt the same way we feel right now before the damn burst and the floodgates opened up and we got the new deal. I do feel like we are kind of on the verge of a paradigm shift. And I think that you sang that actually gives me hope in the fact that you'd be in Congress fighting for that, fighting for a better world. I mean, I'm sold, I'm sold. Anyone who's watching, I know it's sold. So what can we do to get you elected to Congress? The election is coming up super fast. It's honestly scary. So what can we do with less than a month away to make sure you beat him? I would say we have to overall, both right now and in general, be supporting campaigns like this when all across the country. You mentioned the new deal. I mean, Democrats, populists, leftists used to be extremely popular all across this country. We used to dominate farm country. We walked away from it because we don't talk about those issues anymore. It's not like they were any less socially conservative back then than they are now. Same people, but our issue is resonated if we talk about them. I'm gonna talk about issues that do matter to people. If we can amplify those messages, we could win all across this country. What could work in this district can work in Kansas and Nebraska. So yeah, I would encourage anybody, this late in the game, there's not a whole lot left to do in terms of volunteering. I mean, tons of people have been making calls and texts forever here. So anything that you can do to support us because every dollar that goes in goes into our advertising budget. It's more time that we can be on radio. It's more time that we can hit people with social media ads and get that name recognition out there. And just one thing, I mean, it affects my race, but literally all of them, we have to get past this learned helplessness where you face someone who's got, oh yeah, he can write a $100,000 check, I can't. So there's nothing I can do, right? If you've got five bucks, you can help. The price of a coffee a month given to progressive campaigns across this country, especially running in these swing districts, this is how we change the country. You put 200 squad members in there and anything is possible. We can reorient this entire country and this economy and catch up to the rest of the rich world. It just drives me nuts that we're in steady decline here. So yeah, my website is liamomera.org, the most generically Irish name ever, L-I-A-M-O-M-A-R-A.org. And then I'm super active on social media and whatnot. So it's pretty easy to find like donation links, more information on the issues. If you wanna reach out and contact us, you can absolutely do that. All right, well yeah, I'm fired up. I love that you use the word learned helplessness because that is something that I feel like I'm even guilty of at some times where there's a big race that comes up and we lose it, we being the left, and then I feel so deflated. And then you just kind of feel like, oh, well, the next one's gonna be bad. And then we end up getting a victory surprisingly. Like, I love that. Like you are kind of like calling for a shift in the mindset of people on the left. And I think that's super important. Like I agree we should never ever accept accelerationism because as much as people are demoralized and they want to see like a revolution, we're a lot closer towards a fascist dictatorship. Than a socialist revolution. So we need to keep pushing for a better world.  So I'm rooting for you. You've got me sold. We'll be watching closely. Hope to have you back on when you were a member of Congress. That'd be awesome. Thank you. Thank you very much.