2011-09-06 39 views
17

Tôi đang cố gắng xóa NA s khỏi khung dữ liệu của mình bằng cách nội suy với na.approx() nhưng không thể xóa tất cả NA s.Nội suy giá trị NA trong khung dữ liệu với na.approx

Khung dữ liệu của tôi là 4096x4096 với 270,15 làm cờ cho giá trị không hợp lệ. Tôi cần dữ liệu để liên tục ở tất cả các điểm để nuôi một mô hình khí tượng. Hôm qua tôi đã hỏi và nhận được câu trả lời, về cách thay thế các giá trị trong một khung dữ liệu dựa trên một khung dữ liệu khác. Nhưng sau đó tôi đến na.approx() và sau đó quyết định thay thế các giá trị 270.15 bằng NA và thử na.approx() để nội suy dữ liệu. Nhưng câu hỏi đặt ra là tại sao na.approx() không thay thế tất cả các Quốc gia.

Đây là những gì tôi đang làm:

  • đọc file HDF ban đầu với hdf5load
  • tập hợp con các khung dữ liệu (4094x4096)
  • giá trị cờ thay thế với NA

    > sst4[sst4 == 270.15 ] = NA 
    
  • Kiểm tra cột đầu tiên (hoặc bất kỳ cột nào khác)

    > summary(sst4[,1]) 
    
    Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
    271.3 276.4 285.9 285.5 292.3 302.8 1345.0 
    
  • Run na.approx

    > sst4=na.approx(sst4,na.rm="FALSE") 
    
  • Kiểm tra đầu tiên cột

    > summary(sst4[,1]) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
    271.3 276.5 286.3 285.9 292.6 302.8 411.0 
    

Như bạn có thể thấy 411 NA của chưa được gỡ bỏ. Tại sao? Tất cả chúng có tương ứng với các giá trị cột hàng đầu/kết thúc không?

head(sst4[,1]) 
[1] NA NA NA NA NA NA 
tail(sst4[,1]) 
[1] NA NA NA NA NA NA 

Có cần thiết bởi na.approx để có giá trị hợp lệ trước và sau NA để nội suy không? Tôi có cần đặt bất kỳ tùy chọn na.approx nào khác không?

Thank you very much

Trả lời

12

Một nhỏ, tái sản xuất ví dụ:

library(zoo) 
set.seed(1) 
m <- matrix(runif(16, 0, 100), nrow = 4) 
missing_values <- sample(16, 7) 
m[missing_values] <- NA 
m 
     [,1]  [,2]  [,3]  [,4] 
[1,] 26.55087 20.16819 62.911404 68.70228 
[2,] 37.21239  NA 6.178627 38.41037 
[3,]  NA  NA  NA  NA 
[4,] 90.82078 66.07978  NA  NA 

na.approx(m) 
     [,1]  [,2]  [,3]  [,4] 
[1,] 26.55087 20.16819 62.911404 68.70228 
[2,] 37.21239 35.47206 6.178627 38.41037 
[3,] 64.01658 50.77592  NA  NA 
[4,] 90.82078 66.07978  NA  NA 

m[4, 4] <- 50 
na.approx(m) 
     [,1]  [,2]  [,3]  [,4] 
[1,] 26.55087 20.16819 62.911404 68.70228 
[2,] 37.21239 35.47206 6.178627 38.41037 
[3,] 64.01658 50.77592  NA 44.20519 
[4,] 90.82078 66.07978  NA 50.00000 

Yup, có vẻ như bạn làm cần các giá trị bắt đầu/kết thúc các cột được biết đến hoặc nội suy không hoạt động. Bạn có thể đoán giá trị cho ranh giới của mình không?

CHỈNH SỬA KHÁC: Vì vậy, theo mặc định, bạn cần biết giá trị bắt đầu và kết thúc của cột cần biết. Tuy nhiên, bạn có thể nhận được na.approx để luôn điền vào chỗ trống bằng cách đi qua rule = 2. Xem câu trả lời của Felix. Bạn cũng có thể sử dụng na.fill để cung cấp giá trị mặc định, theo nhận xét của Gabor.Cuối cùng, bạn có thể nội suy các điều kiện biên theo hai hướng (xem bên dưới) hoặc đoán các điều kiện biên.


EDIT: Suy nghĩ thêm. Vì na.approx chỉ nội suy trong các cột và dữ liệu của bạn là không gian, có lẽ nội suy trong các hàng cũng sẽ hữu ích. Sau đó, bạn có thể lấy trung bình.

na.approx không thành công khi toàn bộ cột là NA, vì vậy, chúng tôi tạo tập dữ liệu lớn hơn.

set.seed(1) 
m <- matrix(runif(64, 0, 100), nrow = 8) 
missing_values <- sample(64, 15) 
m[missing_values] <- NA 

Chạy na.approx cả hai cách.

by_col <- na.approx(m) 
by_row <- t(na.approx(t(m))) 

Tìm hiểu dự đoán tốt nhất.

default <- 50 
best_guess <- ifelse(is.na(by_row), 
    ifelse(
    is.na(by_col), 
    default,    #neither known 
    by_col    #only by_col known 
), 
    ifelse(
    is.na(by_col), 
    by_row,    #only by_row known 
    (by_row + by_col)/2 #both known 
) 
) 
+0

Cảm ơn Richie. Tôi sẽ cố gắng đoán các giá trị cho các ranh giới; khi phần mở rộng không gian của cơ sở dữ liệu sst của tôi lớn hơn nhiều so với miền mô hình đã gặp, tôi sẽ sử dụng tôi không đặc biệt lo lắng về các giá trị trên ranh giới. Những gì tôi thực sự cần là điền vào các giá trị NA trong khu vực trung tâm của khung dữ liệu. – pacomet

+0

Bất kỳ ai đã bỏ phiếu cho tôi, vui lòng để lại nhận xét giải thích những gì bạn không thích. Nếu bạn không cung cấp phản hồi thì tôi không thể cải thiện câu trả lời. –

+0

-1 không đúng sự thật mà bạn cần giá trị bắt đầu và kết thúc. Điểm kết thúc có thể được mở rộng như trong câu trả lời của Felix hoặc trong 'na.fill'. –

1

Tôi nghĩ bạn nên cố gắng thiết lập na.rm=TRUE

Từ các tài liệu

na.rm logic. NA có nên bị loại bỏ không?

http://www.oga-lab.net/RGM2/func.php?rd_id=zoo:na.approx

+0

Xin chào Henrik. Nếu tôi đặt na.rm = TRUE thì tôi nhận được khung dữ liệu 3818x4096 và tôi cần giữ lại tất cả các giá trị 4096x4096. – pacomet

+0

Hmm, làm thế nào để bỏ qua nội suy ưa thích và tạo một vòng lặp đơn giản khi thấy một bản sao NA giá trị không phải NA cuối cùng? – Henrik

+0

Tôi mới vào R và sẽ phải tìm cú pháp vòng lặp, tôi đang cố gắng quản lý bằng các lệnh cơ bản. Làm cách nào để giữ lại giá trị không phải NA cuối cùng? Điều gì xảy ra nếu giá trị đầu tiên trong cột là NA? Ngoài ra, tôi thích chuyển đổi suôn sẻ giữa các giá trị dữ liệu. Đây là các giá trị nhiệt độ bề mặt biển và các NA là các điểm trên mặt đất nơi mà mô hình đã đáp ứng cần các giá trị "thực tế" để tránh các vấn đề số khi giải các phương trình. Cảm ơn đề xuất của bạn. – pacomet

9

na.approx() theo approx() chức năng trong chỉ nội suy giá trị, chứ không phải ngoại suy họ, theo mặc định. Tuy nhiên, như được mô tả trong trang trợ giúp cho approx(), bạn có thể chỉ định rule = 2 để ngoại suy dưới dạng giá trị không đổi của cực đoan gần nhất. Theo dõi từ ví dụ của Richie Cotton:

na.approx(m, rule = 2) 
     [,1]  [,2]  [,3]  [,4] 
[1,] 26.55087 20.16819 62.911404 68.70228 
[2,] 37.21239 35.47206 6.178627 38.41037 
[3,] 64.01658 50.77592 6.178627 38.41037 
[4,] 90.82078 66.07978 6.178627 38.41037 

Tương tự, bạn có thể sử dụng "quan sát cuối cùng tiến lên" một cách rõ ràng.

na.locf(na.approx(m)) 
## "first observation carry backwards" too: 
na.locf(na.locf(na.approx(m)), fromLast = TRUE) 
+0

Cảm ơn câu trả lời của bạn. Nó hoạt động nhưng có lẽ không phải là tốt cho dữ liệu của tôi. Do dữ liệu là nhiệt độ bề mặt biển nên không thể ngoại suy như là giá trị không đổi trong trường hợp dữ liệu NA ở trên biển (mặc dù hầu hết các trường hợp NA đều ở trên các điểm đất), nơi chuyển tiếp suôn sẻ giữa các điểm lưới là những gì bạn thường thấy. – pacomet

+0

'na.approx (... rule = 2)' là không có tài liệu rõ ràng trên trang manpage! Nó được chôn trong tài liệu PDF 70 trang. – smci

Các vấn đề liên quan