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)
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))
r
regression
lognormal
rnso
fonte
fonte
Respostas:
Quanto menor for a constante que você adicionar, maior será a discrepância que você criará:
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.
fonte
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 xy x y logx
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á.
fonte
É 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 :
fonte
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.
fonte