Thanks for the `reprex`

. I've found the problem(s) but couldn't fix. I had to get `{plspm}`

from github since the package was taken off CRAN active after a long period of silence from the developer. It doesn't look to have been touched for years. You might want to check `{pls}`

as an alternative. Or make sure that the methodology is right by reviewing this.

Here are my notes:

error comes from get_weights.R

```
w_new = rowSums(W)
w_dif = sum((abs(w_old) - abs(w_new))^2)
# when 1e-06 reached or after 100 iterations
if (w_dif < specs$tol || iter == specs$maxiter) break
```

W is defined in this block

```
# outer design matrix 'ODM' and matrix of outer weights 'W'
ODM = list_to_dummy(blocks)
W = ODM %*% diag(1/(apply(X %*% ODM, 2, sd)*sdv), lvs, lvs)
```

`blocks`

is the third positional argument to `plspm()`

, set to `farmwood_block`

as a `list`

, as required

list of vectors with column indices or column names from Data indicating the sets of manifest variables forming each block (i.e. which manifest variables correspond to each block).

and `X`

is

```
X = get_treated_data(MV, specs) # specs is returned internally
```

where `MV`

```
MV = get_manifests(Data, blocks)
```

where `Data`

is `farmwood`

ands `blocks`

is `farmwood_blocks`

.

`specs`

however is supposed to derive from

However ODW and X are non-conformable

```
dim(ODM)
#[1] 24 6
dim(farmwood)
#[1] 118 33
and `%*%` requires the number of columns of one to equal the number of rows of the other.
That's even before considering that `farmwood` is a `data.frame` and not a `matrix`, but after converting and making conformable (number of rows of one equals the number of columns of the other),
```

apply(X %*% ODM, 2, sd)

```
evaluates to `NA`, which will spoil everything to follow, since rowSums(X) will be NA so the expression
```

w_dif - specs$tol || iter == specs$maxiter

```
evaluates to `TRUE` (`NA || something`)
Here are the examples from `help(plspm)` that *don't* throw this error, but I can't spot what differs.
```

library(plspm)

library(turner) # missing dependency

data(satisfaction)

# path matrix

IMAG = c(0,0,0,0,0,0)

EXPE = c(1,0,0,0,0,0)

QUAL = c(0,1,0,0,0,0)

VAL = c(0,1,1,0,0,0)

SAT = c(1,1,1,1,0,0)

LOY = c(1,0,0,0,1,0)

sat_path = rbind(IMAG, EXPE, QUAL, VAL, SAT, LOY)

innerplot(sat_path) # plot diagram of path matrix

sat_blocks = list(1:5, 6:10, 11:15, 16:19, 20:23, 24:27) # blocks of outer model

sat_mod = rep("A", 6) # vector of modes (reflective indicators)

satpls = plspm(satisfaction, sat_path, sat_blocks, modes = sat_mod,

scaled = FALSE)

innerplot(satpls) # plot diagram of the inner model

outerplot(satpls, what = "loadings") # plot loadings

outerplot(satpls, what = "weights") # plot outer weights

satpls

group_perm = plspm.groups(satpls, satisfaction$gender, # permutation test with 100 permutations

```
method="permutation", reps=100)
```

group_perm

```
(plots omitted)
```