I guess they're simple enough, but I think you should use equations instead of case switch type things where possible. Granularity is great. Many of these need to be non-linear though, which you did to some extent.. Armor gets more powerful per point as it gets higher, so it should be less than linear (armor point spent ^ .9 * constant as an example). Speed is offset to 22, since that's what missile frigates are, so the equation is a bit more complex, but still fairly easy to get an exponential form. It should count as less beneficial as it goes up, and more penalizing as it goes down in linear increments, so maybe a doubleing or halving of speed is worth one ship point (I'm doing these forward calculating though, from points to stats as examples instead of the reverse like you are right now, but some simple algebra would net the inverse):
(2^(speed points spent) * 22)
at 0 (for 22 speed) this is
2^(0) * 22 = 1 * 22 = 22 speed
For one point it will get
2^1 * 22 = 2 * 22 = 44 speed
So you'll get a chart like:
Points Speed
-3 2.75
-2 5.5
-1 11
0 22
1 44
2 88
3 176
Range should probably be done similar to speed, unless you want to encourage things to be micro heavy or people to not use fast or slow ships. If you want it micro-heavy, count them linearly because with extreme micro even a few points bonus to range on a high speed ship is huge.
Speed + range can have a funky relationship though, so the faster things should probably tend to not have the longest ranges. The only thing I can think of violating this rule to a troublesome degree is raptors, but those only baaarely edge out frigates in range, the AI doesn't micro them, and AI guardians have more range than Raptors.
Armor points would NORMALLY multiply points in health, but since you're aiming for linear armor being hard crushed by linear high damage from certain counter ships, it is less of an issue, as long as you make sure the counter ships are numerous, focus on their targets only they can take out, and aren't taken out easily by the armored target in question. Right now fighters achieve this against equal mk bombers as an example. Mk1 fighters do not achieve this against mk 3+ bombers, but that is a minorish issue in my opinion. Raid ships currently violate this rule. They are extremely tough in the early game due to their armor, and nothing the humans start with my default that is mobile can go way over raid starship armor. Frigates damage just doesn't cut it against them.
Rate of fire would normally multiply damage and that's the end if this were a % damage reduction game, but since it is a linear damage reduction game, singular big shots tend to be favored to overcome armor. This one is tricky with linear armor because REALLY BIG shots are wasteful because of overdamage, but REALLY SMALL shots are completely negated by armor. See: cruisers blowing up infiltrators (huge damage waste each) and cruisers trying to blow up raid starships (damage to small overcome armor). It may have to be step functioned per ship based on whatever you want to consider "high" armor for that ship's targets to be to determine the point at which raw damage below that line is considered worth less penalty per additional point below, and what you want to consider "high" health or "high" damage for whatever the favored target type of the ship will be, above which point the damage would be worth less per point above, and linear between.
Each default ship hull type bonus damage amount should probably add a value of (number of bonus ships in the game/(constant between 1 and 2)) to the damage multiplier point value category, each ARS hull type should add 1 to it's relevant hull type category. Command grade should not appear as a damage multiplier type (or at least not have value because humans generally get no benefit from it really and thus assigning it value and balancing on that makes it less worthwhile to humans), turrets shouldn't appear as a damage multiplier type (or again at least not have value because it is AI only and has 0 value to the players).
These are all mostly example numbers since I am just donating text in my spare time. The point values assigned to generate values would in reality be much higher integers so they could be balanced across each other without huge floating points all over the place. I'm sure armor would have a much weaker than I specified function too.