Làm thế nào để chuyển đổi giá trị âm thành logarit?


12

Tôi muốn biết làm thế nào để chuyển đổi các giá trị âm thành Log(), vì tôi có dữ liệu không đồng nhất. Tôi đọc rằng nó hoạt động với công thức Log(x+1)nhưng điều này không hoạt động với cơ sở dữ liệu của tôi và tôi tiếp tục nhận được NaNs. Ví dụ: tôi nhận được thông báo Cảnh báo này (Tôi đã không đặt cơ sở dữ liệu hoàn chỉnh của mình vì tôi nghĩ với một trong những giá trị âm của mình là đủ để hiển thị một ví dụ):

> log(-1.27+1)
[1] NaN
Warning message:
In log(-1.27 + 1) : NaNs produced
> 

Cảm ơn trước

CẬP NHẬT:

Đây là một biểu đồ dữ liệu của tôi. Tôi đang làm việc với các phép đo hóa học thời gian theo thời gian, ví dụ, sự khác biệt giữa các biến như Ca và Zn là quá lớn, sau đó tôi cần một số loại tiêu chuẩn hóa dữ liệu, đó là lý do tại sao tôi đang thử nghiệm log()chức năng. nhập mô tả hình ảnh ở đây

Đây là dữ liệu thô của tôi


2
Logarit chỉ được xác định cho các số dương và thường được sử dụng làm phép biến đổi thống kê trên dữ liệu dương để mô hình sẽ duy trì tính tích cực này. Việc log(x+1)chuyển đổi sẽ chỉ được xác định cho x > -1, khi đó x + 1là tích cực. Thật tốt khi biết lý do của bạn muốn đăng nhập chuyển đổi dữ liệu của bạn.
Matthew Drury

3
Hãy cho chúng tôi biết thêm về dữ liệu, bao gồm phạm vi, giá trị trung bình, tần số của các giá trị âm, không và dương. Có thể là một mô hình tuyến tính tổng quát với liên kết nhật ký có ý nghĩa nhất đối với dữ liệu miễn là hợp lý khi nghĩ rằng phản hồi trung bình là dương. Có thể là bạn không nên biến đổi chút nào.
Nick Cox

6
Cảm ơn đã thêm chi tiết. Đối với dữ liệu đó 0 có nghĩa (bình đẳng!) Cần được tôn trọng, thực sự được bảo tồn . Vì lý do đó và các lý do khác, tôi sẽ sử dụng rễ khối. Trong thực tế, bạn sẽ cần một số biến thể trên sign(x) * (abs(x))^(1/3), các chi tiết tùy thuộc vào cú pháp phần mềm. Để biết thêm về căn bậc xem ví dụ stata-journal.com/sjpdf.html?articlenum=st0223 (xem đặc biệt. Pp.152-3) rễ Chúng tôi sử dụng khối để giúp hình dung của một biến phản ứng đó có thể là tích cực và tiêu cực trong thiên nhiên .com / thiên nhiên / tạp chí / v500 / n7464 / full / Sự
Nick Cox

8
Tại sao bạn không chuyển đổi các biến ban đầu thay vì sự khác biệt?
whuber

4
Bạn đã giải được bài toán. Tôi nghĩ rằng đề xuất của @ whuber hoặc khối lập phương sẽ dễ dàng hơn để làm việc với, đặc biệt nếu hằng số hoàn toàn theo kinh nghiệm hoặc khác nhau giữa các biến. Một quy tắc tốt để lựa chọn các phép biến đổi là chỉ sử dụng các phép biến đổi sẽ hoạt động với dữ liệu tương tự mà bạn có thể tưởng tượng. Do đó, "hoạt động" cho x > - 4 nhưng sẽ thất bại nếu đợt tiếp theo của bạn bị giới hạn bởi - 5 ..log(x+4)x>45
Nick Cox

Câu trả lời:


14

Vì logarit chỉ được xác định cho các số dương, bạn không thể lấy logarit của các giá trị âm. Tuy nhiên, nếu bạn đang nhắm đến việc có được phân phối tốt hơn cho dữ liệu của mình, bạn có thể áp dụng chuyển đổi sau.

Giả sử bạn đã sai lệch dữ liệu tiêu cực:

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

(1,1)

z <- (x - min(x)) / (max(x) - min(x)) * 2 - 1
z <- z[-min(z)]
z <- z[-max(z)]
min(z); max(z)

và cuối cùng áp dụng tiếp tuyến hyperbol ngược:

t <- atanh(z)
plot(density(t))

Bây giờ, dữ liệu của bạn trông phân phối bình thường. Điều này cũng được gọi là chuyển đổi Fisher.


9
atanh[(xmin(x))/(max(x)min(x))]

2
@NickCox Bạn hoàn toàn đúng. Có lẽ nếu OP thêm chi tiết về vấn đề của anh ta, chúng ta có thể tìm ra một giải pháp thay thế!
stochazesthai

Lập luận bên trong trong nhận xét đầu tiên của tôi không phải là những gì đang được chuyển đổi, nhưng tinh thần của nhận xét của tôi là tôi nghĩ không bị ảnh hưởng.
Nick Cox

Kính gửi @stochazesthai cảm ơn bạn đã giải thích chi tiết, nhưng tôi không thể áp dụng mã của bạn cho dữ liệu của tôi. Tôi đã cập nhật câu hỏi của tôi với một liên kết của dữ liệu thô của tôi vào cuối.
Darwin PC

Các báo cáo z <- z[-max(z)]z <- z[-min(z)]thu nhỏ không phù hợp zxuống một giá trị duy nhất. Ngoài ra hàm tổng quát atanh(((x - min(x)) / (max(x) - min(x))))tạo ra Infcác giá trị tối thiểu và tối đa của x.
Max Ghenis

-1

Để chuyển đổi nó thành thang đo log, trước tiên hãy tìm nhật ký của số dương sau đó nhân nó với dấu của nó, đoạn mã sau sẽ làm điều đó.

transform_to_log_scale <- function(x){
    if(x==0){
        y <- 1
    } else {
        y <- (sign(x)) * (log(abs(x)))
    }
        y 
    }

Sử dụng ví dụ trên, chúng ta có thể vẽ phân phối sai lệch sau

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

nhập mô tả hình ảnh ở đây

Sau khi sử dụng chức năng biến đổi như sau, chúng ta nhận được một bản phân phối trông 'bình thường' hơn

plot(density(sapply(x,FUN=transform_logs_scale)))

nhập mô tả hình ảnh ở đây


3
(1) Hầu hết các ngôn ngữ lập trình ( Rbao gồm) thực hiện signum chức năng (trong đó lợi nhuận -1 đối với số âm, 1 cho các số dương và 0 cho zero). Sử dụng nó sẽ được biểu cảm hơn và nhanh hơn. (2) Đề xuất của bạn là một đề xuất kém để phân tích dữ liệu như những gì được minh họa, bởi vì nó có sự gián đoạn rất lớn ở mức 0!
whuber

cảm ơn vì đã đăng nhập, tôi không biết về nó, tự hỏi làm thế nào nó được thực hiện
yosemite_k

3
y <- 1x=0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.