library("MPsychoR")
data("ASTI")
st <- ASTI[ ,c(2,4,7,13,16,24,25)]
pg <- ASTI[ ,c(11,14,15,17,18,23)]
stpg <- data.frame(st = st, pg = pg)
pcafit <- prcomp(stpg, scale = TRUE)
library("Gifi")
package 㤼㸱Gifi㤼㸲 was built under R version 4.0.5
knotslin <- knotsGifi(stpg, type = "E")
prlin <- princals(stpg, knots = knotslin, degrees = 1)
prlin
Call:
princals(data = stpg, knots = knotslin, degrees = 1)

Loss value: 0.847 
Number of iterations: 25 

Eigenvalues: 2.608 1.371 

#Here it shows the loss value, the number of iterations the ALS algorithem needed to converge, and the two eigenvalues. It is important to note that using princals, it is the same as using a PCA, since it uses a linear method.

prord <- princals(stpg)
prord
Call:
princals(data = stpg)

Loss value: 0.841 
Number of iterations: 36 

Eigenvalues: 2.635 1.492 

#not much is gained, based on the loss value. It may be fine to treat using a metric scale level. It is fine to assume metric analysis.

plot(prord, plot.type = "transplot",
var.subset = c(1:2, 8:9), lwd = 2)

head(round(prord$objectscores, 3), 3)
      D1     D2
1 -0.954 -1.041
2 -0.574  0.524
3  0.814  1.044
head(stpg[,1:5])
head(round(prord$scoremat[,1:5], 3))
  st.ASTI2 st.ASTI4 st.ASTI7 st.ASTI13 st.ASTI16
1   -0.005   -0.027   -0.011    -0.006    -0.027
2   -0.005   -0.002   -0.011    -0.006    -0.006
3    0.015    0.014    0.028    -0.006     0.012
4   -0.005   -0.027   -0.011    -0.006    -0.027
5   -0.029   -0.027   -0.030    -0.006    -0.027
6    0.015   -0.027   -0.030     0.000    -0.006

#Here you can see that the orginal category scores have been replaced by new scores.

plot(prord, main = "ASTI Loadings Plot")

plot(prord, plot.type = "screeplot")

si <- rowSums(ASTI[ ,c(10, 19, 20, 21)])
pm <- rowSums(ASTI[ ,c(1, 5, 9, 22)])
na <- rowSums(ASTI[ ,c(3, 6, 8, 12)])
asti2 <- data.frame(stpg, si, pm, na)
knotsord <- knotsGifi(asti2[,1:13], type = "D")
knotslin <- knotsGifi(asti2[,14:16], type = "E")
knotslist <- c(knotsord, knotslin)
prordlin <- princals(asti2, knots = knotslist, degrees = 1,
ndim = 3)
colvec <- c(rep("gray", 13), rep("coral", 3))
plot(prordlin, col.loadings = colvec, plot.dim = c(1, 2))

#You can use Homals when you have a variables with MANY catergories (e.g. 10 or more). Here a monotone spline transformation may be appropriate.

library("MPsychoR")
library("Gifi")
data("WilPat")
WP6 <- WilPat[,c(32, 38, 41, 44, 45, 46, 47)]
homwp <- homals(WP6)
homwp
Call:
homals(data = WP6)

Loss value: 0.663 
Number of iterations: 22 

Eigenvalues: 2.901 1.818 
plot(homwp)

#Here you can see dimension 1 discriminates between 0 and 1, where 0 is disapproves and 1 approves. The counties are plotted in pink. India disapproves with most that USA approves. Hungary sits mostly in the “I don’t know” response, which is dimension 2.

WPmixed <- WilPat[,c(32, 38, 41, 44, 45, 46, 47:51)]
WPmixed$LibCons <- cut(WPmixed$LibCons, breaks = c(0,2,4,6,9), labels = 1:4)
WPmixed <- na.omit(WPmixed)
itknots <- knotsGifi(WPmixed[,1:6], "D") ## item knots (data)
cknots <- knotsGifi(WPmixed[,7], "D") ## country knots (data)
lcknots <- knotsGifi(WPmixed[,8], "D") ## lib-cons knots (data)
lrknots <- knotsGifi(WPmixed[,9], "Q", n = 2) ## left-right (terciles)
genknots <- knotsGifi(WPmixed[,10], "D") ## gender knots (data)
ageknots <- knotsGifi(WPmixed[,11], "E") ## age knots (empty)
knotlist <- c(itknots, cknots, lcknots, lrknots, genknots, ageknots)

#Fixed Homal Models, which are ordinal which are not? True/False, for degrees 1 = linear, 2 = quadratic, -1 is figure it out on its own

ordvec <- c(rep(FALSE, 6), FALSE, TRUE, TRUE, FALSE, TRUE)
degvec <- c(rep(-1, 7), 1, 2, -1, 1)
hommix <- homals(WPmixed, knots = knotlist, ordinal = ordvec,
degrees = degvec)
plot(hommix, "transplot", var.subset = 6:11)

#This shows the transformation plots. The black lines are transformations on the first dimension, the red are on the second.

prinwp1 <- princals(WP6, ordinal = FALSE)

#ploting the loadings

plot(x=prinwp1, main = "Nominal Princals Loadings")

#Relax the linear restriction using copies

prinwp2 <- princals(WP6, ordinal = FALSE, copies = 2)
prinwp2
Call:
princals(data = WP6, ordinal = FALSE, copies = 2)

Loss value: 0.663 
Number of iterations: 22 

Eigenvalues: 2.901 1.818 

#specifiying how many times to copy

LS0tDQp0aXRsZTogIk1vZHVsZSA0OkdpZmkgTWVodG9kcyBvZiBTY2FsaW5nIg0KYXV0aG9yOiBKYWtlIFJleW5vbGRzLCBGYWxsIDIwMjEgLSBJbmRlcGVuZGVudCBTdHVkeQ0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7cn0NCmxpYnJhcnkoIk1Qc3ljaG9SIikNCmRhdGEoIkFTVEkiKQ0Kc3QgPC0gQVNUSVsgLGMoMiw0LDcsMTMsMTYsMjQsMjUpXQ0KcGcgPC0gQVNUSVsgLGMoMTEsMTQsMTUsMTcsMTgsMjMpXQ0Kc3RwZyA8LSBkYXRhLmZyYW1lKHN0ID0gc3QsIHBnID0gcGcpDQpwY2FmaXQgPC0gcHJjb21wKHN0cGcsIHNjYWxlID0gVFJVRSkNCmxpYnJhcnkoIkdpZmkiKQ0Ka25vdHNsaW4gPC0ga25vdHNHaWZpKHN0cGcsIHR5cGUgPSAiRSIpDQpwcmxpbiA8LSBwcmluY2FscyhzdHBnLCBrbm90cyA9IGtub3RzbGluLCBkZWdyZWVzID0gMSkNCnBybGluDQpgYGANCiNIZXJlIGl0IHNob3dzIHRoZSBsb3NzIHZhbHVlLCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhlIEFMUyBhbGdvcml0aGVtIG5lZWRlZCB0byBjb252ZXJnZSwgYW5kIHRoZSB0d28gZWlnZW52YWx1ZXMuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdXNpbmcgcHJpbmNhbHMsIGl0IGlzIHRoZSBzYW1lIGFzIHVzaW5nIGEgUENBLCBzaW5jZSBpdCB1c2VzIGEgbGluZWFyIG1ldGhvZC4gDQoNCmBgYHtyfQ0KcHJvcmQgPC0gcHJpbmNhbHMoc3RwZykNCnByb3JkDQpgYGANCiNub3QgbXVjaCBpcyBnYWluZWQsIGJhc2VkIG9uIHRoZSBsb3NzIHZhbHVlLiBJdCBtYXkgYmUgZmluZSB0byB0cmVhdCB1c2luZyBhIG1ldHJpYyBzY2FsZSBsZXZlbC4gSXQgaXMgZmluZSB0byBhc3N1bWUgbWV0cmljIGFuYWx5c2lzLg0KDQpgYGB7cn0NCnBsb3QocHJvcmQsIHBsb3QudHlwZSA9ICJ0cmFuc3Bsb3QiLA0KdmFyLnN1YnNldCA9IGMoMToyLCA4OjkpLCBsd2QgPSAyKQ0KYGBgDQpgYGB7cn0NCmhlYWQocm91bmQocHJvcmQkb2JqZWN0c2NvcmVzLCAzKSwgMykNCmBgYA0KYGBge3J9DQpoZWFkKHN0cGdbLDE6NV0pDQpgYGANCg0KYGBge3J9DQpoZWFkKHJvdW5kKHByb3JkJHNjb3JlbWF0WywxOjVdLCAzKSkNCmBgYA0KI0hlcmUgeW91IGNhbiBzZWUgdGhhdCB0aGUgb3JnaW5hbCBjYXRlZ29yeSBzY29yZXMgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IG5ldyBzY29yZXMuIA0KDQpgYGB7cn0NCnBsb3QocHJvcmQsIG1haW4gPSAiQVNUSSBMb2FkaW5ncyBQbG90IikNCmBgYA0KDQoNCmBgYHtyfQ0KcGxvdChwcm9yZCwgcGxvdC50eXBlID0gInNjcmVlcGxvdCIpDQpgYGANCg0KDQpgYGB7cn0NCnNpIDwtIHJvd1N1bXMoQVNUSVsgLGMoMTAsIDE5LCAyMCwgMjEpXSkNCnBtIDwtIHJvd1N1bXMoQVNUSVsgLGMoMSwgNSwgOSwgMjIpXSkNCm5hIDwtIHJvd1N1bXMoQVNUSVsgLGMoMywgNiwgOCwgMTIpXSkNCmFzdGkyIDwtIGRhdGEuZnJhbWUoc3RwZywgc2ksIHBtLCBuYSkNCmBgYA0KDQoNCmBgYHtyfQ0Ka25vdHNvcmQgPC0ga25vdHNHaWZpKGFzdGkyWywxOjEzXSwgdHlwZSA9ICJEIikNCmtub3RzbGluIDwtIGtub3RzR2lmaShhc3RpMlssMTQ6MTZdLCB0eXBlID0gIkUiKQ0Ka25vdHNsaXN0IDwtIGMoa25vdHNvcmQsIGtub3RzbGluKQ0KYGBgDQoNCmBgYHtyfQ0KcHJvcmRsaW4gPC0gcHJpbmNhbHMoYXN0aTIsIGtub3RzID0ga25vdHNsaXN0LCBkZWdyZWVzID0gMSwNCm5kaW0gPSAzKQ0KY29sdmVjIDwtIGMocmVwKCJncmF5IiwgMTMpLCByZXAoImNvcmFsIiwgMykpDQpwbG90KHByb3JkbGluLCBjb2wubG9hZGluZ3MgPSBjb2x2ZWMsIHBsb3QuZGltID0gYygxLCAyKSkNCmBgYA0KDQoNCiNZb3UgY2FuIHVzZSBIb21hbHMgd2hlbiB5b3UgaGF2ZSBhIHZhcmlhYmxlcyB3aXRoIE1BTlkgY2F0ZXJnb3JpZXMgKGUuZy4gMTAgb3IgbW9yZSkuIEhlcmUgYSBtb25vdG9uZSBzcGxpbmUgdHJhbnNmb3JtYXRpb24gbWF5IGJlIGFwcHJvcHJpYXRlLiANCg0KYGBge3J9DQpsaWJyYXJ5KCJNUHN5Y2hvUiIpDQpsaWJyYXJ5KCJHaWZpIikNCmRhdGEoIldpbFBhdCIpDQpXUDYgPC0gV2lsUGF0WyxjKDMyLCAzOCwgNDEsIDQ0LCA0NSwgNDYsIDQ3KV0NCmBgYA0KDQoNCmBgYHtyfQ0KaG9td3AgPC0gaG9tYWxzKFdQNikNCmhvbXdwDQpgYGANCg0KDQpgYGB7cn0NCnBsb3QoaG9td3ApDQpgYGANCiNIZXJlIHlvdSBjYW4gc2VlIGRpbWVuc2lvbiAxIGRpc2NyaW1pbmF0ZXMgYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAwIGlzIGRpc2FwcHJvdmVzIGFuZCAxIGFwcHJvdmVzLiBUaGUgY291bnRpZXMgYXJlIHBsb3R0ZWQgaW4gcGluay4gSW5kaWEgZGlzYXBwcm92ZXMgd2l0aCBtb3N0IHRoYXQgVVNBIGFwcHJvdmVzLiBIdW5nYXJ5IHNpdHMgbW9zdGx5IGluIHRoZSAiSSBkb24ndCBrbm93IiByZXNwb25zZSwgd2hpY2ggaXMgZGltZW5zaW9uIDIuDQoNCmBgYHtyfQ0KV1BtaXhlZCA8LSBXaWxQYXRbLGMoMzIsIDM4LCA0MSwgNDQsIDQ1LCA0NiwgNDc6NTEpXQ0KV1BtaXhlZCRMaWJDb25zIDwtIGN1dChXUG1peGVkJExpYkNvbnMsIGJyZWFrcyA9IGMoMCwyLDQsNiw5KSwgbGFiZWxzID0gMTo0KQ0KV1BtaXhlZCA8LSBuYS5vbWl0KFdQbWl4ZWQpDQppdGtub3RzIDwtIGtub3RzR2lmaShXUG1peGVkWywxOjZdLCAiRCIpICMjIGl0ZW0ga25vdHMgKGRhdGEpDQpja25vdHMgPC0ga25vdHNHaWZpKFdQbWl4ZWRbLDddLCAiRCIpICMjIGNvdW50cnkga25vdHMgKGRhdGEpDQpsY2tub3RzIDwtIGtub3RzR2lmaShXUG1peGVkWyw4XSwgIkQiKSAjIyBsaWItY29ucyBrbm90cyAoZGF0YSkNCmxya25vdHMgPC0ga25vdHNHaWZpKFdQbWl4ZWRbLDldLCAiUSIsIG4gPSAyKSAjIyBsZWZ0LXJpZ2h0ICh0ZXJjaWxlcykNCmdlbmtub3RzIDwtIGtub3RzR2lmaShXUG1peGVkWywxMF0sICJEIikgIyMgZ2VuZGVyIGtub3RzIChkYXRhKQ0KYWdla25vdHMgPC0ga25vdHNHaWZpKFdQbWl4ZWRbLDExXSwgIkUiKSAjIyBhZ2Uga25vdHMgKGVtcHR5KQ0Ka25vdGxpc3QgPC0gYyhpdGtub3RzLCBja25vdHMsIGxja25vdHMsIGxya25vdHMsIGdlbmtub3RzLCBhZ2Vrbm90cykNCmBgYA0KDQojRml4ZWQgSG9tYWwgTW9kZWxzLCB3aGljaCBhcmUgb3JkaW5hbCB3aGljaCBhcmUgbm90PyBUcnVlL0ZhbHNlLCBmb3IgZGVncmVlcyAxID0gbGluZWFyLCAyID0gcXVhZHJhdGljLCAtMSBpcyBmaWd1cmUgaXQgb3V0IG9uIGl0cyBvd24NCg0KYGBge3J9DQpvcmR2ZWMgPC0gYyhyZXAoRkFMU0UsIDYpLCBGQUxTRSwgVFJVRSwgVFJVRSwgRkFMU0UsIFRSVUUpDQpkZWd2ZWMgPC0gYyhyZXAoLTEsIDcpLCAxLCAyLCAtMSwgMSkNCmBgYA0KDQpgYGB7cn0NCmhvbW1peCA8LSBob21hbHMoV1BtaXhlZCwga25vdHMgPSBrbm90bGlzdCwgb3JkaW5hbCA9IG9yZHZlYywNCmRlZ3JlZXMgPSBkZWd2ZWMpDQpwbG90KGhvbW1peCwgInRyYW5zcGxvdCIsIHZhci5zdWJzZXQgPSA2OjExKQ0KYGBgDQojVGhpcyBzaG93cyB0aGUgdHJhbnNmb3JtYXRpb24gcGxvdHMuIFRoZSBibGFjayBsaW5lcyBhcmUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZSByZWQgYXJlIG9uIHRoZSBzZWNvbmQuIA0KDQpgYGB7cn0NCnByaW53cDEgPC0gcHJpbmNhbHMoV1A2LCBvcmRpbmFsID0gRkFMU0UpDQpgYGANCg0KI3Bsb3RpbmcgdGhlIGxvYWRpbmdzDQpgYGB7cn0NCnBsb3QoeD1wcmlud3AxLCBtYWluID0gIk5vbWluYWwgUHJpbmNhbHMgTG9hZGluZ3MiKQ0KYGBgDQoNCg0KDQojUmVsYXggdGhlIGxpbmVhciByZXN0cmljdGlvbiB1c2luZyBjb3BpZXMgDQoNCmBgYHtyfQ0KcHJpbndwMiA8LSBwcmluY2FscyhXUDYsIG9yZGluYWwgPSBGQUxTRSwgY29waWVzID0gMikNCnByaW53cDINCmBgYA0KI3NwZWNpZml5aW5nIGhvdyBtYW55IHRpbWVzIHRvIGNvcHkNCg==