Chapter 6 Multiple Regression
In Chapter 5 we introduced ideas related to modeling for explanation, in particular that the goal of modeling is to make explicit the relationship between some outcome variable \(y\) and some explanatory variable \(x\). While there are many approaches to modeling, we focused on one particular technique: linear regression, one of the most commonly used and easy-to-understand approaches to modeling. Furthermore to keep things simple, we only considered models with one explanatory \(x\) variable that was either numerical in Section 5.1 or categorical in Section 5.2.
In this chapter on multiple regression, we’ll start considering models that include more than one explanatory variable \(x\). You can imagine when trying to model a particular outcome variable, like proportion of the lion nose that is black as in Section 5.1 or life expectancy as in Section 5.2, that it would be useful to include more than just one explanatory variable’s worth of information.
Since our regression models will now consider more than one explanatory variable, the interpretation of the associated effect of any one explanatory variable must be made in conjunction with the other explanatory variables included in your model. Let’s begin!
Needed packages
Let’s load all the packages needed for this chapter (this assumes you’ve already installed them). Recall from our discussion in Section 4.4 that loading the tidyverse
package by running library(tidyverse)
loads the following commonly used data science packages all at once:
ggplot2
for data visualizationdplyr
for data wranglingtidyr
for converting data to “tidy” formatreadr
for importing spreadsheet data into R- As well as the more advanced
purrr
,tibble
,stringr
, andforcats
packages
If needed, read Section 1.3 for information on how to install and load R packages.
library(tidyverse)
library(moderndive)
library(skimr)
library(abd)
6.1 One numerical and one categorical explanatory variable
Previously we looked at the relationship between age and nose coloration (proportion black) of male lions in Section 5.1. The variable proportion.black
was the numerical outcome variable \(y\), and the variable age
was the numerical explanatory \(x\) variable.
In this section, we are going to consider a different model. Rather than a single explanatory variable, we’ll now include two different explanatory variables. In this example, we’ll look at the relationship between tooth growth and vitamin C intake in guinea pigs. Could it be that increasing levels of vitamin C stimulate tooth growth? Or could it instead be that increasing levels reduce tooth growth? Are there differences in tooth growth depending on the method used to deliver vitamin C?
We’ll answer these questions by modeling the relationship between these variables using multiple regression, where we have:
- A numerical outcome variable \(y\),
len
, the length of odontoblasts, the cells responsible for tooth growth, and - Two explanatory variables:
- A numerical explanatory variable \(x_1\),
dose
, the dose of vitamin C, in milligrams/day. - A categorical explanatory variable \(x_2\),
supp
, the delivery method, either as orange juice (OJ
) or ascorbic acid (VC
).
- A numerical explanatory variable \(x_1\),
6.1.1 Exploratory data analysis
Our dataset is called ToothGrowth
and included in R’s datasets package. Recall the three common steps in an exploratory data analysis we saw in Subsection 5.1.1:
- Looking at the raw data values.
- Computing summary statistics.
- Creating data visualizations.
Let’s first look at the raw data values by either looking at ToothGrowth
using RStudio’s spreadsheet viewer or by using the glimpse()
function from the dplyr
package:
glimpse(ToothGrowth)
Rows: 60
Columns: 3
$ len <dbl> 4.2, 11.5, 7.3, 5.8, 6.4, 10.0, 11.2, 11.2, 5.2, 7.0, 16.5, 16.5,…
$ supp <fct> VC, VC, VC, VC, VC, VC, VC, VC, VC, VC, VC, VC, VC, VC, VC, VC, V…
$ dose <dbl> 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 1.0, …
Let’s also display a random sample of 5 rows of the 60 rows corresponding to different courses in Table 6.1. Remember due to the random nature of the sampling, you will likely end up with a different subset of 5 rows.
%>% sample_n(size = 5) ToothGrowth
| len | supp | dose |
|---|---|---|
| 8.2 | OJ | 0.5 |
| 4.2 | VC | 0.5 |
| 20.0 | OJ | 1.0 |
| 21.5 | VC | 2.0 |
| 27.3 | OJ | 1.0 |
Now that we’ve looked at the raw values in our ToothGrowth
data frame and got a sense of the data, let’s compute summary statistics. As we did in our exploratory data analyses in Sections 5.1.1 and 5.2.1 from the previous chapter, let’s use the skim()
function from the skimr
package:
%>% skim() ToothGrowth
Observe that we have no missing data, that there are 30 guinea pigs given orange juice and 30 guinea pigs given ascorbic acid, and that the average vitamin C dose is 1.17.
Furthermore, let’s compute the correlation coefficient between our two numerical variables: len
and dose
. Recall from Subsection 5.1.1 that correlation coefficients only exist between numerical variables. We observe that they are “clearly positively” correlated.
%>%
ToothGrowth get_correlation(formula = len ~ dose)
cor
1 0.803
Let’s now perform the last of the three common steps in an exploratory data analysis: creating data visualizations. Given that the outcome variable len
and explanatory variable dose
are both numerical, we’ll use a scatterplot to display their relationship. How can we incorporate the categorical variable supp
, however? By mapping
the variable supp
to the color
aesthetic, thereby creating a colored scatterplot. The following code is similar to the code that created the scatterplot of proportion black nose over lion age in Figure 5.2, but with color = supp
added to the aes()
thetic mapping.
ggplot(ToothGrowth, aes(x = dose, y = len, color = supp)) +
geom_point() +
labs(x = "Dose", y = "Tooth length", color = "Supplement") +
geom_smooth(method = "lm", se = FALSE)
In the resulting Figure 6.1, observe that ggplot()
assigns a default in red/blue color scheme to the points and to the lines associated with the two levels of supp
: OJ
and VC
. Furthermore, the geom_smooth(method = "lm", se = FALSE)
layer automatically fits a different regression line for each group.
We notice an interesting trend. While both regression lines are positively sloped with dose levels (i.e., guinea pigs receiving higher doses of vitamin C tend to have longer teeth), the slope for dose for the VC guinea pigs is more positive.
6.1.2 Interaction model
Let’s now quantify the relationship of our outcome variable \(y\) and the two explanatory variables using one type of multiple regression model known as an interaction model. We’ll explain where the term “interaction” comes from at the end of this section.
In particular, we’ll write out the equation of the two regression lines in Figure 6.1 using the values from a regression table. Before we do this, however, let’s go over a brief refresher of regression when you have a categorical explanatory variable \(x\).
Recall in Subsection 5.2.2 we fit a regression model for countries’ life expectancies as a function of which continent the country was in. In other words, we had a numerical outcome variable \(y\) = lifeExp
and a categorical explanatory variable \(x\) = continent
which had 5 levels: Africa
, Americas
, Asia
, Europe
, and Oceania
. Let’s re-display the regression table you saw in Table 5.8:
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 54.8 | 1.02 | 53.45 | 0 | 52.8 | 56.8 |
| continentAmericas | 18.8 | 1.80 | 10.45 | 0 | 15.2 | 22.4 |
| continentAsia | 15.9 | 1.65 | 9.68 | 0 | 12.7 | 19.2 |
| continentEurope | 22.8 | 1.70 | 13.47 | 0 | 19.5 | 26.2 |
| continentOceania | 25.9 | 5.33 | 4.86 | 0 | 15.4 | 36.5 |
Recall our interpretation of the estimate
column. Since Africa
was the “baseline for comparison” group, the intercept
term corresponds to the mean life expectancy for all countries in Africa of 54.8 years. The other four values of estimate
correspond to “offsets” relative to the baseline group. So, for example, the “offset” corresponding to the Americas is +18.8 as compared to the baseline for comparison group Africa. In other words, the average life expectancy for countries in the Americas is 18.8 years higher. Thus the mean life expectancy for all countries in the Americas is 54.8 + 18.8 = 73.6. The same interpretation holds for Asia, Europe, and Oceania.
Going back to our multiple regression model for tooth len
gth using dose
and supp
lement in Figure 6.1, we generate the regression table using the same two-step approach from Chapter 5: we first “fit” the model using the lm()
“linear model” function and then we apply the get_regression_table()
function. This time, however, our model formula won’t be of the form y ~ x
, but rather of the form y ~ x1 * x2
. In other words, our two explanatory variables x1
and x2
are separated by a *
sign:
# Fit regression model:
<- lm(len ~ dose * supp, data = ToothGrowth)
len_model_interaction
# Get regression table:
get_regression_table(len_model_interaction)
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 11.55 | 1.58 | 7.30 | 0.000 | 8.382 | 14.72 |
| dose | 7.81 | 1.20 | 6.53 | 0.000 | 5.417 | 10.21 |
| suppVC | -8.26 | 2.24 | -3.69 | 0.001 | -12.735 | -3.77 |
| dose:suppVC | 3.90 | 1.69 | 2.31 | 0.025 | 0.518 | 7.29 |
Looking at the regression table output in Table 6.3, there are four rows of values in the estimate
column. While it is not immediately apparent, using these four values we can write out the equations of both lines in Figure 6.1. First, since the word OJ
comes alphabetically before VC
, the orange juice supplement is the “baseline for comparison” group. Thus, intercept
is the intercept for only the orange juice recipients.
This holds similarly for dose
. It is the slope for dose for only the OJ recipients. Thus, the red regression line in Figure 6.1 has an intercept of 11.55 and slope for dose of 7.811.
What about the intercept and slope for dose of the ascorbic acid recipients in the blue line in Figure 6.1? This is where our notion of “offsets” comes into play once again.
The value for suppVC
of -8.255 is not the intercept for the ascorbic acid recipients, but rather the offset in intercept for these guinea pigs relative to orange juice recipients. The intercept for the ascorbic acid recipients is intercept + suppVC
= 11.55 + (-8.255) = 11.55 - 8.255 = 3.295.
Similarly, dose:suppVC
= 3.904 is not the slope for dose for the ascorbic acid recipients, but rather the offset in slope for those guinea pigs. Therefore, the slope for dose for the ascorbic acid recipients is dose + dose:suppVC
\(= 7.811 + 3.904 = 11.715\). Thus, the blue regression line in Figure 6.1 has intercept 3.295 and slope for dose
of 11.715. Let’s summarize these values in Table 6.4 and focus on the two slopes for dose
:
| Supplement | Intercept | Slope for dose |
|---|---|---|
| Orange juice | 11.550 | 7.811 |
| Ascorbic acid | 3.295 | 11.715 |
Since the slope for dose for the orange recipients was 7.811, it means that on average, a guinea pig who receives one unit more would have a tooth length that is 7.811 units higher. For the ascorbic acid recipients, however, the corresponding associated increase was on average 11.715 units. While both slopes for dose were positive, the slope for dose for the VC
recipients is more positive. This is consistent with our observation from Figure 6.1, that this model is suggesting that dose impacts tooth length for ascorbic acid (VC) recipients more than for orange juice recipients.
Let’s now write the equation for our regression lines, which we can use to compute our fitted values \(\widehat{y} = \widehat{\text{len}}\).
\[ \begin{aligned} \widehat{y} = \widehat{\text{len}} &= b_0 + b_{\text{dose}} \cdot \text{dose} + b_{\text{VC}} \cdot \mathbb{1}_{\text{is VC}}(x) + b_{\text{dose,VC}} \cdot \text{dose} \cdot \mathbb{1}_{\text{is VC}}(x)\\ &= 11.55 7.811 \cdot \text{dose} - 8.255 \cdot \mathbb{1}_{\text{is VC}}(x) + 3.904 \cdot \text{dose} \cdot \mathbb{1}_{\text{is VC}}(x) \end{aligned} \]
Whoa! That’s even more daunting than the equation you saw for the life expectancy as a function of continent in Subsection 5.2.2! However, if you recall what an “indicator function” does, the equation simplifies greatly. In the previous equation, we have one indicator function of interest:
\[ \mathbb{1}_{\text{is VC}}(x) = \left\{ \begin{array}{ll} 1 & \text{if } \text{supp } x \text{ is VC} \\ 0 & \text{otherwise}\end{array} \right. \]
Second, let’s match coefficients in the previous equation with values in the estimate
column in our regression table in Table 6.3:
- \(b_0\) is the
intercept
= 11.55 for the orange juice recipients - \(b_{\text{dose}}\) is the slope for
dose
= 7.811 for the orange juice recipients - \(b_{\text{VC}}\) is the offset in intercept = -8.255 for the ascorbic acid (VC) recipients
- \(b_{\text{dose,VC}}\) is the offset in slope for dose = 3.904 for the ascorbic acid (VC) recipients
Let’s put this all together and compute the fitted value \(\widehat{y} = \widehat{\text{len}}\) for orange juice recipients. Since for orange juice recipients \(\mathbb{1}_{\text{is VC}}(x)\) = 0, the previous equation becomes
\[ \begin{aligned} \widehat{y} = \widehat{\text{len}} &= 11.55 - -7.811 \cdot \text{dose} - 8.255 \cdot 0 + 3.904 \cdot \text{dose} \cdot 0\\ &= 11.55 - -7.811 \cdot \text{dose} - 0 + 0\\ &= 11.55 - -7.811 \cdot \text{dose}\\ \end{aligned} \]
which is the equation of the red regression line in Figure 6.1 corresponding to the orange juice recipients in Table 6.4. Correspondingly, since for ascorbic acid (VC) recipients \(\mathbb{1}_{\text{is VC}}(x)\) = 1, the previous equation becomes
\[ \begin{aligned} \widehat{y} = \widehat{\text{len}} &= 11.55 - -7.811 \cdot \text{dose} - 8.255 + 3.904 \cdot \text{dose}\\ &= (11.55 - 8.255) + (- -7.811 + 3.904) * \text{dose}\\ &= 3.295 - -11.715 \cdot \text{dose}\\ \end{aligned} \]
which is the equation of the blue regression line in Figure 6.1 corresponding to the ascorbic acid (VC) recipients in Table 6.4.
Phew! That was a lot of arithmetic! Don’t fret, however, this is as hard as modeling will get in this book. If you’re still a little unsure about using indicator functions and using categorical explanatory variables in a regression model, we highly suggest you re-read Subsection 5.2.2. This involves only a single categorical explanatory variable and thus is much simpler.
Before we end this section, we explain why we refer to this type of model as an “interaction model.” The \(b_{\text{dose,VC}}\) term in the equation for the fitted value \(\widehat{y}\) = \(\widehat{\text{len}}\) is what’s known in statistical modeling as an “interaction effect.” The interaction term corresponds to the dose:suppVC
= 3.904 in the final row of the regression table in Table 6.3.
We say there is an interaction effect if the associated effect of one variable depends on the value of another variable. That is to say, the two variables are “interacting” with each other. Here, the associated effect of the variable dose
depends on the value of the other variable supp
. The difference in slopes for dose of +3.904 of ascorbic acid (VC) recipients relative to orange juice recipients shows this.
Another way of thinking about interaction effects on tooth length is as follows. For a given pig, there might be an associated effect of their dose by itself, there might be an associated effect of their supplement by itself, but when dose and supplement are considered together there might be an additional effect above and beyond the two individual effects.
6.1.3 Parallel slopes model
When creating regression models with one numerical and one categorical explanatory variable, we are not just limited to interaction models as we just saw. Another type of model we can use is known as a parallel slopes model. Unlike interaction models where the regression lines can have different intercepts and different slopes, parallel slopes models still allow for different intercepts but force all lines to have the same slope. The resulting regression lines are thus parallel. Let’s visualize the best-fitting parallel slopes model to ToothGrowth
.
Unfortunately, the geom_smooth()
function in the ggplot2
package does not have a convenient way to plot parallel slopes models. Evgeni Chasnovski thus created a special purpose function called geom_parallel_slopes()
that is included in the moderndive
package. You won’t find geom_parallel_slopes()
in the ggplot2
package, but rather the moderndive
package. Thus, if you want to be able to use it, you will need to load both the ggplot2
and moderndive
packages. Using this function, let’s now plot the parallel slopes model for teaching score. Notice how the code is identical to the code that produced the visualization of the interaction model in Figure 6.1, but now the geom_smooth(method = "lm", se = FALSE)
layer is replaced with geom_parallel_slopes(se = FALSE)
.
ggplot(ToothGrowth, aes(x = dose, y = len, color = supp)) +
geom_point() +
labs(x = "Dose", y = "Tooth length", color = "Supplement type") +
geom_parallel_slopes(se = FALSE)
Observe in Figure 6.2 that we now have parallel lines corresponding to the orange juice and ascorbic acid (VC) recipients, respectively: here they have the same positive slope. This is telling us that guinea pigs who receive higher doses of vitamin C will tend to have longer teeth than guinea pigs who receive less. Furthermore, since the lines are parallel, the associated gain for higher dose is assumed to be the same for both orange juice and ascorbic acid (VC) recipients.
However, observe also in Figure 6.2 that these two lines have different intercepts as evidenced by the fact that the blue line corresponding to the ascorbic acid (VC) recipients is higher than the red line corresponding to the orange juice recipients. This is telling us that irrespective of dose, orange juice recipients tended to receive lower teaching scores than ascorbic acid (VC) recipients.
In order to obtain the precise numerical values of the two intercepts and the single common slope, we once again “fit” the model using the lm()
“linear model” function and then apply the get_regression_table()
function. However, unlike the interaction model which had a model formula of the form y ~ x1 * x2
, our model formula is now of the form y ~ x1 + x2
. In other words, our two explanatory variables x1
and x2
are separated by a +
sign:
# Fit regression model:
<- lm(len ~ dose + supp, data = ToothGrowth)
len_model_parallel_slopes # Get regression table:
get_regression_table(len_model_parallel_slopes)
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 9.27 | 1.282 | 7.23 | 0.000 | 6.71 | 11.84 |
| dose | 9.76 | 0.877 | 11.13 | 0.000 | 8.01 | 11.52 |
| suppVC | -3.70 | 1.094 | -3.38 | 0.001 | -5.89 | -1.51 |
Similarly to the regression table for the interaction model from Table 6.3, we have an intercept
term corresponding to the intercept for the “baseline for comparison” orange juice instructor group and a suppVC
term corresponding to the offset in intercept for the ascorbic acid (VC) recipients relative to orange juice recipients. In other words, in Figure 6.2 the red regression line corresponding to the orange juice recipients has an intercept of 9.273 while the blue regression line corresponding to the ascorbic acid (VC) recipients has an intercept of 9.273 + -3.7 = 5.573.
Unlike in Table 6.3, however, we now only have a single slope for dose of 9.764. This is because the model dictates that both the orange juice and ascorbic acid (VC) recipients have a common slope for dose. This is telling us that a guinea pig who received a vitamin C dose one unit higher has tooth length that is on average 9.764 units longer. This benefit for receiving a higher vitamin C dose applies equally to both orange juice and ascorbic acid (VC) recipients.
Let’s summarize these values in Table 6.6, noting the different intercepts but common slopes:
| Supplement | Intercept | Slope for dose |
|---|---|---|
| Orange juice (OJ) | 9.273 | 9.764 |
| Ascorbic acid (VC) | 5.573 | 9.764 |
Let’s now write the equation for our regression lines, which we can use to compute our fitted values \(\widehat{y} = \widehat{\text{len}}\).
\[ \begin{aligned} \widehat{y} = \widehat{\text{len}} &= b_0 + b_{\text{dose}} \cdot \text{dose} + b_{\text{VC}} \cdot \mathbb{1}_{\text{is VC}}(x)\\ &= 9.273 9.764 \cdot \text{dose} + -3.7 \cdot \mathbb{1}_{\text{is VC}}(x) \end{aligned} \]
Let’s put this all together and compute the fitted value \(\widehat{y} = \widehat{\text{len}}\) for orange juice recipients. Since for orange juice recipients the indicator function \(\mathbb{1}_{\text{is VC}}(x)\) = 0, the previous equation becomes
\[ \begin{aligned} \widehat{y} = \widehat{\text{len}} &= 9.273 9.764 \cdot \text{dose} + -3.7 \cdot 0\\ &= 9.273 9.764 \cdot \text{dose} \end{aligned} \]
which is the equation of the red regression line in Figure 6.2 corresponding to the orange juice recipients. Correspondingly, since for ascorbic acid (VC) recipients the indicator function \(\mathbb{1}_{\text{is VC}}(x)\) = 1, the previous equation becomes
\[ \begin{aligned} \widehat{y} = \widehat{\text{len}} &= 9.273 9.764 \cdot \text{dose} + -3.7 \cdot 1\\ &= (9.273 + -3.7) - -9.764 \cdot \text{dose}\\ &= 5.573 9.764 \cdot \text{dose} \end{aligned} \]
which is the equation of the blue regression line in Figure 6.2 corresponding to the ascorbic acid (VC) recipients.
Great! We’ve considered both an interaction model and a parallel slopes model for our data. Let’s compare the visualizations for both models side-by-side in Figure 6.3.
At this point, you might be asking yourself: “Why would we ever use a parallel slopes model?” Looking at the left-hand plot in Figure 6.3, the two lines definitely do not appear to be parallel, so why would we force them to be parallel? For this data, we agree! It can easily be argued that the interaction model on the left is more appropriate. However, in the upcoming Subsection 6.3.1 on model selection, we’ll present an example where it can be argued that the case for a parallel slopes model might be stronger.
6.1.4 Observed/fitted values and residuals
For brevity’s sake, in this section we’ll only compute the observed values, fitted values, and residuals for the interaction model which we saved in len_model_interaction
. You’ll have an opportunity to study the corresponding values for the parallel slopes model in the upcoming Learning check.
 What fitted value \(\widehat{y}\) = \(\widehat{\text{len}}\) would our model yield? Say, you have another guinea pig who receives ascorbic acid of 1 mg/day. What would their fitted value \(\widehat{y}\) be?
We answer this question visually first for the orange juice recipient by finding the intersection of the red regression line and the vertical line at \(x\) = dose = 2. We mark this value with a large red dot in Figure 6.4. Similarly, we can identify the fitted value \(\widehat{y}\) = \(\widehat{\text{len}}\) for the male instructor by finding the intersection of the blue regression line and the vertical line at \(x\) = dose = 1. We mark this value with a large blue dot in Figure 6.4.
What are these two values of \(\widehat{y}\) = \(\widehat{\text{len}}\) precisely? We can use the equations of the two regression lines we computed in Subsection 6.1.2, which in turn were based on values from the regression table in Table 6.3:
- For all orange juice recipients: \(\widehat{y} = \widehat{\text{len}} = 11.55 - -7.811 \cdot \text{dose}\)
- For all ascorbic acid (VC) recipients: \(\widehat{y} = \widehat{\text{len}} = 3.295 - -11.715 \cdot \text{dose}\)
So our fitted values would be: \(11.55 - -7.811 \cdot 2 = 27.17\) and \(3.295 - -11.715 \cdot 1 = 15.01\), respectively.
Now what if we want the fitted values not just for these two guinea pigs, but for all 60 guinea pigs included in the ToothGrowth
data frame? Doing this by hand would be long and tedious! This is where the get_regression_points()
function from the moderndive
package can help: it will quickly automate the above calculations for all 60 guinea pigs We present a preview of the first 5 rows for each supplement type out of 60 in Table 6.7.
<- get_regression_points(len_model_interaction)
regression_points %>% group_by(supp) %>% slice_head(n=5) regression_points
| ID | len | dose | supp | len_hat | residual |
|---|---|---|---|---|---|
| 31 | 15.2 | 0.5 | OJ | 15.46 | -0.256 |
| 32 | 21.5 | 0.5 | OJ | 15.46 | 6.044 |
| 33 | 17.6 | 0.5 | OJ | 15.46 | 2.144 |
| 34 | 9.7 | 0.5 | OJ | 15.46 | -5.756 |
| 35 | 14.5 | 0.5 | OJ | 15.46 | -0.956 |
| 1 | 4.2 | 0.5 | VC | 9.15 | -4.953 |
| 2 | 11.5 | 0.5 | VC | 9.15 | 2.347 |
| 3 | 7.3 | 0.5 | VC | 9.15 | -1.853 |
| 4 | 5.8 | 0.5 | VC | 9.15 | -3.353 |
| 5 | 6.4 | 0.5 | VC | 9.15 | -2.753 |
It turns out that the first five orange juice recipients received 0.5 mg/day of vitamin C. The resulting \(\widehat{y}\) = \(\widehat{\text{len}}\) fitted values are in the len_hat
column. Furthermore, the get_regression_points()
function also returns the residuals \(y-\widehat{y}\). Notice, for example, the second and third guinea pigs receiving orange juice had positive residuals, indicating that the actual tooth growth values were greater than their fitted length of 15.46. On the other hand, the first and fourth guinea pigs had negative residuals, indicating that the actual tooth growth values were less than 15.46.
Learning check
(LC6.1) Compute the observed values, fitted values, and residuals not for the interaction model as we just did, but rather for the parallel slopes model we saved in len_model_parallel_slopes
.
6.2 Two categorical explanatory variables
Let’s now switch gears and consider multiple regression models where instead of one numerical and one categorical explanatory variable, we now have two categorical explanatory variables. The dataset we’ll use is from [Analysis of Biological Data] by Whitlock and Schluter. Its accompanying abd
R package contains the IntertidalAlgae
dataset that we’ll use next.
This dataset is from a study looking at the effect of herbivores and height above low tide, and the interaction between these factors, on abundance of a red intertidal alga.
In this section, we’ll fit a regression model where we have
- A numerical outcome variable \(y\), sqrt.area, the square root of the area (in cm2) covered by red algae at the experiment’s end, and
- Two explanatory variables:
- One categorical explanatory variable \(x_1\), herbivores, absence or presence of herbivores
- Another categorical explanatory variable \(x_2\), height, the height of the experimental plot relative to the tide levels.
6.2.1 Exploratory data analysis
Let’s examine the Intertidal
dataset using RStudio’s spreadsheet viewer or glimpse()
.
library(abd)
glimpse(IntertidalAlgae)
Rows: 64
Columns: 3
$ height <fct> low, low, low, low, low, low, low, low, low, low, low, low,…
$ herbivores <fct> minus, minus, minus, minus, minus, minus, minus, minus, min…
$ sqrt.area <dbl> 9.406, 34.468, 46.673, 16.642, 24.377, 38.351, 33.777, 61.0…
Furthermore, let’s look at a random sample of five out of the 64 plots in Table 6.8. Once again, note that due to the random nature of the sampling, you will likely end up with a different subset of five rows.
%>% sample_n(size = 5) IntertidalAlgae
| height | herbivores | sqrt.area |
|---|---|---|
| low | minus | 46.17 |
| low | minus | 41.79 |
| mid | minus | 45.54 |
| low | plus | 27.64 |
| mid | minus | 3.15 |
Now that we’ve looked at the raw values in our IntertidalAlgae
data frame and got a sense of the data, let’s move on to the next common step in an exploratory data analysis: computing summary statistics. Let’s use the skim()
function from the skimr
package:
%>% skim() IntertidalAlgae
Observe the summary statistics for the outcome variable sqrt.area
: the mean and median sqrt.area are 22.84 and 22.25, respectively, and that 25% of plots had values of 5.92 or less.
Now let’s look at the explanatory variables herbivores
and height
. First, let’s visualize the relationship of the outcome variable with each of the two explanatory variables in separate box plots with an overlaid scatterplot to see the individual data points in Figure ??.
ggplot(IntertidalAlgae, aes(x = herbivores, y = sqrt.area)) +
geom_boxplot() +
geom_jitter(width = 0.1) +
labs(x = "Herbivore treatment", y = "Square root of area covered",
title = "Area coverage and herbivore treatment")
ggplot(IntertidalAlgae, aes(x = height, y = sqrt.area)) +
geom_boxplot() +
geom_jitter(width = 0.1) +
labs(x = "Height relative to low tide",
y = "Square root of area covered",
title = "Area coverage and tidal location")
It seems that the herbivore treatment, but not tidal location, has some effect on its own on red algae coverage. With respect to herbivore treatment, the median of \(y\) is almost double in the presence of herbivores (plus
) as compared to the absence (minus
). With respect to height above low tide, the median of \(y\) is nearly the same in the low tide group as in the mid tide group.
However, the two plots in Figure ?? only focus on the relationship of the outcome variable with each of the two explanatory variables separately. To visualize the joint relationship of all three variables simultaneously, let’s make just a scatterplot and indicate the other explanatory variable by color. Each of the 64 observations in the IntertidalAlgae
data frame are marked with a point where
- The numerical outcome variable \(y\)
sqrt.area
is on the vertical axis. - The first categorical explanatory variable \(x_1\)
herbivores
is on the horizontal axis. - The second categorical explanatory variable \(x_2\)
height
is indicated by color.
ggplot(IntertidalAlgae, aes(x = herbivores, y = sqrt.area,
color = height, group = height)) +
geom_jitter(width = 0.1) +
labs(x = "Herbivore treatment", y = "Square root of area covered",
title = "Area coverage and herbivore treatment") +
geom_smooth(method = "lm", se = FALSE)
# geom_parallel_slopes(se = FALSE)
Furthermore, we also include the regression lines for each height
level (low
or mid
). Recall from Subsection 5.3.2 that regression lines are “best-fitting” in that of all possible lines we can draw through a cloud of points, the regression line minimizes the sum of squared residuals. This concept also extends to models with two categorical explanatory variables.
Learning check
(LC6.2) Prepare a new plot with the same outcome variable \(y\) sqrt.area
but with the second explanatory variable \(x_2\) height
on the horizontal axis and the first explanatory variable \(x_1\) on the color layers. How does this plot compare with the previous one?
6.2.2 Regression lines
Let’s now fit a regression model and get the regression table corresponding to the regression line in Figure 6.6. As we have done throughout Chapter 5 and this chapter, we use our two-step process to obtain the regression table for this model in Table 6.9.
# Fit regression model:
<- lm(sqrt.area ~ herbivores * height, data = IntertidalAlgae)
area_model1 # Get regression table:
get_regression_table(area_model1)
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 32.9 | 3.86 | 8.54 | 0.000 | 25.2 | 40.627 |
| herbivoresplus | -22.5 | 5.45 | -4.13 | 0.000 | -33.4 | -11.604 |
| heightmid | -10.4 | 5.45 | -1.91 | 0.061 | -21.3 | 0.476 |
| herbivoresplus:heightmid | 25.6 | 7.71 | 3.32 | 0.002 | 10.2 | 41.003 |
- We first “fit” the linear regression model using the
lm(y ~ x1 * x2, data)
function and save it inarea_model1
. - We get the regression table by applying the
get_regression_table()
function from themoderndive
package toarea_model1
.
Let’s interpret the three values in the estimate
column. First, the intercept
value is 32.9, and this will be our base value in comparison to other groups. This intercept
represents the mean sqrt.area
for a plot who has herbivores
absent and height
of low tide, and this corresponds to where the red line (low
) intersects \(x\) = minus
.
Second, the herbivoresplus
value is -22.5. Taking into account all the other explanatory variables in our model, the addition of herbivores
has an associated decrease on average of 22.5 in sqrt.area. We preface our interpretation with the statement, “taking into account all the other explanatory variables in our model.” Here, by all other explanatory variables we mean height
and the interaction between height
and herbivores
. We do this to emphasize that we are now jointly interpreting the associated effect of multiple explanatory variables in the same model at the same time.
Third, heightmid
is -10.4 Taking into account all other explanatory variables in our model, plots with a height
of mid
tide, have an associated sqrt.area decrease of, on average, 10.4 cm. And finally, herbivoresplus:heightmid
is 25.6. Taking into account all other explanatory variables in our model, the addition of herbivores
and a height
of mid
tide, have an associated sqrt.area increase of, on average, 25.6 cm.
Putting these results together, the equation of the regression lines for the interaction model to give us fitted values \(\widehat{y}\) = \(\widehat{\text{sqrt.area}}\) is:
\[ \begin{aligned} \widehat{y} &= b_0 + b_1 \cdot x_1 + b_2 \cdot x_2\\ \widehat{\text{sqrt.area}} &= b_0 + b_{\text{herbivores}} \cdot \mathbb{1}_{\text{is plus}}(x) + b_{\text{height}} \cdot \mathbb{1}_{\text{is mid}}(x) \\ &\text{ } + b_{\text{herbivores,height}} \cdot \mathbb{1}_{\text{is plus}}(x) \cdot \mathbb{1}_{\text{is mid}}(x)\\ &= 32.9 - 22.5 \cdot\mathbb{1}_{\text{is plus}}(x) - 10.4 \cdot\mathbb{1}_{\text{is mid}}(x) \\ &\text{ } + 25.6 \cdot \mathbb{1}_{\text{is plus}}(x) \cdot \mathbb{1}_{\text{is mid}}(x) \end{aligned} \]
Yes, the equation is again quite daunting, but as we saw above, once you recall what an “indicator function” does, the equation simplifies greatly. In this equation, we now have two indicator functions of interest:
\[ \mathbb{1}_{\text{is plus}}(x) = \left\{ \begin{array}{ll} 1 & \text{if } \text{herbivores } x \text{ is plus} \\ 0 & \text{otherwise}\end{array} \right. \mathbb{1}_{\text{is mid}}(x) = \left\{ \begin{array}{ll} 1 & \text{if } \text{height } x \text{ is mid} \\ 0 & \text{otherwise}\end{array} \right. \]
Okay, let’s put this all together again and compute the fitted value \(\widehat{y} = \widehat{\text{sqrt.area}}\) for red algae minus herbivores and at low level. In this case \(\mathbb{1}_{\text{is plus}}(x)\) = 0 and \(\mathbb{1}_{\text{is mid}}(x)\) = 0, the previous equation becomes
\[
\begin{aligned}
\widehat{\text{sqrt.area}} &= 32.9 - 22.5 \cdot 0 - 10.4 \cdot0 + 25.6 \cdot 0 \cdot 0 \\
&= 32.9 + 0 + 0 + 0\\
&= 32.9
\end{aligned}
\]
which is the left end of the red regression line in Figure 6.1 corresponding to the intercept
in Table 6.4.
Correspondingly, for red algae plus herbivores and at low level, since \(\mathbb{1}_{\text{is plus}}(x)\) = 1 and \(\mathbb{1}_{\text{is mid}}(x)\) = 0, the previous equation becomes
\[ \begin{aligned} \widehat{\text{sqrt.area}} &= 32.9 - 22.5 \cdot 1 - 10.4 \cdot0 + 25.6 \cdot 1 \cdot 0 \\ &= 32.9 - 22.5 + 0 +0 \\ &= 10.4 \end{aligned} \]
which is the right end of the red regression line in Figure 6.1.
Moving on, for red algae minus herbivores and at mid level, since \(\mathbb{1}_{\text{is plus}}(x)\) = 0 and \(\mathbb{1}_{\text{is mid}}(x)\) = 1, the equation becomes
\[ \begin{aligned} \widehat{\text{sqrt.area}} &= 32.9 - 22.5 \cdot 0 - 10.4 \cdot 1 + 25.6 \cdot 0 \cdot 1 \\ &= 32.9 + 0 - 10.4 + 0\\ &= 22.5 \end{aligned} \]
which is the left end of the blue regression line in Figure 6.1.
And finally, for red algae plus herbivores and at mid level, since \(\mathbb{1}_{\text{is plus}}(x)\) = 1 and \(\mathbb{1}_{\text{is mid}}(x)\) = 1, the equation becomes
\[ \begin{aligned} \widehat{\text{sqrt.area}} &= 32.9 - 22.5 \cdot 1 - 10.4 \cdot 1 + 25.6 \cdot 1 \cdot 1 \\ &= 32.9 - 22.5 - 10.4 + 25.6\\ &= 25.6 \end{aligned} \]
which is the right end of the blue regression line in Figure 6.1.
That was a lot of arithmetic, but you made it! If you’re still a little unsure about using indicator functions and categorical explanatory variables in a regression model, you should re-read Subsection 5.2.2.
Recall however in the right-hand plot of Figure 6.5 that when plotting the relationship between sqrt.area
and height
in isolation, there appeared to be a positive relationship. In the last discussed multiple regression, however, when jointly modeling the relationship between sqrt.area
, herbivores
, and height
, there appears to be a negative relationship of sqrt.area
and height
as evidenced by the negative offset for height
of -10.4. What explains these contradictory results? A phenomenon known as Simpson’s Paradox, whereby overall trends that exist in aggregate either disappear or reverse when the data are broken down into groups. In Subsection ?? we elaborate on this idea by looking at another example.
Learning check
(LC6.3) Fit a new simple linear regression for a non-interaction model using lm(sqrt.area ~ herbivores + height, data = IntertidalAlgae)
. Get information about the “best-fitting” regression lines from the regression table by applying the get_regression_table()
function. How do the regression results compare to those for the interaction model above?
6.2.3 Observed/fitted values and residuals
Let’s compute all fitted values and residuals for our interaction model using the get_regression_points()
function and present only the first two rows of output for each combination of explanatory variables in Table 6.10. Remember that the coordinates of each of the blue points in Figure 6.6 can be found in the height
, herbivores
, and sqrt.area
columns. The fitted values on the regression lines are found in the sqrt.area_hat
column and are computed using our equation in the previous section:
\[ \begin{aligned} \widehat{y} = \widehat{\text{sqrt.area}} &= 32.9 - 22.5 \cdot\mathbb{1}_{\text{is plus}}(x) - 10.4 \cdot\mathbb{1}_{\text{is mid}}(x) \\ &\text{ } + 25.6 \cdot \mathbb{1}_{\text{is plus}}(x) \cdot \mathbb{1}_{\text{is mid}}(x) \end{aligned} \]
get_regression_points(area_model1) %>%
group_by(herbivores, height) %>% slice_head(n=2)
| ID | sqrt.area | herbivores | height | sqrt.area_hat | residual |
|---|---|---|---|---|---|
| 1 | 9.406 | minus | low | 32.9 | -23.51 |
| 2 | 34.468 | minus | low | 32.9 | 1.55 |
| 33 | 0.707 | minus | mid | 22.5 | -21.78 |
| 34 | 24.951 | minus | mid | 22.5 | 2.47 |
| 17 | 11.977 | plus | low | 10.4 | 1.57 |
| 18 | 14.471 | plus | low | 10.4 | 4.07 |
| 49 | 0.707 | plus | mid | 25.6 | -24.84 |
| 50 | 32.206 | plus | mid | 25.6 | 6.66 |
###Which model, without or with interaction, fits the data better?
Here we compare the mean of the observed \(y\) values (Obs) of each of the four groups with their mean fitted \(\widehat{y}\) values for the interaction (Int) and non-interaction (Non) models:
<- lm(sqrt.area ~ herbivores + height, data = IntertidalAlgae)
area_model2 <- IntertidalAlgae %>% group_by(herbivores, height) %>% summarise(mean_Obs=mean(sqrt.area))
means_Obs <- get_regression_points(area_model1) %>%
means_Int group_by(herbivores, height) %>%
summarise(mean_hat_Int = mean(sqrt.area_hat))
<- get_regression_points(area_model2) %>%
means_Non group_by(herbivores, height) %>%
summarise(mean_hat_Non = mean(sqrt.area_hat))
<- means_Obs %>% inner_join(means_Int) %>% inner_join(means_Non)
means_table means_table
Joining, by = c("herbivores", "height")
Joining, by = c("herbivores", "height")
| herbivores | height | mean_Obs | mean_hat_Int | mean_hat_Non |
|---|---|---|---|---|
| minus | low | 32.9 | 32.9 | 26.5 |
| minus | mid | 22.5 | 22.5 | 28.9 |
| plus | low | 10.4 | 10.4 | 16.8 |
| plus | mid | 25.6 | 25.6 | 19.2 |
It’s clear from this table that the predicted (fitted) means for the interaction model (mean_hat_Int) are much closer to the observed mean (mean_Obs) than for the non-interaction model (mean_hat_Non). This is even more apparent when we overlay our scatterplot with the observed and predicted (fitted) means for each model, along with colored crossbars to mark the observed mean values (mean_Obs) for each of the four groups:
6.4 Conclusion
6.4.1 Additional resources
An R script file of all R code used in this chapter is available here.
6.4.2 What’s to come?
Congratulations! We’ve completed the “Data Modeling with moderndive
” portion of this book. We’re ready to proceed to Part III of this book: “Statistical Inference with infer
.” Statistical inference is the science of inferring about some unknown quantity using sampling.
The most well-known examples of sampling in practice involve polls. Because asking an entire population about their opinions would be a long and arduous task, pollsters often take a smaller sample that is hopefully representative of the population. Based on the results of this sample, pollsters hope to make claims about the entire population.
Once we’ve covered Chapters 7 on sampling, 8 on confidence intervals, and 9 on hypothesis testing, we’ll revisit the regression models we studied in Chapters 5 and 6 in Chapter 10 on inference for regression. So far, we’ve only studied the estimate
column of all our regression tables. The next four chapters focus on what the remaining columns mean: the standard error (std_error
), the test statistic
, the p_value
, and the lower and upper bounds of confidence intervals (lower_ci
and upper_ci
).
Furthermore in Chapter 10, we’ll revisit the concept of residuals \(y - \widehat{y}\) and discuss their importance when interpreting the results of a regression model. We’ll perform what is known as a residual analysis of the residual
variable of all get_regression_points()
outputs. Residual analyses allow you to verify what are known as the conditions for inference for regression. On to Chapter 7 on sampling in Part III as shown in Figure 6.10!


can u guys through me some evil but funny names for characters
Christoph Sidebottom
-DaMouse
Warning: Very evil name!
Ben Dover
Guyin Cognito
_________________
"First you get the spoons, then you get the women" -HawkEdited By Wing Kross on 05/03/05 11:07
Snuggles the S&M Dwarf
Laktose the Intolerant
Sir Real
Grr!
Moe!
why do all your names rule compared to mine >_<
-DaMouse


|
ActiveTcl User Guide
|
||
Tcl_SubstObj - perform substitutions on Tcl objects
#include <tcl.h>
Tcl_Obj *
Tcl_SubstObj(interp, objPtr, flags)
The Tcl_SubstObj function is used to perform substitutions on strings in the fashion of the subst command. It gets the value of the string contained in objPtr and scans it, copying characters and performing the chosen substitutions as it goes to an output object which is returned as the result of the function. In the event of an error occurring during the execution of a command or variable substitution, the function returns NULL and an error message is left in interp's result.
Three kinds of substitutions are supported. When the TCL_SUBST_BACKSLASHES bit is set in flags, sequences that look like backslash substitutions for Tcl commands are replaced by their corresponding character.
When the TCL_SUBST_VARIABLES bit is set in flags, sequences that look like variable substitutions for Tcl commands are replaced by the contents of the named variable.
When th TCL_SUBST_COMMANDS bit is set in flags, sequences that look like command substitutions for Tcl commands are replaced by the result of evaluating that script. Where an uncaught continue exception occurs during the evaluation of a command substitution, an empty string is substituted for the command. Where an uncaught break exception occurs during the evaluation of a command substitution, the result of the whole substitution on objPtr will be truncated at the point immediately before the start of the command substitution, and no characters will be added to the result or substitutions performed after that point.
backslash substitution, command substitution, variable substitution
Copyright © 2001 Donal K. Fellows Copyright © 1995-1997 Roger E. Critchlow Jr.


Sea Level Rise Map
Controls
Simulate sea level rise:
Highlight new areas submerged:
San Francisco Bay Area in year xxxx


public class SyncRoomManager
extends java.lang.Object
| Constructor and Description |
|---|
SyncRoomManager(RoomHandler roomHandler,
KurentoClientProvider kcProvider)
Provides an instance of the room manager by setting a room handler and
the
KurentoClient provider. |
| Modifier and Type | Method and Description |
|---|---|
void |
addMediaElement(java.lang.String participantId,
MediaElement element)
Applies a media element (filter, recorder, mixer, etc.) to media that is
currently streaming or that might get streamed sometime in the future.
|
void |
addMediaElement(java.lang.String participantId,
MediaElement element,
MediaType type)
Applies a media element (filter, recorder, mixer, etc.) to media that is
currently streaming or that might get streamed sometime in the future.
|
void |
close()
Closes all resources.
|
void |
closeRoom(java.lang.String roomName)
Closes an existing room by releasing all resources that were allocated
for the room.
|
void |
createRoom(KurentoClientSessionInfo sessionInfo)
Creates a room if it doesn’t already exist.
|
java.lang.String |
generatePublishOffer(java.lang.String participantId)
Represents a client’s request to initiate the media connection from the
server-side (generate the SDP offer and send it back to the client) and
must be followed by processing the SDP answer from the client in order to
establish the streaming.
|
java.util.Set<UserParticipant> |
getParticipants(java.lang.String roomName)
Returns all the participants inside a room.
|
java.util.Set<UserParticipant> |
getPeerPublishers(java.lang.String participantId)
Returns the peer’s publishers (participants from which the peer is
receiving media).
|
java.util.Set<UserParticipant> |
getPeerSubscribers(java.lang.String participantId)
Returns the peer’s subscribers (participants towards the peer is
streaming media).
|
MediaPipeline |
getPipeline(java.lang.String participantId)
Returns the media pipeline used by the participant.
|
java.util.Set<UserParticipant> |
getPublishers(java.lang.String roomName)
Returns all the publishers (participants streaming their media) inside a
room.
|
java.util.Set<java.lang.String> |
getRooms()
Returns all currently active (opened) rooms.
|
java.util.Set<UserParticipant> |
getSubscribers(java.lang.String roomName)
Returns all the subscribers (participants subscribed to a least one
stream of another user) inside a room.
|
boolean |
isPublisherStreaming(java.lang.String participantId)
Checks if a participant is currently streaming media.
|
java.util.Set<UserParticipant> |
joinRoom(java.lang.String userName,
java.lang.String roomName,
boolean webParticipant,
java.lang.String participantId)
Represents a client’s request to join a room.
|
java.util.Set<UserParticipant> |
leaveRoom(java.lang.String participantId)
Represents a client’s notification that she’s leaving the room.
|
void |
mutePublishedMedia(MutedMediaType muteType,
java.lang.String participantId)
Mutes the streamed media of this publisher in a selective manner.
|
void |
muteSubscribedMedia(java.lang.String remoteName,
MutedMediaType muteType,
java.lang.String participantId)
Mutes the incoming media stream from the remote publisher in a selective
manner.
|
void |
onIceCandidate(java.lang.String endpointName,
java.lang.String candidate,
int sdpMLineIndex,
java.lang.String sdpMid,
java.lang.String participantId)
Request that carries info about an ICE candidate gathered on the client
side.
|
java.lang.String |
publishMedia(java.lang.String participantId,
boolean isOffer,
java.lang.String sdp,
boolean doLoopback,
MediaElement... mediaElements)
Same as
{@link #publishMedia(String, boolean, String, MediaElement, MediaType, boolean, MediaElement
|
java.lang.String |
publishMedia(java.lang.String participantId,
boolean isOffer,
java.lang.String sdp,
MediaElement loopbackAlternativeSrc,
MediaType loopbackConnectionType,
boolean doLoopback,
MediaElement... mediaElements)
Represents a client’s request to start streaming her local media to
anyone inside the room.
|
java.lang.String |
publishMedia(java.lang.String participantId,
boolean isOffer,
java.lang.String sdp,
MediaType loopbackConnectionType,
boolean doLoopback,
MediaElement... mediaElements)
Same as
{@link #publishMedia(String, boolean, String, MediaElement, MediaType, boolean, MediaElement
|
void |
removeMediaElement(java.lang.String participantId,
MediaElement element)
Disconnects and removes media element (filter, recorder, etc.) from a
media stream.
|
java.lang.String |
subscribe(java.lang.String remoteName,
java.lang.String sdpOffer,
java.lang.String participantId)
Represents a client’s request to receive media from room participants
that published their media.
|
void |
unmutePublishedMedia(java.lang.String participantId)
Reverts the effects of the mute operation.
|
void |
unmuteSubscribedMedia(java.lang.String remoteName,
java.lang.String participantId)
Reverts any previous mute operation.
|
void |
unpublishMedia(java.lang.String participantId)
Represents a client’s request to stop publishing her media stream.
|
void |
unsubscribe(java.lang.String remoteName,
java.lang.String participantId)
Represents a client’s request to stop receiving media from the remote
peer.
|
public SyncRoomManager(RoomHandler roomHandler, KurentoClientProvider kcProvider)
KurentoClient
provider.roomHandler
- the room handler implementationkcProvider
- enables the manager to obtain Kurento Client instancespublic java.util.Set<UserParticipant> joinRoom(java.lang.String userName, java.lang.String roomName, boolean webParticipant, java.lang.String participantId) throws AdminException
userName
- name or identifier of the user in the room. Will be used
to identify her WebRTC media peer (from the client-side).roomName
- name or identifier of the roomwebParticipant
- if true, the internal media
endpoints will use the trickle ICE mechanism when establishing
connections with external media peers (WebRtcEndpoint
); if
false, the media endpoints will be of type
RtpEndpoint
, with no ICE implementationparticipantId
- identifier of the participantUserParticipant
, can be
empty if firstAdminException
- on error while joining (like the room is not found
or is closing)public java.util.Set<UserParticipant> leaveRoom(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantUserParticipant
, if empty
this method has closed the roomAdminException
- on error leaving the roompublic java.lang.String publishMedia(java.lang.String participantId, boolean isOffer, java.lang.String sdp, MediaElement loopbackAlternativeSrc, MediaType loopbackConnectionType, boolean doLoopback, MediaElement... mediaElements) throws AdminException
participantId
- identifier of the participantisOffer
- if true, the sdp is an offer from remote, otherwise is the
answer to the offer generated previously by the server endpointsdp
- SDP String offer or answer,
that's been generated by the client’s WebRTC peerloopbackAlternativeSrc
- instead of connecting the endpoint to
itself, use this MediaElement
as sourceloopbackConnectionType
- the connection type for the loopback; if
null, will stream both audio and video mediadoLoopback
- loopback flagmediaElements
- variable array of media elements (filters,
recorders, etc.) that are connected between the source WebRTC
endpoint and the subscriber endpointsAdminException
- on errorpublic java.lang.String publishMedia(java.lang.String participantId, boolean isOffer, java.lang.String sdp, boolean doLoopback, MediaElement... mediaElements) throws AdminException
publishMedia(String, boolean, String, MediaElement, MediaType, boolean, MediaElement...)
, using as loopback the published stream and no specific type of loopback
connection.AdminException
#publishMedia(String, boolean, String, boolean, MediaElement,
MediaElement...)
public java.lang.String publishMedia(java.lang.String participantId, boolean isOffer, java.lang.String sdp, MediaType loopbackConnectionType, boolean doLoopback, MediaElement... mediaElements) throws AdminException
publishMedia(String, boolean, String, MediaElement, MediaType, boolean, MediaElement...)
, using as loopback the published stream and allowing a specific
connection type.AdminException
#publishMedia(String, boolean, String, boolean, MediaElement,
MediaElement...)
public java.lang.String generatePublishOffer(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantAdminException
- on error#publishMedia(String, String, boolean, MediaElement...)
public void unpublishMedia(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantAdminException
- on errorpublic java.lang.String subscribe(java.lang.String remoteName, java.lang.String sdpOffer, java.lang.String participantId) throws AdminException
remoteName
- identification of the remote stream which is
effectively the peer’s name (participant)sdpOffer
- SDP offer String generated by the client’s WebRTC peerparticipantId
- identifier of the participantAdminException
- on errorpublic void unsubscribe(java.lang.String remoteName, java.lang.String participantId) throws AdminException
remoteName
- identification of the remote stream which is
effectively the peer’s name (participant)participantId
- identifier of the participantAdminException
- on errorpublic void onIceCandidate(java.lang.String endpointName, java.lang.String candidate, int sdpMLineIndex, java.lang.String sdpMid, java.lang.String participantId) throws AdminException
endpointName
- the name of the peer whose ICE candidate was gatheredcandidate
- the candidate attribute informationsdpMLineIndex
- the index (starting at zero) of the m-line in the
SDP this candidate is associated withsdpMid
- media stream identification, "audio" or "video", for the
m-line this candidate is associated withparticipantId
- identifier of the participantAdminException
- on errorpublic void addMediaElement(java.lang.String participantId, MediaElement element) throws AdminException
participantId
- identifier of the owner of the streamelement
- media element to be addedAdminException
- in case the participant doesn’t exist, has been
closed or on error when applying the filterpublic void addMediaElement(java.lang.String participantId, MediaElement element, MediaType type) throws AdminException
participantId
- identifier of the owner of the streamelement
- media element to be addedtype
- the connection type (null is accepted, has the same result as
calling addMediaElement(String, MediaElement)
)AdminException
- in case the participant doesn’t exist, has been
closed or on error when applying the filterpublic void removeMediaElement(java.lang.String participantId, MediaElement element) throws AdminException
participantId
- identifier of the participantelement
- media element to be removedAdminException
- in case the participant doesn’t exist, has been
closed or on error when removing the filterpublic void mutePublishedMedia(MutedMediaType muteType, java.lang.String participantId) throws AdminException
muteType
- which leg should be disconnected (audio, video or both)participantId
- identifier of the participantAdminException
- in case the participant doesn’t exist, has been
closed, is not publishing or on error when performing the mute
operationpublic void unmutePublishedMedia(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantAdminException
- in case the participant doesn’t exist, has been
closed, is not publishing or on error when reverting the mute
operationpublic void muteSubscribedMedia(java.lang.String remoteName, MutedMediaType muteType, java.lang.String participantId) throws AdminException
remoteName
- identification of the remote stream which is
effectively the peer’s name (participant)muteType
- which leg should be disconnected (audio, video or both)participantId
- identifier of the participantAdminException
- in case the participant doesn’t exist, has been
closed, is not publishing or on error when performing the mute
operationpublic void unmuteSubscribedMedia(java.lang.String remoteName, java.lang.String participantId) throws AdminException
remoteName
- identification of the remote stream which is
effectively the peer’s name (participant)participantId
- identifier of the participantAdminException
- in case the participant doesn’t exist, has been
closed or on error when reverting the mute operation@PreDestroy public void close()
RoomManager.closeRoom(String)
public java.util.Set<java.lang.String> getRooms()
public java.util.Set<UserParticipant> getParticipants(java.lang.String roomName) throws AdminException
roomName
- name or identifier of the roomUserParticipant
POJOS (an instance contains the
participant’s identifier and her user name)AdminException
- in case the room doesn’t existpublic java.util.Set<UserParticipant> getPublishers(java.lang.String roomName) throws AdminException
roomName
- name or identifier of the roomUserParticipant
POJOS representing the existing
publishersAdminException
- in case the room doesn’t existpublic java.util.Set<UserParticipant> getSubscribers(java.lang.String roomName) throws AdminException
roomName
- name or identifier of the roomUserParticipant
POJOS representing the existing
subscribersAdminException
- in case the room doesn’t existpublic java.util.Set<UserParticipant> getPeerPublishers(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantUserParticipant
POJOS representing the publishers
this participant is currently subscribed toAdminException
- in case the participant doesn’t existpublic java.util.Set<UserParticipant> getPeerSubscribers(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantUserParticipant
POJOS representing the
participants subscribed to this peerAdminException
- in case the participant doesn’t existpublic boolean isPublisherStreaming(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantAdminException
- in case the participant doesn’t exist or has been
closedpublic void createRoom(KurentoClientSessionInfo sessionInfo) throws AdminException
sessionInfo
- bean that will be passed to the
KurentoClientProvider
in order to obtain the
KurentoClient
that will be used by the roomAdminException
- in case of error while creating the roompublic void closeRoom(java.lang.String roomName) throws AdminException
roomName
- name or identifier of the roomAdminException
- in case the room doesn’t exist or has been already
closedpublic MediaPipeline getPipeline(java.lang.String participantId) throws AdminException
participantId
- identifier of the participantAdminException
- in case the participant doesn’t exist


Our team is qualified professionals brimming with zeal and fervour to make an event of yours an extravagant affair to remember for an entire era. Our motto is simply to certify enchantment for all the services we provide to our clients as we have an uncanny ability to convert ideas to things, and eventually a reality, which is the backbone to success!
We believe each client is a partner for us, delivering what they want is an opportunity, and satisfying them is the perfection, derived out of our immense experience gained through the years.
From planning to marketing and executing the event, we have expertise dedicated to their job, delivering 100% Efficiency.
we know the nook and breadth of our city to provide exquisite locations to herald your events, making them more memorable..
Celebrate your being born on your birthday but celebrate happiness every single day of your life.
Never forget the love of your life gives you the courage you need succeed in this marriage.
History is the version of past events that people have decided to agree upon.
All strange and terrible events are welcome, but comforts we despise.
The only think I like better than talking about Food is eating.
Photography to me is catching a moment which is passing, and which is true.


Welcome to EngSciMath!
Are you a STEM student or professional who cares about:
- Renewable energy?
- Environmental sustainability?
- Wealth inequality?
- Ending war?
- Free education for all?
- Healthcare as a human right?
- Terminating systems of oppression?
- More funding for research and staff?
- Fighting fascism?
- Eliminating exploitative labor practices in work and academia?
Then this is the place for you!
Folks from outside STEM who care about these issues are more than welcome too!
Tell us about yourself


| San Francisco, California | ||||
| USA |
File Renamer - Lightroom Plugin
Supports batch renaming of files using search & replace, exif-based renaming, ...
Advanced users can customize renaming schemes.
Featuring:
Note: using FileRenamer for "field loading" is hereby deprecated - it is now recommended to use Metato instead for metadata transformation and transfer, and FileRenamer just for renaming files.
*** Read the FAQ before using.
*** Read the FAQ before using.
*** Read the FAQ before using.
Quick Links (intra-page)
Background Information
Screenshots
How to Use
File Renamer FAQ (Frequently Asked Questions)
Revision History
Download
See the readme file after downloading for usage and other notes.
*Library* (NOT File) Menu -> Plugin Extras
Common functions are accessed via the library menu - you'll not find them in the file menu..
Default rename prompt:
This can be customized for special renaming needs by editing 'Advanced Settings'.
I wanted to rename my files in a way that native Lightroom did not support, and I'm sharing my solution with you...
| Photo | Photo or video... |
| File | Photo or video file. |
- Install (see readme file in downloaded zip file)
- Configure in plugin manager
- Library Menu
*** Read the FAQ before using.
*** Read the FAQ before using.
*** Read the FAQ before using.
See elare plugin framework for common settings.
Additional Settings and Controls
| None |
*** Read the FAQ before using.
*** Read the FAQ before using.
*** Read the FAQ before using.
Access via Lightroom's menu bar: Library Menu -> Plugin Extras
| Rename Files - Start | Start here (but first, backup your catalog). - Prepares for batch rename using Lightroom proper - 'rc File Renamer' preset. - Moves headline field to temporary storage, then places new filename in headline field. 'rc File Renamer' preset will rename files according to headline field. |
To be clear, and yet another reminder: there is another step in here which you must take - renaming files in Lightroom proper. That step can not be omitted !!! Please read the faq before using this plugin - thanks. |
|
| Rename Files - Finish | Invoke after batch rename using Lightroom proper, 'rc File Renamer' preset. - Moves headline field from temporary storage back to proper place. |
*** Read the FAQ before using.
*** Read the FAQ before using.
*** Read the FAQ before using.
These FAQs come partly from users, and partly from my imagination. Please let me know if there are errors or omissions in this FAQ - thanks.
NOTE: The following Q&A's assume that the plugin is working as I expect... If, after your best effort, still "no go", please let me know.
Question: Why should I use File Renamer?
Answer: If Lightroom's native file renaming does what you need, then File Renamer is not for you. If you need 'Search & Replace' file renaming, then File Renamer will work for you, right out of the box. If you need something different, then you'll need to customize via lua configuration file.
*** READ THIS ***
Question: How does it work? (and why does it work this way)
Answer: Plugins can't actually rename files, but they can initialize an IPTC field with a filename that can be used by you (in Lightroom) for renaming. 'rc File Renamer' uses the headline field, but it really doesn't matter which field is used, since headlines will be restored after the headline field is borrowed for renaming, provided you follow instructions, which are:
Question: What is the "Renamed" collection for, in 'rc File Renamer' collection set?
Answer: Photos whose names will change are put in the "rename" collection.
I exclude photos that are in that collection from smart publish collections which need for the photo to be republished using the new name.
Thus whenever photos get renamed (and thus put into the renamed collection), they are marked for deletion on the publish service (since they are no longer included in the smart publish collection).
Thus I can publish / delete them.
Then after removing from the renamed collection, they are marked "to be published", at which point they can be republished with the new name.
Or it can be used for other things instead if you want...
Question: Can I use file-renamer to change filename extension?
Answer: No. - because of how it works, changes are confined to base of filenames.
Question: What is Lua, and what is a regular expression?
Answer: www.lua.org - good docs here...
Question: Other resources to aid in customization?
Answer:
Question: Any other hot tips I should know about?
Answer: Yes:
Question: What are the limitations of File Renamer and what are your plans for the future?
Answer:
(reverse chronological order)
Version 1.14.2, released 2015-01-21
- Added information to initial prompt to help clarify: results depend on preset selected in plugin manager.
Version 1.14.1, released 2014-12-06
- Fixed a bug on Mac (some Yosemite systems for sure, dunno which others) - was computing wrong folder for filename templates, and so wasn't working without user cleverness and action..
Version 1.14, released 2014-06-30
- Added 'Date-Time Plus Original Filename' preset.
Version 1.13, released 2014-05-19
- Improved Exif Rename 2 preset: added support for photographer ID.
Version 1.12, released 2014-05-19
- Improved Exif Rename 2 preset: added support for subsec time, with ability to emulate if not present in exif. Also restructured to make it simpler, and easier to reorder components.
Version 1.11, released 2014-05-18
- Added Exif Rename 2 preset - robustened and more usable, but more complicated than the original "Exif Rename" preset.
- Using new techinque for finding the real folder where filename renaming templates should be stored - hopefully this will either be the same or better - let me know if worse.
- Added check for illegal filename characters.
- Includes greatly robustened algorithm for parsing image number from filename, should you decide to use it instead of image number from exif metadata (e.g. because it's missing, or you really want to a sequence number which isn't the original image-number..).
Version 1.10.1, released 2014-02-01
- Fixed bug: sometimes requisite filenaming template was not being found (if, for example filenaming templates were being stored with catalog for a while, but aren't anymore).
Version 1.10, released 2013-10-17
- Improved handling of "field loader" type presets, and added special custom field loading preset:
"Load File Base Name Into Title"
(deprecated in 2014 in favor of Metato plugin).
Version 1.9.1, released 2013-09-24
- Fixed potential for "catch-22" problem when failing to run finish after renaming via template.
Version 1.9, released 2013-09-07
- Fixed bug in 'Field Loader' preset, and enhanced it to support "raw" metadata too (as source field) like folder-path. It previously supported formatted metadata only, like title or folder name.
Version 1.8, released 2013-08-19
- Added exiftool for Mac users (v9.34).
- Refreshed exiftool for Windows users (v9.34).
- Certified for Lr5.
Version 1.7.2, released 2013-05-10
- Mac to use manual restart for now (auto-restart after filename preset template copied from plugin to Lr app data (upon first use) was causing problems on Mac platform.
Version 1.7.1, released 2013-05-10
- Fixed bug that only occurs on Mac. Symptom/error-message: "attempt to reference 'execute' member but that's nil, or something to that effect.
Version 1.7, released 2013-05-07
- Added preset: 'Field Loader', which, by default, simply loads title into caption (not intended to be used for file renaming, but could be). Could also be modified to load any field(s), into any other field(s).
Version 1.6, released 2012-12-03
- Enhanced default preset (search & replace) to preserve UI elements between invocations, and log the search parameters.
Version 1.5, released 2012-11-27
- Solved problem when presets are kept with catalog.
- Added option for programmatic restart when requisite filenaming template copied to Lr preset folder, thus necessitating Lightroom be restarted.
- Added warning if plugin is disabled.
- Added general help feature to Lightroom's Help Menu (Plugin Extras).
- Added check for missing files to improve sensibility of error logging.
Version 1.4, released 2012-11-26
- Removed potential for misleading error message about filenaming template not being found.
- Detects virtual copies up-front, to avoid misleading log message.
- Added note for Mac users about how exiftool is required for exif-based file renaming presets (not search & replace).
Version 1.3, released 2012-11-23
- Includes exiftool now v9.06.
- Added ready-to-use (or modify) preset which renames files based on exif capture timestamp and image number.
Version 1.2, released 2012-11-19
- Fixed bug in preset manager: '>', '<', '>|', '<|' buttons were broken.
- Added option for different log file location.
Version 1.1.1, released 2012-11-14
- Was not finding requisite filenaming template, now it is.
Version 1.1, released 2012-09-29
- Creates and populates rename collection in test mode.
Version 1.0, released 2011-06-12
- Initial release.
acceptance of Download Terms & Conditions will be required
*** Read the FAQ before using.
*** Read the FAQ before using.
*** Read the FAQ before using.
File Renamer 1.14.2 - Latest & greatest: this is the one to download.
*** Read the FAQ before using.
*** Read the FAQ before using.
*** Read the FAQ before using.
File Renamer 1.14.1 - Previous release, in case problem with latest (please let me know).
| Static content updated 2012-06-12 | Copyright 2007 - robcole.com - all rights reserved. | Dynamic content updated 10:56:37 AM |


Website Name
Home
Page 1
Page 1-1
A Basic Panel
Webmonkeys Bootstrap!
Words, Words, Words!
Button
This is a paragraph!
Another Paragraph
Randomness. kldsjf;oiahwefjnv;asd;lha
Home
Menu 1
Submenu 1
Submenu 2
Submenu 3
Menu 2
Menu 3
First Name
Last Name
Email
Steve
Jobs
<EMAIL_ADDRESS>Bill
Gates
<EMAIL_ADDRESS>Mark
Zuckerberg
Mark@example.com


/
Search
Loading...
Github Link
GME
GameStop Corp.
225.00
-100.00 (-30.77%)
Open
316.56
High
322.00
Low
212.00
Market Cap
3.17B
Volume
74,491,412
Avg Volume
5,123,523
1D
5D
3M
1Y
5Y
Couldn't load chart
GME
GameStop Corp.
225.00
-100.00 (-30.77%)
1D
5D
3M
1Y
5Y
Couldn't load chart
Open
316.56
High
322.00
Low
212.00
Market Cap
3.17B
Volume
74,491,412
Avg Volume
5,123,523


Piano/Keyboard & Drum Instructor
Jimi Marks graduated from UC Berkeley in 2010 with a BA in Music and Cognitive Science. Currently he plays drums and keyboards in a variety of projects whose styles range from swing to surf rock to ska. He also continues to pursue an independent study of the piano, learning classical and jazz pieces as well as theory. Always open to exploring new musical styles, Jimi encourages students to learn about the music they already love to listen to. By doing this, he aims to foster good practicing habits while at the same time teach students to get as much joy from their instrument as possible.


HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 X-AspNetMvc-Version: 5.2 X-Frame-Options: SAMEORIGIN Strict-Transport-Security: max-age=16070400; includeSubDomains Date: Fri, 19 Jan 2018 23:52:14 GMT Set-Cookie: BNI_persistence=00000000000000000000000024c6410a0000bb01; Path=/ Strict-Transport-Security: max-age=31536000 Set-Cookie: ASP.NET_SessionId=2yxjg4devg52wik0syl1muez; path=/; secure; HttpOnly Transfer-Encoding: chunked
Share This Product
Brand: Clark's
Style/ Marked Size: Mid Heel / 7M
Measured Size: Length 9.5" Width 3" Heel 2"
Condition: Pre-owned, very light wear, no notable damage found, sold as is.
Notes: -
Mannequin- Unless otherwise stated, pants or bottoms that are on the Mannequins we use to display clothing are NOT included. Only items stated in the listing are part of this auction.
Measurement Notes-
Tops- The Chest is measured lying flat from armpit to armpit then doubled. The Length is measured from the seam at the base of the neck down the back to the hem.
Pants- The waist measured lying flat across the top then doubled. The inseam measured from seam at groin to bottom of pant leg hem.
Shoes- Unless otherwise stated item is measured using the total length and width of the outsole.
Due to the nature of donations used items may have unforeseen damage not noted in the description. Some Jeans may have distressed appearance. We do not guarantee all are by manufacturers design.
Sleeve Length- When applicable sleeves are measured in total length along the outside from the top shoulder seam to the end of the cuff.
Payments MUST BE RECEIVED WITHIN seven (7) DAYS from auction close.
Available Payment Methods:
This item cannot be shipped internationally.
This item ships via FedEx
Please note, FedEx's online services will be temporarily down this Saturday, January 20, between 9:00PM and 11:00PM CT.
Shipping prices will not be available during that time.
Shipping Weight: 2 lbs.
Actual Weight: 1.5 lbs.
Handling Price: $3.00
Shipping Calculator
Enter the following shipping information:
Goodwill Industries of the Inland Northwest
Spokane, WA
Goodwill Industries of the Inland Northwest
1406 E. Front Ave
Spokane, WA 99202
Contact Us
Items are shipped using a major carrier usually within 5 business days after receipt of payment. Shipping charges are calculated at payment time.
Payments: Items may be paid for by Visa, Mastercard credit card, Paypal,or a debit or gift card with a Visa or Mastercard logo. Shipping Notes: Our items are as received through donations. Items have not been professionally authenticated, serviced or tested unless otherwise indicated. We do not guarantee functionality. Items are represented to the best of our ability, be aware that items are used and/or old and may contain unseen faults. Items sold are for collectible/antique purposes only, they are not intended as a childrenï¿½s toy for ages 0 to 12. Please ask us any questions that you may have prior to auction end.  Thank you for shopping with ShopGoodwill.com. Local Pick Up Available: Pick-up Location Open Tuesday & Friday 9:30am to 3:30 pm. (Except the following Holidays: New Years Day, Memorial Day, 4th of July, Labor Day, Veterans Day, Presidents Day, Thanksgiving Day, and Christmas.) All Orders MUST BE PAID ONLINE 24 hours prior to Pick-up. (We have no way of collecting payment at our facility) Items NOT PICKED-UP WITHIN 14 Days of payment will be considered a donation and resold.
Merchandise is sold As Is. Returns will only be accepted with prior authorization and under the terms stated in this Return Policy. If you have questions regarding the quality or authenticity of this item please contact Goodwill Industries of the Inland Northwest prior to placing your bid. Items may be returned within seven (7) days of receipt if the merchandise was damaged during shipping or if there was a major distortion in the description. Returns will not be accepted without prior authorization. PLEASE NOTE THAT WE DO NOT REFUND SHIPPING AND HANDLING CHARGES. Items selected for pick up from the seller, must be picked up within fourteen (14) days from close of auction. Items not picked up from seller within fourteen (14) days from close of auction will be resold with no further notice.
There are currently no bids for this item.
Brand: Clark's
Style/ Marked Size: Mid Heel / 7M
Measured Size: Length 9.5" Width 3" Heel 2"
Condition: Pre-owned, very light wear, no notable damage found, sold as is.
Notes: -
Mannequin- Unless otherwise stated, pants or bottoms that are on the Mannequins we use to display clothing are NOT included. Only items stated in the listing are part of this auction.
Measurement Notes-
Tops- The Chest is measured lying flat from armpit to armpit then doubled. The Length is measured from the seam at the base of the neck down the back to the hem.
Pants- The waist measured lying flat across the top then doubled. The inseam measured from seam at groin to bottom of pant leg hem.
Shoes- Unless otherwise stated item is measured using the total length and width of the outsole.
Due to the nature of donations used items may have unforeseen damage not noted in the description. Some Jeans may have distressed appearance. We do not guarantee all are by manufacturers design.
Sleeve Length- When applicable sleeves are measured in total length along the outside from the top shoulder seam to the end of the cuff.
Payments MUST BE RECEIVED WITHIN seven (7) DAYS from auction close.
Available Payment Methods:
This item cannot be shipped internationally.
This item ships via FedEx
Please note, FedEx's online services will be temporarily down this Saturday, January 20, between 9:00PM and 11:00PM CT.
Shipping prices will not be available during that time.
Shipping Weight: 2 lbs.
Actual Weight: 1.5 lbs.
Handling Price: $3.00
Shipping Calculator
Enter the following shipping information:
Goodwill Industries of the Inland Northwest
Spokane, WA
Goodwill Industries of the Inland Northwest
1406 E. Front Ave
Spokane, WA 99202
Contact Us
Items are shipped using a major carrier usually within 5 business days after receipt of payment. Shipping charges are calculated at payment time.
Payments: Items may be paid for by Visa, Mastercard credit card, Paypal,or a debit or gift card with a Visa or Mastercard logo. Shipping Notes: Our items are as received through donations. Items have not been professionally authenticated, serviced or tested unless otherwise indicated. We do not guarantee functionality. Items are represented to the best of our ability, be aware that items are used and/or old and may contain unseen faults. Items sold are for collectible/antique purposes only, they are not intended as a childrenï¿½s toy for ages 0 to 12. Please ask us any questions that you may have prior to auction end.  Thank you for shopping with ShopGoodwill.com. Local Pick Up Available: Pick-up Location Open Tuesday & Friday 9:30am to 3:30 pm. (Except the following Holidays: New Years Day, Memorial Day, 4th of July, Labor Day, Veterans Day, Presidents Day, Thanksgiving Day, and Christmas.) All Orders MUST BE PAID ONLINE 24 hours prior to Pick-up. (We have no way of collecting payment at our facility) Items NOT PICKED-UP WITHIN 14 Days of payment will be considered a donation and resold.
Merchandise is sold As Is. Returns will only be accepted with prior authorization and under the terms stated in this Return Policy. If you have questions regarding the quality or authenticity of this item please contact Goodwill Industries of the Inland Northwest prior to placing your bid. Items may be returned within seven (7) days of receipt if the merchandise was damaged during shipping or if there was a major distortion in the description. Returns will not be accepted without prior authorization. PLEASE NOTE THAT WE DO NOT REFUND SHIPPING AND HANDLING CHARGES. Items selected for pick up from the seller, must be picked up within fourteen (14) days from close of auction. Items not picked up from seller within fourteen (14) days from close of auction will be resold with no further notice.
There are currently no bids for this item.
Product Description
Brand: Clark's
Style/ Marked Size: Mid Heel / 7M
Measured Size: Length 9.5" Width 3" Heel 2"
Condition: Pre-owned, very light wear, no notable damage found, sold as is.
Notes: -
Mannequin- Unless otherwise stated, pants or bottoms that are on the Mannequins we use to display clothing are NOT included. Only items stated in the listing are part of this auction.
Measurement Notes-
Tops- The Chest is measured lying flat from armpit to armpit then doubled. The Length is measured from the seam at the base of the neck down the back to the hem.
Pants- The waist measured lying flat across the top then doubled. The inseam measured from seam at groin to bottom of pant leg hem.
Shoes- Unless otherwise stated item is measured using the total length and width of the outsole.
Due to the nature of donations used items may have unforeseen damage not noted in the description. Some Jeans may have distressed appearance. We do not guarantee all are by manufacturers design.
Sleeve Length- When applicable sleeves are measured in total length along the outside from the top shoulder seam to the end of the cuff.


Through this means, we want to make the drivers feel against the abuse that Uber and Lyft companies have committed against us through policies and modifications without prior consultation.
For this reason we have been obliged to form a committee and collect the largest number of signatures of driver users who agree with our requests to Lyft and Uber.


The Projects provide a hands-on opportunity to experiment with the topics and concepts presented in lectures. Although students work on these projects in three days period, it would take much longer to fully complete a good project. Each project comes with a number of challenge problems that will take even the experiences programmer nontrivial time. projects are collaborative and open-source, Basicaly Helping you to think about how or why The Technologies we use as Tech Professionals makes their decisions.
Each project is chosen by it's team to reinforce a particular concept, and you are encouraged to check them out. You are not expected to submit your project, although it will be good if you do. Think of projects as a chance to solidify your working knowledge of the Topics Covered - after all, what better way to learn Something than to practice it?
| Author | Project Name | Description | Repository |
|---|---|---|---|
| {{project.authors}} | {{project.name}} | {{project.description}} | {{project.repo.slice(18)}} |


Where should I start?
If you are just getting started make sure you install this sdk and then build and run the basic PubSub
I keep getting AWS_ERROR_MQTT_UNEXPECTED_HANGUP
This could be many different things but it most likely is a policy issue. Start with using a super permissive IAM policy called AWSIOTFullAccess which looks like this:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:*"
],
"Resource": "*"
}
]
}
After getting it working make sure to only allow the actions and resources that you need. More info about IoT IAM policies can be found here.
Dependencies are bad.
If you get the following Error:
CMake Error at CMakeLists.txt:46 (include):
include could not find load file:
AwsFindPackage
Make sure to use --recursive
in the git clone command
git clone --recursive https://github.com/aws/aws-iot-device-sdk-cpp-v2.git
Detecting connection loss (tldr use keepAliveTimeSecs and pingTimeoutMs)
There are 3 mechanisms for detecting connection loss:
- The keepAliveTimeSecs and pingTimeoutMs arguments passed to MqttConnection::Connect(). These control how often the SDK sends a PINGREQ, and how long the SDK will wait for a PINGRESP before assuming the connection is lost.
- If the OS socket says it's closed, the SDK immediately tries to reconnect. The timing of this is not reliable, it depends on the OS and how the connection is lost, it can take many minutes.
- The various TcpKeepAlive controls on the MqttClientConnectionConfigBuilder. These control a similar mechanism at the TCP layer, rather than the MQTT layer, but is implemented in the OS and behavior may vary across platforms
How to use a Pre-Built aws-crt-cpp (Most useful for development of this package)
mkdir aws-iot-device-sdk-cpp-v2-build
cd aws-iot-device-sdk-cpp-v2-build
cmake -DCMAKE_INSTALL_PREFIX="<absolute path sdk-cpp-workspace dir>" -DCMAKE_PREFIX_PATH="<absolute path sdk-cpp-workspace dir>" -DBUILD_DEPS=OFF ../aws-iot-device-sdk-cpp-v2
cmake --build . --target install
Mac-Only TLS Behavior
Please note that on Mac, once a private key is used with a certificate, that certificate-key pair is imported into the Mac Keychain. All subsequent uses of that certificate will use the stored private key and ignore anything passed in programmatically. Beginning in v1.7.3, when a stored private key from the Keychain is used, the following will be logged at the "info" log level:
static: certificate has an existing certificate-key pair that was previously imported into the Keychain. Using key from Keychain instead of the one provided.


Chapter 5: Hello Internet¶
In this act, we will publish your notebook to the Internet using GitHub, a social network for sharing and collaborating on code. GitHub is a platform frequently used by journalists and others to publish their notebooks. As listed above, examples include:
- “The Tennis Racket” by BuzzFeed and the BBC
- “Californians are paying billions for power they don’t need” by the Los Angeles Times
- “Machine bias” by ProPublica
GitHub is an online extension of a command-line tool called git, a free and open-source version control tool for tracking and managing changes to code.
The first step in working with git is to convert a directory on your computer into a repository that will have its contents tracked going forward. You do that by returning to your terminal, hitting the CTRL-C
key combination to return the standard command line and entering the following.
$ git init .
That will instruct git to initialize a new repository in your current folder.
Now visit GitHub and create a new public repository named first-python-notebook
. Don’t check “Initialize with README.” You want to start with a blank repository.
Then connect your local directory to GitHub’s site with the following.
$ git remote add origin https://github.com/<yourusername>/first-python-notebook.git
Then officially add your notebook file to your repository for tracking with git’s add
command.
# Using the '*' will add all files that end with ipynb, the notebook's standard file extension.
$ git add *.ipynb
Log its addition with Git’s commit
command. You can include a personalized message after the -m
flag.
$ git commit -m "First commit"
If this is your first time using Git, you may be prompted to configure you name and email. If so, take the time now.
If looked at the example above, you’ve probably noticed that other notebook authors have helpfully summarized and annotated their code by inserting text, links and images between code blocks.
This is accomplished by adding new cells to your notebook and converting them from the default output, python code, to an alternative called Markdown. Markdown is a markup language that formats text. It’s a common lightweight alternative to HTML.
To create and print a new Markdown cell in your notebook, start up your notebook again from the terminal.
$ jupyter notebook
Now open your notebook file. At the top, add a new cell by clicking the plus button and hitting the up arrow button to move it to the top slot.
Click on the box and use your mouse to pull down the option menu that current reads “Code” from the toolbar. Replace it with “Markdown.”
Now click into the cell and type the following:
# First Python Notebook
Hello world!
Now hit the play button you will see the result. The first line has been turned into a header because that is how Markdown formats #
at the front of lines. To learn more Markdown rules refer to its documentation.
Now try adding more cells to your document lower down and annotating individual lines of code before they are run.
After you’ve finished, save your notebook and return to your terminal so we can commit your work and push it to GitHub. Again, open the terminal and hit the CTRL-C
key combination to halt the notebook.
Again you’ll want to tell git to log your notebook file changes using add
.
$ git add *.ipynb
Now log your changes with commit
.
$ git commit -m "Markdown"
Push your commit up to GitHub.
$ git push origin master
Soon after your Markdown edits should appear on the GitHub site alongside your code.


1 May 2009 - The situation continues to evolve rapidly. As of 06:00 GMT, 1 May 2009, 11 countries have officially reported 331 cases of influenza A(H1N1) infection.
The United States Government has reported 109 laboratory confirmed human cases, including one death. Mexico has reported 156 confirmed human cases of infection, including nine deaths.
The following countries have reported laboratory confirmed cases with no deaths - Austria (1), Canada (34), Germany (3), Israel (2), Netherlands (1), New Zealand (3), Spain (13), Switzerland (1) and the United Kingdom (8).
Further information on the situation will be available on the WHO website on a regular basis. WHO advises no restriction of regular travel or closure of borders. It is considered prudent for people who are ill to delay international travel and for people developing symptoms following international travel to seek medical attention, in line with guidance from national authorities.
There is also no risk of infection from this virus from consumption of well-cooked pork and pork products. Individuals are advised to wash hands thoroughly with soap and water on a regular basis and should seek medical attention if they develop any symptoms of influenza-like illness.


Student Grade Table
Average Grade
Student Grade Table by Keith Tachibana
Student Name
Course
Grade
Operations
No Grades Recorded
Add Grade
Please enter a valid student name
Please enter a valid course name
Please enter a student grade from 0 to 100
Cancel
Add


Admin Dashboard
Laraspace Frontside Template
Use this document as a way to quickly start any new project.


These demos show the integration between Lightstreamer JavaScript Client library and Google's AngularJS.
To learn more visit the project page on github and explore the source code of the application.
To learn more visit the project page on github and explore the source code of the application.
Access by name
In this first example the model behind the view is made by a JSON object that is expanded by angular using a single ng-repeat directive.
Each item is indexed in the object by item name: the resulting iteration produces a table that is not ordered.
| Name | Last | Time | Change | Bid Size | Bid | Ask | Ask Size | Min | Max | Ref. | Open |
| {{item.stock_name}} | {{item.last_price}} | {{item.time}} | {{item.pct_change}} | {{item.bid_quantity}} | {{item.bid}} | {{item.ask}} | {{item.ask_quantity}} | {{item.min}} | {{item.max}} | {{item.ref_price}} | {{item.open_price}} |
Iterate through index
In this case the model is composed by an Array of Arrays that is expanded using two nested ng-repeat directives.
Each item keeps its own index in the resulting array, that's why the table results sorted by stock name.
| Name | Last | Time | Change | Bid Size | Bid | Ask | Ask Size | Min | Max | Ref. | Open |
| {{field}} |
Use ng-grid
In this case the view is composed by ng-grid (thus the model behind is structured as ng-grid requires).
This makes to manipulate the data using all the features exposed by that library.


This is an old version of my site, shown mostly for fun. See the current version
here
.
How much did you climb today?
date
v0
v1
v2
v3
v4
Regular Submit


Seth Meyers' Netflix show has a button for skipping Trump jokes
Not to be taken too seriously
by Rob ThubronWhy it matters: Netflix has never been one to shy away from adding innovative features to its service, and while this latest tool is more of a jokey implementation, it’s still quite interesting. In Seth Meyers’ new stand-up show, viewers will be able to skip any jokes about Donald Trump by pressing a button.
The feature will appear in Meyers’ Netflix special, Lobby Baby. It works in the same way as the service’s ‘skip intro,’ jumping past anything the comedian says about Trump.
"It dawned on me that because it was on Netflix, there would be this opportunity to put in technology that would allow people to skip it," Meyers told CNN Business. "It was a way to build in the response to anyone who would say, 'Oh, let me guess there's going to be jokes about the President.'"
The button is a one-off and isn’t meant to be taken seriously—most people who are offended by Trump jokes are unlikely to watch the show—but it’s still a clever feature that could eventually find uses elsewhere.
Meyers himself doesn’t expect people to use the button. "I think, look, sometimes at a fancy restaurant they'll put parsley on your plate and you'll think, well, that's a nice touch, but you're not going to eat the parsley," he said.
Netflix's other experiments in recent times include choose-your-own-adventure Black Mirror: Bandersnatch. It’s also testing a feature that allows some Android phone users to speed up TV shows or movies.
Lobby Baby is now available on Netflix.


Today I learned that letting a witness server running 24/7 is quite a challenge job. This morning, my server was not reachable anymore. After contacting the support and managing to power on the server, I saw that the RAID SSD drive was mounted readonly. Thus, all scripts failed and the blockchain file was damaged. I had to start replaying again.
At first, I disabled my signing key by:
1 | beempy witnessdisable |
After remounting in write mode, downloading the blockchain file from gtg, I’m replaying at the moment.
In the meantime, I wrote some scripts to speed downloading and replaying for the next unexpected reboot. You can find my scripts here:
https://github.com/holgern/witness-shm-setup
It is a work in progress.
When the replay is finished, I will set my signing key again.
In order to prevent a complete replay, I wrote two scripts, one for backup the ramdisk:
1 | rsync --quiet --archive --delete --recursive --force /dev/shm/ ${shm_backup_dir} |
and one script for restoring it
1 | mount -o remount,size=${shared_file_size} /dev/shm |
I hope, this will save time and let me start steemd directly after restoring.
Witness rank and activity
My active rank is currently #135. Thanks again for the support! I will sign my first block in about 9 days.
I released a new update for beem and I’m very active in the beem-discord server. I’ve answered all kind of questions and fixed some bugs in beem.
I’ve worked on my new @fullnodeupdate project. This project provides a list of currently working nodes. Currently, It is only used by beem, but it can be used in all steem related libraries, steem-js, python-steem, ….. The only requirement is that the library understand json and can read json_metadata from an account.
I’m currently spending my entire free time on both projects.
If you like what I’m doing, please consider @holger80 as one of your witnesses. You can use steemconnect.com for approving your vote or go to https://steemit.com/~witnesses and enter my name into the vote field:
- Robust price feed publishing with beempy
- Measuring seed-node ping times with python
- My Witness Application - holger80
This page is synchronized from the post: ‘Witness update #1 - first unexpected server reboot’


This server (Java edition) was created with the main goal being to re-create the campus (West included) in Minecraft. It serves as a common place for past, current, and future Queen’s students to come together and enjoy the sense of community that has been abruptly taken away this spring. There is a system in place where each player can specify their year and faculty that is displayed in the chat when talking to others in-game. This gives a sense of students talking to students rather than just strangers.
The layout of the university district and surrounding area (roads, 2D building shapes, elevation, etc) was imported as a template for the campus recreation project. This makes it quite easy for new players to locate and determine the appropriate scale for the building(s) they want to build. This way everything is very close to the real campus even though it is being built by many different people. Visit the online map to see the current progress.
In addition to the campus recreation project, there is also a survival world for a more casual experience. Players are free to switch between these two separate worlds at any time and may choose to play in one or both of these worlds.
QUCraft Club is not affiliated with or endorsed by Mojang Studios or Minecraft. © 2020-2023 QUCraft.


Arthur B. Oliveira
Backend & Game Developer
I’m an Backend & Game developer. I develop Api's, Websites and Games. The tecnologies I'm most proficient are .net, Unity 3d. and Node.js.
Check out my Github Repositories to see my Projects and my Medium where I share some of my experiencies. Feel free to contact me anytime. See ya!


About
Portfolio
(current)
Contact
Resume
Portfolio
Watch or Read
View Project
GitHub Repository
inRHYTHM
View Project
GitHub Repository
Code Quiz
View Project
GitHub Repository
Employee Summary
View Project
GitHub Repository
Password Generator
View Project
GitHub Repository
Horiseon Code Refactor
View Project
GitHub Repository
Eat-Da-Burger!
View Project
GitHub Repository
Note Taker
View Project
GitHub Repository
Get the Cheesy Puffs!
Play Game


This cheesy, creamy dish originated at a Sanborns cafe in Mexico City in 1950. Its name, "Swiss enchiladas," alludes to its copious use of dairy. - Todd Coleman
Ingredients
1 h 5 m6 servings
9 tomatillos, husked and rinsed
1/4 white onion
1 serrano chile
1 yellow chile (guerito pepper)
2 cloves garlic
1/4 bunch fresh cilantro
Salt and freshly ground black pepper
1/2 cup Mexican crema
1/2 heavy cream
Vegetable oil, for frying
6 corn tortillas
1 1/2 cups shredded chicken
1/2 cup shredded Oaxaca or mozzarella cheese
Instructions
Preheat the oven to 350 degrees F.
Put the tomatillos, onion and both chiles in a medium heavy saucepan, cover with water and bring to a boil over medium-high heat. Boil until the tomatillos turn an olive-green color, about 10 minutes. Drain and transfer the tomatillos, onions and chiles to a blender. Add the garlic and cilantro and blend until smooth. Season with salt and freshly ground black pepper.
Mix the Mexican crema and heavy cream together in a small bowl and season with salt. Set aside.
Heat 1 tablespoon oil in a small skillet over medium-high heat. Fry the tortillas until golden but still pliable, about 10 seconds per side, using more oil if needed. Transfer to paper towels to drain.
Place the tortillas on a work surface.  Spread 1/3 cup of the sauce in a 13-by-9-by-2-inch glass baking dish. Arrange the enchiladas in 1 layer, seam-side down, snugly inside the dish. Pour the rest of the sauce over the enchiladas. Drizzle the cream mixture on top and sprinkle the cheese all over.
Bake until the cheese is melted and starting to brown in spots, about 30 minutes. Serve immediately.
Enchiladas Suizas is a dish that is on my top favorite list, just right under Albondigas. There really is no special occasion for this dish, though I saw on the internet that is it a good dish for Cinco de Mayo. It's a gentle casual dish that could be enjoyed when a large group of people are dining. As for the sides to this dish, definetely rice and beans! Goes swell with any type of beverage, but I perfer a nice cold beverage of Jarritos.