Como evitar o termo log (0) na regressão


10

Eu tenho os seguintes vetores X e Y simples:

> X
[1] 1.000 0.063 0.031 0.012 0.005 0.000
> Y
[1] 1.000 1.000 1.000 0.961 0.884 0.000
> 
> plot(X,Y)

insira a descrição da imagem aqui

Quero fazer a regressão usando o log do X. Para evitar o log (0), tento colocar +1 ou +0,1 ou +0,00001 ou +0,000000000000001:

> summary(lm(Y~log(X)))
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  NA/NaN/Inf in 'x'
> summary(lm(Y~log(1+X)))

Call:
lm(formula = Y ~ log(1 + X))

Residuals:
       1        2        3        4        5        6 
-0.03429  0.22189  0.23428  0.20282  0.12864 -0.75334 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   0.7533     0.1976   3.812   0.0189 *
log(1 + X)    0.4053     0.6949   0.583   0.5910  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.4273 on 4 degrees of freedom
Multiple R-squared:  0.07838,   Adjusted R-squared:  -0.152 
F-statistic: 0.3402 on 1 and 4 DF,  p-value: 0.591

> summary(lm(Y~log(0.1+X)))

Call:
lm(formula = Y ~ log(0.1 + X))

Residuals:
       1        2        3        4        5        6 
-0.08099  0.20207  0.23447  0.21870  0.15126 -0.72550 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)    1.0669     0.3941   2.707   0.0537 .
log(0.1 + X)   0.1482     0.2030   0.730   0.5058  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.4182 on 4 degrees of freedom
Multiple R-squared:  0.1176,    Adjusted R-squared:  -0.103 
F-statistic: 0.5331 on 1 and 4 DF,  p-value: 0.5058

> summary(lm(Y~log(0.00001+X)))

Call:
lm(formula = Y ~ log(1e-05 + X))

Residuals:
       1        2        3        4        5        6 
-0.24072  0.02087  0.08796  0.13872  0.14445 -0.15128 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     1.24072    0.12046  10.300 0.000501 ***
log(1e-05 + X)  0.09463    0.02087   4.534 0.010547 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.1797 on 4 degrees of freedom
Multiple R-squared:  0.8371,    Adjusted R-squared:  0.7964 
F-statistic: 20.56 on 1 and 4 DF,  p-value: 0.01055

> 
> summary(lm(Y~log(0.000000000000001+X)))

Call:
lm(formula = Y ~ log(1e-15 + X))

Residuals:
        1         2         3         4         5         6 
-0.065506  0.019244  0.040983  0.031077 -0.019085 -0.006714 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     1.06551    0.02202   48.38 1.09e-06 ***
log(1e-15 + X)  0.03066    0.00152   20.17 3.57e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.04392 on 4 degrees of freedom
Multiple R-squared:  0.9903,    Adjusted R-squared:  0.9878 
F-statistic: 406.9 on 1 and 4 DF,  p-value: 3.565e-05

A saída é diferente em todos os casos. Qual é o valor correto a ser colocado para evitar log (0) na regressão? Qual é o método correto para essas situações.

Edit: meu principal objetivo é melhorar a previsão do modelo de regressão adicionando termos de log, ou seja: lm (Y ~ X + log (X))


4
Nenhum deles é , eles são todos ; portanto, qualquer noção de 'correção' não faz sentido. Nenhum deles está 'correto' para . Para escolher entre eles, você teria que dizer mais sobre quais propriedades deseja e quais estão preparadas para desistir. O que você está realmente tentando alcançar? log ( x + c ) log ( x )log(x)log(x+c)log(x)
Glen_b -Reinstate Monica

Eu quero melhorar a previsão do modelo de regressão usando lm (Y ~ X + log (X)). Para isso, qual seria sua recomendação para evitar o log (0)?
Rnso

5
Você não pode ter o log (X) lá; você já estabeleceu isso. Então, o que você está realmente tentando alcançar? Como você não pode obter o log (0), o que você deseja obter da regressão? Por que você deseja log (X) lá? O que você pode tolerar em vez de ter o log (X) lá?
Glen_b -Reinstala Monica

3
Qual é a ciência aqui? Deve ser um guia para o que fazer.
Nick Cox

11
Além disso, não vejo nada lá que resolva os problemas que levanto (ou mais importante, o que Nick Cox levantou), nem mesmo algo que guie uma resposta para a pergunta aqui.
Glen_b -Reinstate Monica

Respostas:


8

Quanto menor for a constante que você adicionar, maior será a discrepância que você criará: insira a descrição da imagem aqui

Portanto, é difícil justificar qualquer constante aqui. Você pode considerar uma transformação que não tem problema com 0s, por exemplo, um polinômio de terceira ordem.


X + x ^ 2 + x ^ 3 é equivalente a log (x)? Por favor, veja meus comentários em outra resposta para saber por que estou tentando usar valores de log.
Rnso 19/05/19

2
Eles não são equivalentes, mas alternativas.
Maarten Buis

10

Por que você deseja plotar logaritmos? O que há de errado em plotar as variáveis ​​como elas são?

Um motivo para trabalhar com logs é quando uma distribuição gerada assumida é log-normal, por exemplo.

Outro seria que os números representam parâmetros de escala ou são usados ​​multiplicativamente, caso em que o espaço em que se encontram é naturalmente logarítmico (pelo mesmo motivo que o Jeffreys anterior a uma variável de escala é logarítmico).

Nenhum desses é o caso. Eu acho que a resposta certa aqui é não fazê-lo. Primeiro, crie um modelo de geração de dados e, em seguida, use seus dados de maneira consistente com isso.

Parece que o que você está tentando fazer é adicionar o maior número possível de funções das entradas, para obter um "ótimo ajuste". Por que você não adiciona nenhuma dessas funções: http://en.wikipedia.org/wiki/List_of_mathematical_functions ? Ah, você provavelmente acha que muitos deles são ridículos, como a função Ackermann. Por que eles são ridículos? Cada função da entrada que você adiciona é essencialmente sua hipótese de um relacionamento. É difícil para qualquer um de nós imaginar que é uma função da função totiente de Euler aplicada a . É por isso que sou contra ser uma função de . Parece-me igualmente ridículo, a menos que você me explique esta hipótese.x y log xyxylogx

Provavelmente, a única coisa que você obterá adicionando continuamente funções das entradas é um modelo com excesso de ajustes. Se você deseja um modelo que valide bem, precisa fazer boas suposições e ter dados suficientes para aprender um modelo. Quanto mais palpites você fizer, mais parâmetros terá, mais dados precisará.


Não quero plotar logs. Eu quero usar a variável X em regressão. Para obter o melhor ajuste, presumo que devemos incluir log e também polinômios. Para isso eu preciso de valores de log.
Rnso

@rnso: Então você está imaginando que o valor-alvo é um produto dessas entradas? É muito estranho o valor alvo estar relacionado às entradas multiplicativamente quando a entrada pode ser zero.
Neil G

Não é produto, mas soma. Eu estou tentando fórmula utilização: lm (Y ~ X + log (X))
rnso

11
@rnso: sim, mas adicionar esses termos é como dizer , e por que você acha que se pode ser zero? x ieyxiwixi
Neil G

11
você omite o termo do log. Você já tem o coeficiente do termo log: Not a Number
Caleth

3

É difícil dizer com tão poucos detalhes sobre seus dados e apenas seis observações, mas talvez o seu problema esteja na sua variável Y (limitada entre zero e uma) e não no seu X. Dê uma olhada na abordagem a seguir usando o parâmetro de dois função log-logistic do pacote drc :

X<-c(1.000, 0.063, 0.031, 0.012, 0.005, 0.000)
Y<-c(1.000, 1.000, 1.000, 0.961, 0.884, 0.000)

library(drc)
mod1<-drm(Y ~ X, fct=LL.2())
summary(mod1)

#Model fitted: Log-logistic (ED50 as parameter) with lower limit at 0 and upper limit at 1 (2 parms)
#
#Parameter estimates:
#  
#  Estimate  Std. Error     t-value p-value
#b:(Intercept) -1.5131e+00  1.4894e-01 -1.0159e+01  0.0005
#e:(Intercept)  1.3134e-03  1.8925e-04  6.9401e+00  0.0023
#
#Residual standard error:
#  
#  0.005071738 (4 degrees of freedom)  

plot(X,Y)
lines(seq(0, 1, 0.001), predict(mod1, data.frame(X=seq(0, 1, 0.001))))

insira a descrição da imagem aqui


1

Observando o gráfico de y vs x, a forma funcional parece ser y = 1 - exp (-alpha x), com um alfa muito alto. Essa é uma função próxima, mas não muito completa, e você precisará de um grande número de polinômios para ajustar esses dados (pense em termos de exp (x) = 1 + x + x ^ 2/2! +. + X ^ n / n! + ...). Reorganizando os termos, obtemos exp (-alpha x) = 1-y. Se você pegar logs agora, isso fornecerá -alpha x = log (1-y). Você pode definir uma nova variável z = log (1-y) e tentar encontrar o alfa que melhor se ajusta aos dados. Você ainda tem o problema de como lidar com y = 1. Não conheço o contexto do seu problema, mas minha impressão é que você teria que pensar em y aproximando-se assintoticamente de 1 quando x se aproxima de 1 e, mas y nunca chega a 1.

Pensando nisso um pouco mais, será que os dados são realmente de uma distribuição Weibull y = 1 - exp (-alpha x ^ beta). Reorganizando os termos, obtemos beta log (x) = log (-log (1-y)) - log (alpha) e podemos usar o OLS para obter alfa e beta. A questão de lidar com y = 1 permanece.


Obrigado. Boa análise.
rnso 9/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.