How to compare row entries in a sparse table with lots of missing values? I have a dataset with ~1000 laptops and performance results across ~100 different benchmarks. Using the benchmark results, I want to give each laptop a single composite performance score, and rank the laptops according to it.
Now, the problem is, the table is very "sparse" – each laptop is tested against at most about ~50 benchmarks.
The benchmarks are weakly correlated – laptop performance in real-world tasks is difficult to model, and is balanced by lots of different components: CPU Single-core & Multi-core performance, number of hardware and software threads in a CPU, GPU, RAM & storage speed, software optimizations at the level of OS, graphics APIs, and even benchmarks themselves. Plotting a regression trendline I get an R^2 value of 0.3-0.6.
The values within 1 benchmark are linearly comparable with each other.
Let's simplify the dataset down to a dozen laptops with only 2 benchmark results:
+-------+------+
| Alpha | Beta |
+-------+------+
| 1673  | -    |
| 9858  | -    |
| -     | 588  |
| 1212  | 420  |
| 442   | -    |
| -     | 521  |
| 3612  | 425  |
| 6529  | 437  |
| 3179  | -    |
| 3474  | 440  |
| -     | 424  |
| 9779  | -    |
+-------+------+

How would I go about comparing the rows with each other, without dropping any rows or columns?
One solution I've came up with is to:

*

*Calculate the percentage ranking of each entry in its column:
$\frac{value-min}{max-min}$


*Do a weighed sum of each column's score


*Normalize the weights

I would treat this as a matrix-completion problem.  After your sparse matrix is completed (or "imputed"), you can just score by means over the benchmarks.
There is a good itroduction to matrix completion at Wikipedia, and your problem is very similar to the Netflix problem (cinema film ratings) used as an example there. I would start with the Alternating least squares minimization (discussed at the link above).  An interesting paper treating this (and more) is Matrix Completion and Low-Rank SVD via Fast Alternating
Least Squares.  An R implementation is in the CRAN package rsparse.
We can illustrate this with the dataset movielens100kincluded with rsparse:
library(rsparse)

res <- rsparse::soft_impute(movielens100k)

res now contains the completed matrix as an SVD-like object, so can be used directly as such, or multiplied out to get the completed matrix.  Let us look at the diagonal matrix of singular values:
 res$d
 [1] 1735.6704  583.3921  470.9729  382.8521  361.6902  281.2488  255.0091
 [8]  250.2438  222.5691  199.6807

