Eu tenho um conjunto de dados no qual estou tentando fazer regressão e falhando.
A situação:
- Milhares de operadores de robôs de batalha estão travando batalhas entre si usando robôs de batalha.
- Alguns robôs de batalha são fortes e poderosos, e outros são fracos; os fortes vencem com mais frequência e causam mais dano.
- Os operadores de robôs variam em habilidade, com os mais qualificados ganhando com mais frequência e causando mais danos
- Temos algumas informações resumidas sobre os resultados de suas batalhas, mas nem todos os detalhes.
- Sabemos quais robôs de batalha eles usaram em suas batalhas e quantas vezes (incluindo quantas dessas batalhas venceram) e sabemos o dano total que causaram (de dois tipos, danoA e danoB) no total
- Alguns robôs são melhores em infligir danoA, enquanto outros danificamB
- Para operadores de robôs de batalha desconhecidos baseados apenas em quais robôs eles usaram em batalhas (e quantas vezes), gostaríamos de estimar quanto dano de cada tipo eles alcançariam e qual% de batalhas eles provavelmente venceram
Por exemplo:
- John usou o Robô A por 4 batalhas e o Robô B por 2 batalhas, e causou 240 unidades no valor de DamageA
- James usou o Robô A em 1 batalha e o Robô B em 10 batalhas, e causou 1010 unidades no valor de DamageA
Portanto, posso estimar que o Robô A provavelmente causa 10 unidades de Dano A por batalha, enquanto o Robô B causa 100 unidades de Dano A por batalha e, portanto, se for solicitado a estimar o Dano A causado por Matthew, que jogou apenas um dos dois robôs por 2 batalhas cada, serão estimadas em 220 == (10 * 2 + 100 * 2).
Infelizmente, os dados reais não são tão limpos e diretos, provavelmente porque:
- Há uma variação significativa devido à habilidade do operador do robô, por exemplo, um bom operador pode causar 20 unidades de dano no Robô A, enquanto um mau apenas 5 unidades.
- Há alguma variação aleatória devido aos oponentes sorteados no caso de uma amostra pequena (por exemplo, alguém atrai um oponente forte e perde apesar de ter um robô melhor do que o oponente), embora, eventualmente, ele se iguale
- Pode haver algum pequeno viés de seleção, pois os melhores operadores de robôs conseguem escolher os melhores para entrar em batalha com mais frequência
O conjunto de dados reais está disponível aqui (630k entradas de resultados conhecidos do operador de batalha):
O conjunto de dados está organizado da seguinte forma, com uma entrada de operador de robô por linha:
- Coluna 1 sem rótulo - ID do operador
- batalhas - total de batalhas em que este operador participou
- vitórias - batalhas totais que esse operador venceu
- derrotas - batalhas totais que esse operador perdeu
- damageA - total de pontos A de dano infligido
- damageB - total de pontos B de dano infligidos
- 130 pares de colunas da seguinte maneira:
- battle_ [robotID] - batalhas usando o robot [robotID]
- victories_ [robotID] - vitórias obtidas usando o robot [robotID]
O que eu fiz até agora:
- Tentei alguns modelos lineares usando o
biglm
pacote R , que cria uma fórmuladamageA ~ 0 + battles_1501 + battles_4201 + ...
para tentar obter os valores "esperados" ajustados para cada um dos robôs. - O mesmo, mas remover a interceptação de origem forçada ao não incluir
0 +
na fórmula - Idem, mas também incluiu as
victories_[robotID]
variáveis independentes - O mesmo de antes, mas apenas selecionando os operadores de robôs cujos números de vitória estão próximos dos números de derrota
- Um modelo de regressão linear para
damageA ~ 0 + battles_1501 + battles_non_1501
ondebattles_non_1501
estão todas as batalhas em robôs que não sejam o modelo 1501. Em seguida, é repetido para todos os outros tipos de robôs.
Fiz verificações de sanidade olhando os valores previstos de dano A e dano B, bem como comparando a proporção de vitórias / batalhas com a proporção real de vitórias / batalhas que podemos calcular com precisão para cada um dos robôs.
Em todos os casos, embora os resultados não estivessem completamente desligados, eles estavam suficientemente desligados para ver que o modelo não está funcionando bem. Por exemplo, alguns robôs obtiveram números de danos negativos, o que realmente não deveria acontecer, pois você não pode causar danos negativos em uma batalha.
No caso em que eu também usei os victories_[robotID]
valores conhecidos na fórmula, muitos dos battle_[robotID]
coeficientes acabaram sendo números negativos um tanto grandes, então tentei estimar o operador "médio", battle_[robotID] + victories_[robotID] / 2
mas isso também não deu resultados razoáveis.
Estou um pouco sem ideias agora.
lme
invés do meu biglm
, mas obviamente preciso ler muito mais sobre isso para entender exatamente o que fornecer como parâmetros para ele.