
u/Wagagastiz

What's going on with Celtic numerals?
Namely one (1):
Primitive Irish *oinas
Proto Brythonic *ʉn
Gaulish *oino*
Pictish *onno*
All from PC *oinos
What's going on here? Is the proto Brythonic just very late PB after the apocope that we see in PI occurred? Is this not clashing heavily with the (largely agreeable) Proto Insular Celtic? Not to mention clashing with the idea of Pictish as Brythonic, though obviously that's less surprising.
I'm aware of the idea that Primitive Irish represents a very archaic variant for formal purposes, but I wasn't of the belief that that's very widely accepted anymore, since 6th century syncope and apocope seem to be a widely spread phenomenon. Is our textbook Proto Brythonic just post 6th century? Dialectal northern english *yan*, presumably from something related to Cumbric if not Cumbric itself, seems to show some strong innovations as well.
Adjective ordering across multiple languages of Azerbaijan (inc. Georgian)
hermalausaz.substack.comWhy isn't my ordinal BayesMallow model working?
For reference, the data is from my adjective order experiment, investigating the order people tend to place adjectives in various languages (think in English, the tendency towards 'big red car' vs 'red big car'.
I have eight categories of data - size, age, colour, shape, condition, opinion, material, origin.
I'm trying to find the latent, underlying order that speakers are following from the sequences I asked them to order, which are of varying length. I think the varying lengths may be what's fucking it up, as if disproportionate weighting is given to ordering in short sequences of 2 rather than 4. It could also perhaps be that not all categories appear with the same regularity.
I can tell from the 'decoy' results (which is pretty much inverted Georgian, to serve as an indicator. If it's not mirroring Georgian, something is wrong) that it isn't turning out right.
I am not a good statistician and I think it shows. Can anyone see what I did wrong?
**Code:** (sorry for formatting)
library(readxl)
library(BayesMallows)
library(dplyr)
Read data
df <- read_excel("~/Downloads/AdjOrderExcel-2.xlsx")
Adjective codes
codes <- c(
"si", "ag", "op", "sh",
"con", "col", "or", "ma"
)
category_names <- c(
si = "Size",
ag = "Age",
op = "Opinion",
sh = "Shape",
con = "Condition",
col = "Color",
or = "Origin",
ma = "Material"
)
Convert Order column to numeric rankings
convert_order <- function(x){
match(strsplit(x, ",\s*")[[1]], codes)
}
results <- list()
Run Mallows model for each language
for(lang in unique(df$Language)){
cat("Running:", lang, "\n")
# Get partial rankings for this language
rankings <- df %>%
filter(Language == lang) %>%
pull(Order) %>%
lapply(convert_order)
# Pad partial rankings with NA
ranking_matrix <- t(
sapply(rankings, function(x){
c(x, rep(NA, length(codes) - length(x)))
})
)
# Create BayesMallows object
mallows_data <- setup_rank_data(
rankings = ranking_matrix
)
# Fit model
fit <- compute_mallows(
data = mallows_data,
compute_options = set_compute_options(
nmc = 5000,
burnin = 1000
)
)
# Extract posterior ranking
rho <- fit$rho
# Critical Fix: Map the "Item X" label directly to the correct index in 'codes'
ranking_table <- rho %>%
group_by(item) %>%
summarise(mean_rank = mean(value)) %>%
mutate(item_index = as.numeric(gsub("Item ", "", item))) %>%
arrange(mean_rank) # Sort from best rank (1) to worst rank (8)
# Extract the correctly ordered codes
ordered_codes <- codes[ranking_table$item_index]
# Save result
results[[lang]] <- data.frame(
Language = lang,
Rank = 1:length(codes),
Code = ordered_codes,
Category = unname(category_names[ordered_codes])
)
}
Combine languages
final_results <- bind_rows(results)
print(final_results)
write.csv(
final_results,
"BayesMallows_language_rankingssss.csv",
row.names = FALSE
)
From: Fionn Ó Dubhairle <fionndoorley1@gmail.com> Sent: Friday, July 31, 2026 10:11 PM To: Kariniemi, Valentine <valentine.kariniemi@helsinki.fi> Subject: Extralang
library(readxl)
library(tidyverse)
==========================================
1. Load Data & Configure Variables
==========================================
datat <- read_excel("~/Downloads/AdjOrderExcel-2.xlsx")
order_column <- "Order"
lang_column <- "Language"
code_dictionary <- c(
"si" = "Size",
"ag" = "Age",
"op" = "Opinion",
"sh" = "Shape",
"con" = "Condition",
"col" = "Color",
"or" = "Origin",
"ma" = "Material"
)
target_categories <- unname(code_dictionary)
Add sequence tracking keys
datat <- datat %>% mutate(row_id = row_number())
==========================================
2. Parse Raw Adjective Code Strings
==========================================
long_ranks <- datat %>%
select(row_id, !!sym(lang_column), !!sym(order_column)) %>%
filter(!is.na(!!sym(order_column))) %>%
separate_rows(!!sym(order_column), sep = ", ") %>%
rename(ShortCode = !!sym(order_column)) %>%
mutate(Category = code_dictionary[ShortCode]) %>%
filter(!is.na(Category)) %>%
group_by(row_id) %>%
mutate(Rank = row_number()) %>%
ungroup()
==========================================
3. Calculate Head-to-Head Outcomes
==========================================
pairwise_matches <- long_ranks %>%
rename(CatA = Category, RankA = Rank) %>%
inner_join(
long_ranks %>% rename(CatB = Category, RankB = Rank),
by = c("row_id", lang_column),
relationship = "many-to-many"
) %>%
filter(CatA != CatB) %>%
group_by(!!sym(lang_column), CatA, CatB) %>%
summarise(
WinsA = sum(RankA < RankB),
Total = n(),
.groups = "drop"
) %>%
mutate(WinRate = WinsA / Total)
==========================================
4. Generate the Summary Grid DataFrame
==========================================
master_summary <- pairwise_matches %>%
group_by(!!sym(lang_column), CatA) %>%
summarise(AvgWinRate = round(mean(WinRate, na.rm = TRUE) * 100, 1), .groups = "drop") %>%
rename(Category = CatA) %>%
pivot_wider(names_from = !!sym(lang_column), values_from = AvgWinRate)
final_table <- tibble(Category = target_categories) %>%
left_join(master_summary, by = "Category")
==========================================
5. Print the Matrix
==========================================
print("--- COALESCED WIN-RATE COMPARISON MATRIX ---")
print(final_table)
==========================================
6. NEW: Dynamically Generate Order Strings
==========================================
print("--- EXTRACTED LINGUISTIC PREFERENCE ORDERS ---")
Isolate columns that correspond to languages
lang_names <- setdiff(names(final_table), "Category")
for (lang in lang_names) {
# Sort categories dynamically from highest win score to lowest win score
ordered_df <- final_table %>%
select(Category, !!sym(lang)) %>%
filter(!is.na(!!sym(lang))) %>%
arrange(desc(!!sym(lang)))
# Format string items as "Category (Score)"
formatted_elements <- paste0(ordered_df$Category, " (", ordered_df[[lang]], ")")
final_chain <- paste(formatted_elements, collapse = " → ")
# Print cleanly formatted layout
cat("\n", "Language [", lang, "]:\n", final_chain, "\n", sep="")
}
From: Kariniemi, Valentine <valentine.kariniemi@helsinki.fi> Sent: Saturday, August 1, 2026 11:05 AM To: Fionn Ó Dubhairle <fionndoorley1@gmail.com> Subject: Re: Extralang
Hide quoted text
library(readxl)
library(BayesMallows)
library(dplyr)
Read data
df <- read_excel("~/Downloads/AdjOrderExcel-2.xlsx")
Adjective codes
codes <- c(
"si", "ag", "op", "sh",
"con", "col", "or", "ma"
)
category_names <- c(
si = "Size",
ag = "Age",
op = "Opinion",
sh = "Shape",
con = "Condition",
col = "Color",
or = "Origin",
ma = "Material"
)
Convert Order column to numeric rankings
convert_order <- function(x){
match(strsplit(x, ",\s*")[[1]], codes)
}
results <- list()
Run Mallows model for each language
for(lang in unique(df$Language)){
cat("Running:", lang, "\n")
# Get partial rankings for this language
rankings <- df %>%
filter(Language == lang) %>%
pull(Order) %>%
lapply(convert_order)
# Pad partial rankings with NA
ranking_matrix <- t(
sapply(rankings, function(x){
c(x, rep(NA, length(codes) - length(x)))
})
)
# Create BayesMallows object
mallows_data <- setup_rank_data(
rankings = ranking_matrix
)
# Fit model
fit <- compute_mallows(
data = mallows_data,
compute_options = set_compute_options(
nmc = 5000,
burnin = 1000
)
)
# Extract posterior ranking
rho <- fit$rho
# Critical Fix: Map the "Item X" label directly to the correct index in 'codes'
ranking_table <- rho %>%
group_by(item) %>%
summarise(mean_rank = mean(value)) %>%
mutate(item_index = as.numeric(gsub("Item ", "", item))) %>%
arrange(mean_rank) # Sort from best rank (1) to worst rank (8)
# Extract the correctly ordered codes
ordered_codes <- codes[ranking_table$item_index]
# Save result
results[[lang]] <- data.frame(
Language = lang,
Rank = 1:length(codes),
Code = ordered_codes,
Category = unname(category_names[ordered_codes])
)
}
Combine languages
final_results <- bind_rows(results)
print(final_results)
write.csv(
final_results,
"BayesMallows_language_rankingssss.csv",
row.names = FALSE
)
If Odysseus has a Luwian etymology, what implications does that hold for the background of the story?
Beekes (2010) gave a pre-Greek substrate etymology for words like *θάλασσα* (ocean) on the basis that sequences like -ss- could not be Greek morphological developments. The latter part has at least been widely accepted.
-nth- (as in *Korinthos*) and -s(s)- (as in *Odusseús*) sequences that previously signposted the pre-IE substrate vocabulary are now considered to be of Luwian origin, with words like *alassammis* (ocean) being given PIE derivations through Luwian sound shifts, later being loaned into Greek. That doesn't seem too far fetched, as Luwian maritime culture was advanced and believably influential.
My question is, how does this square with everything else? As someone who is not a traditional classicist, the setting of the Odyssey seems quite indelibly tied to Greek locations, culture and history. Would this need to be a sort of 'name alone' situation where everything except the titular hero's name is obligatorily Greek in its construction, making the etymology almost redundant, or could some things be convergent of Luwian and Greek culture?
Cheers
(Anglu) Samotigian – Dialect or sister language of Lithuanian?
open.substack.comIsle of Cats – a new proposal for an existing theory on the name of Shetland
Along with an overview of the proposals so far