Nội suy dữ liệu cúm bảo tồn trung bình hàng tuần


13

Biên tập

Tôi đã tìm thấy một bài báo mô tả chính xác thủ tục tôi cần. Sự khác biệt duy nhất là giấy nội suy dữ liệu trung bình hàng tháng thành hàng ngày, trong khi vẫn bảo tồn các phương tiện hàng tháng. Tôi gặp khó khăn để thực hiện các phương pháp trong R. Bất kỳ gợi ý được đánh giá cao.

Nguyên

Đối với mỗi tuần, tôi có dữ liệu đếm sau (một giá trị mỗi tuần):

  • Số lượng tư vấn của bác sĩ
  • Số ca mắc cúm

Mục tiêu của tôi là để có được dữ liệu hàng ngày bằng cách nội suy (tôi nghĩ về các spline tuyến tính hoặc cắt ngắn). Điều quan trọng là tôi muốn bảo tồn giá trị trung bình hàng tuần, tức là giá trị trung bình của dữ liệu được nội suy hàng ngày phải bằng giá trị được ghi trong tuần này. Ngoài ra, việc nội suy phải trơn tru. Một vấn đề có thể phát sinh là một tuần nhất định có ít hơn 7 ngày (ví dụ: vào đầu hoặc cuối năm).

Tôi sẽ biết ơn lời khuyên về vấn đề này.

Cảm ơn rất nhiều.

Đây là bộ dữ liệu mẫu cho năm 1995 (đã cập nhật ):

structure(list(daily.ts = structure(c(9131, 9132, 9133, 9134, 
9135, 9136, 9137, 9138, 9139, 9140, 9141, 9142, 9143, 9144, 9145, 
9146, 9147, 9148, 9149, 9150, 9151, 9152, 9153, 9154, 9155, 9156, 
9157, 9158, 9159, 9160, 9161, 9162, 9163, 9164, 9165, 9166, 9167, 
9168, 9169, 9170, 9171, 9172, 9173, 9174, 9175, 9176, 9177, 9178, 
9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 
9190, 9191, 9192, 9193, 9194, 9195, 9196, 9197, 9198, 9199, 9200, 
9201, 9202, 9203, 9204, 9205, 9206, 9207, 9208, 9209, 9210, 9211, 
9212, 9213, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 
9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 
9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, 9244, 
9245, 9246, 9247, 9248, 9249, 9250, 9251, 9252, 9253, 9254, 9255, 
9256, 9257, 9258, 9259, 9260, 9261, 9262, 9263, 9264, 9265, 9266, 
9267, 9268, 9269, 9270, 9271, 9272, 9273, 9274, 9275, 9276, 9277, 
9278, 9279, 9280, 9281, 9282, 9283, 9284, 9285, 9286, 9287, 9288, 
9289, 9290, 9291, 9292, 9293, 9294, 9295, 9296, 9297, 9298, 9299, 
9300, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 
9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 
9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 9332, 
9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 
9344, 9345, 9346, 9347, 9348, 9349, 9350, 9351, 9352, 9353, 9354, 
9355, 9356, 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 
9366, 9367, 9368, 9369, 9370, 9371, 9372, 9373, 9374, 9375, 9376, 
9377, 9378, 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 
9388, 9389, 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9397, 9398, 
9399, 9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 
9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 
9421, 9422, 9423, 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 
9432, 9433, 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 
9443, 9444, 9445, 9446, 9447, 9448, 9449, 9450, 9451, 9452, 9453, 
9454, 9455, 9456, 9457, 9458, 9459, 9460, 9461, 9462, 9463, 9464, 
9465, 9466, 9467, 9468, 9469, 9470, 9471, 9472, 9473, 9474, 9475, 
9476, 9477, 9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 
9487, 9488, 9489, 9490, 9491, 9492, 9493, 9494, 9495), class = "Date"), 
    wdayno = c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 
    1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 
    2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 
    3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 
    4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 
    1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 
    2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 
    3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 
    4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 
    1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 
    2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 
    3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 
    4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L), month = c(1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
    6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
    9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
    10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
    11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
    12, 12, 12, 12), year = c(1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995), yearday = 0:364, 
    no.influ.cases = c(NA, NA, NA, 168L, NA, NA, NA, NA, NA, 
    NA, 199L, NA, NA, NA, NA, NA, NA, 214L, NA, NA, NA, NA, NA, 
    NA, 230L, NA, NA, NA, NA, NA, NA, 267L, NA, NA, NA, NA, NA, 
    NA, 373L, NA, NA, NA, NA, NA, NA, 387L, NA, NA, NA, NA, NA, 
    NA, 443L, NA, NA, NA, NA, NA, NA, 579L, NA, NA, NA, NA, NA, 
    NA, 821L, NA, NA, NA, NA, NA, NA, 1229L, NA, NA, NA, NA, 
    NA, NA, 1014L, NA, NA, NA, NA, NA, NA, 831L, NA, NA, NA, 
    NA, NA, NA, 648L, NA, NA, NA, NA, NA, NA, 257L, NA, NA, NA, 
    NA, NA, NA, 203L, NA, NA, NA, NA, NA, NA, 137L, NA, NA, NA, 
    NA, NA, NA, 78L, NA, NA, NA, NA, NA, NA, 82L, NA, NA, NA, 
    NA, NA, NA, 69L, NA, NA, NA, NA, NA, NA, 45L, NA, NA, NA, 
    NA, NA, NA, 51L, NA, NA, NA, NA, NA, NA, 45L, NA, NA, NA, 
    NA, NA, NA, 63L, NA, NA, NA, NA, NA, NA, 55L, NA, NA, NA, 
    NA, NA, NA, 54L, NA, NA, NA, NA, NA, NA, 52L, NA, NA, NA, 
    NA, NA, NA, 27L, NA, NA, NA, NA, NA, NA, 24L, NA, NA, NA, 
    NA, NA, NA, 12L, NA, NA, NA, NA, NA, NA, 10L, NA, NA, NA, 
    NA, NA, NA, 22L, NA, NA, NA, NA, NA, NA, 42L, NA, NA, NA, 
    NA, NA, NA, 32L, NA, NA, NA, NA, NA, NA, 52L, NA, NA, NA, 
    NA, NA, NA, 82L, NA, NA, NA, NA, NA, NA, 95L, NA, NA, NA, 
    NA, NA, NA, 91L, NA, NA, NA, NA, NA, NA, 104L, NA, NA, NA, 
    NA, NA, NA, 143L, NA, NA, NA, NA, NA, NA, 114L, NA, NA, NA, 
    NA, NA, NA, 100L, NA, NA, NA, NA, NA, NA, 83L, NA, NA, NA, 
    NA, NA, NA, 113L, NA, NA, NA, NA, NA, NA, 145L, NA, NA, NA, 
    NA, NA, NA, 175L, NA, NA, NA, NA, NA, NA, 222L, NA, NA, NA, 
    NA, NA, NA, 258L, NA, NA, NA, NA, NA, NA, 384L, NA, NA, NA, 
    NA, NA, NA, 755L, NA, NA, NA, NA, NA, NA, 976L, NA, NA, NA, 
    NA, NA, NA, 879L, NA, NA, NA, NA), no.consultations = c(NA, 
    NA, NA, 15093L, NA, NA, NA, NA, NA, NA, 20336L, NA, NA, NA, 
    NA, NA, NA, 20777L, NA, NA, NA, NA, NA, NA, 21108L, NA, NA, 
    NA, NA, NA, NA, 20967L, NA, NA, NA, NA, NA, NA, 20753L, NA, 
    NA, NA, NA, NA, NA, 18782L, NA, NA, NA, NA, NA, NA, 19778L, 
    NA, NA, NA, NA, NA, NA, 19223L, NA, NA, NA, NA, NA, NA, 21188L, 
    NA, NA, NA, NA, NA, NA, 22172L, NA, NA, NA, NA, NA, NA, 21965L, 
    NA, NA, NA, NA, NA, NA, 21768L, NA, NA, NA, NA, NA, NA, 21277L, 
    NA, NA, NA, NA, NA, NA, 16383L, NA, NA, NA, NA, NA, NA, 15337L, 
    NA, NA, NA, NA, NA, NA, 19179L, NA, NA, NA, NA, NA, NA, 18705L, 
    NA, NA, NA, NA, NA, NA, 19623L, NA, NA, NA, NA, NA, NA, 19363L, 
    NA, NA, NA, NA, NA, NA, 16257L, NA, NA, NA, NA, NA, NA, 19219L, 
    NA, NA, NA, NA, NA, NA, 17048L, NA, NA, NA, NA, NA, NA, 19231L, 
    NA, NA, NA, NA, NA, NA, 20023L, NA, NA, NA, NA, NA, NA, 19331L, 
    NA, NA, NA, NA, NA, NA, 18995L, NA, NA, NA, NA, NA, NA, 16571L, 
    NA, NA, NA, NA, NA, NA, 15010L, NA, NA, NA, NA, NA, NA, 13714L, 
    NA, NA, NA, NA, NA, NA, 10451L, NA, NA, NA, NA, NA, NA, 14216L, 
    NA, NA, NA, NA, NA, NA, 16800L, NA, NA, NA, NA, NA, NA, 18305L, 
    NA, NA, NA, NA, NA, NA, 18911L, NA, NA, NA, NA, NA, NA, 17812L, 
    NA, NA, NA, NA, NA, NA, 18665L, NA, NA, NA, NA, NA, NA, 18977L, 
    NA, NA, NA, NA, NA, NA, 19512L, NA, NA, NA, NA, NA, NA, 17424L, 
    NA, NA, NA, NA, NA, NA, 14464L, NA, NA, NA, NA, NA, NA, 16383L, 
    NA, NA, NA, NA, NA, NA, 19916L, NA, NA, NA, NA, NA, NA, 18255L, 
    NA, NA, NA, NA, NA, NA, 20113L, NA, NA, NA, NA, NA, NA, 20084L, 
    NA, NA, NA, NA, NA, NA, 20196L, NA, NA, NA, NA, NA, NA, 20184L, 
    NA, NA, NA, NA, NA, NA, 20261L, NA, NA, NA, NA, NA, NA, 22246L, 
    NA, NA, NA, NA, NA, NA, 23030L, NA, NA, NA, NA, NA, NA, 10487L, 
    NA, NA, NA, NA)), .Names = c("daily.ts", "wdayno", "month", 
"year", "yearday", "no.influ.cases", "no.consultations"), row.names = c(NA, 
-365L), class = "data.frame")

4
Câu hỏi này yêu cầu một phiên bản một chiều của phép nội suy từ điểm đến điểm , được nghiên cứu khá kỹ trong ngành khai thác mỏ. Tóm tắt tham chiếu rõ ràng lưu ý rằng các phương pháp địa lý mang lại dự đoán "mạch lạc (bảo toàn khối lượng ...)". Tôi tin rằng các phương pháp này vượt qua sự phản đối của @Nick Cox.
whuber

@whuber Cảm ơn bạn đã tham khảo, tôi không biết rằng loại vấn đề này nổi tiếng về mặt địa lý. Bạn có biết về việc thực hiện các phương pháp như vậy trong Rhoặc các gói thống kê khác (tôi không có quyền truy cập vào ArcGIS) không? Không có triển khai cụ thể, tôi vẫn bị mắc kẹt, tôi sợ.
COOLSerdash

2
Tôi tin rằng điều này có thể được thực hiện bằng cách sử dụng mã geoRglm, với điều kiện bạn hiểu rất rõ về phương pháp ghi chép và thay đổi hỗ trợ (cần thiết để phát triển mô hình tương quan không gian). Hướng dẫn được xuất bản bởi Springer Verlag dưới dạng Mô hình địa lý dựa trên mô hình, Diggle & Ribeiro Jr.
whuber

3
Phân chia dữ liệu được nhóm là một thủ tục phổ biến trong nhân khẩu học. Một thuật ngữ tìm kiếm là "Nội suy Sprague"; nó sẽ dẫn bạn đến nhiều biến thể. Bằng cách khớp một spline bậc năm với các giá trị tích lũy theo cách đảm bảo đường cong đơn điệu, phương pháp này và các biến thể của nó có hiệu quả làm lại dữ liệu được nhóm lại. (Nó đã có từ năm 1880.) Thuật ngữ chung là "nội suy thẩm thấu". Rob Hyndman, trong số những người khác, đã viết về chủ đề này: xem Smith, Hyndman và Wood, Phép nội suy Spline cho các biến số nhân khẩu học: Vấn đề đơn điệu, J. Pop. Độ phân giải 21 số 1 ​​(2004), 95-98.
whuber

2
Câu hỏi của bạn cũng có thể được xem như ánh xạ dasymetric trong một chiều. Đây là một quy trình để tạo ra các bản đồ chi tiết về số lượng đã được đo ở một số mức tổng hợp, chẳng hạn như các đơn vị Điều tra dân số tiêu chuẩn. (Nó có thể được truy nguyên ít nhất là đến năm 1936: xem John K. Wright, Phương pháp lập bản đồ mật độ dân số: Với Cape Cod là một ví dụ. Đánh giá địa lý 26: 1 (tháng 1 năm 1936), trang 103-110.) phương pháp gần đây (hơi ad hoc , nhưng với một thư mục hữu ích ngắn) xem giscience.org/proceedings/abstracts/giscience2012_apers_179.pdf .
whuber

Câu trả lời:


8

Tôi đã quản lý để tạo ra một Rhàm nội suy các điểm cách đều nhau một cách tuyến tính và với các spline trong khi bảo toàn các phương tiện (ví dụ hàng tuần, hàng tháng, v.v.). Nó sử dụng các hàm na.approxna.splinetừ zoogói và tính toán lặp lại các spline với các thuộc tính mong muốn. Thuật toán được mô tả trong bài báo này .

Đây là mã:

interpol.consmean <- function(y, period=7, max.iter=100, tol=1e-4, plot=FALSE) {

  require(zoo)

  if( plot == TRUE ) {
    require(ggplot2)
  }

  y.temp.linear <- matrix(NA, ncol=length(y), nrow=max.iter+1)
  y.temp.linear[1, ] <- y

  y.temp.spline <- y.temp.linear

  y.temp.pred.spline <- matrix(NA, ncol=length(y), nrow=max.iter)
  y.temp.pred.linear <- matrix(NA, ncol=length(y), nrow=max.iter)

  ind.actual <- which(!is.na(y))

  if ( !all(diff(ind.actual)[1]== diff(ind.actual)) ) {
    stop("\"y\" must contain an evenly spaced time series")
  }

  partial <- ifelse((length(y) - ind.actual[length(ind.actual)]) < period/2,
                    TRUE, FALSE)

  for(k in 1:max.iter) {

    y.temp.pred.linear[k,] <- na.approx(y.temp.linear[k, ], na.rm=FALSE, rule=2)
    y.temp.pred.spline[k,] <- na.spline(y.temp.spline[k, ], method="fmm")

    interpol.means.linear <- rollapply(y.temp.pred.linear[k,], width=period, mean,
                                       by=period, align="left", partial=partial) 
    interpol.means.splines <- rollapply(y.temp.pred.spline[k,], width=period, mean,
                                        by=period, align="left", partial=partial) 

    resid.linear <- y.temp.linear[k, ][ ind.actual ] - interpol.means.linear
    resid.spline <- y.temp.spline[k, ][ ind.actual ] - interpol.means.splines

    if ( max(resid.linear, na.rm=TRUE) < tol & max(resid.spline, na.rm=TRUE) < tol ){
      cat("Converged after", k, "iterations with tolerance of", tol, sep=" ")
      break
    }

    y.temp.linear[k+1, ][!is.na(y.temp.linear[k, ])] <-  resid.linear
    y.temp.spline[k+1, ][!is.na(y.temp.spline[k, ])] <-  resid.spline

  }  

  interpol.linear.final <- colSums(y.temp.pred.linear, na.rm=TRUE)
  interpol.spline.final <- colSums(y.temp.pred.spline, na.rm=TRUE)

  if ( plot == TRUE ) {

    plot.frame <- data.frame(
      y=rep(y,2)/7,
      x=rep(1:length(y),2),
      inter.values=c(interpol.linear.final, interpol.spline.final)/7,
      method=c(rep("Linear", length(y)), rep("Spline", length(y)))
    )

    p <- ggplot(data=plot.frame, aes(x=x)) +
      geom_point(aes(y=y, x=x), size=4) +
      geom_line(aes(y=inter.values, color=method), size=1) +
      ylab("y") +
      xlab("x") +
      theme(axis.title.y =element_text(vjust=0.4, size=20, angle=90)) +
      theme(axis.title.x =element_text(vjust=0, size=20, angle=0)) +
      theme(axis.text.x =element_text(size=15, colour = "black")) +
      theme(axis.text.y =element_text(size=17, colour = "black")) +
      theme(panel.background =  element_rect(fill = "grey85", colour = NA),
            panel.grid.major =  element_line(colour = "white"),
            panel.grid.minor =  element_line(colour = "grey90", size = 0.25))+
      scale_color_manual(values=c("#377EB8", "#E41A1C"), 
                         name="Interpolation method",
                         breaks=c("Linear", "Spline"),
                         labels=c("Linear", "Spline")) +
      theme(legend.position="none") +
      theme(strip.text.x = element_text(size=16)) +
      facet_wrap(~ method)

    suppressWarnings(print(p))

  }
  list(linear=interpol.linear.final, spline=interpol.spline.final)
}

Hãy áp dụng hàm cho tập dữ liệu mẫu được đưa ra trong câu hỏi:

interpolations <- interpol.consmean(y=dat.frame$no.influ.cases, period=7,
                                    max.iter = 100, tol=1e-6, plot=TRUE)

Nội suy

Cả hai phép nội suy tuyến tính và spline có vẻ tốt. Hãy kiểm tra xem phương tiện hàng tuần có được bảo tồn không (đầu ra bị cắt):

cbind(dat.frame$no.influ.cases[!is.na(dat.frame$no.influ.cases)],
      rollapply(interpolations$linear, 7, mean, by=7, align="left", partial=F))

      [,1] [,2]
 [1,]  168  168
 [2,]  199  199
 [3,]  214  214
 [4,]  230  230
 [5,]  267  267
 [6,]  373  373
 [7,]  387  387
 [8,]  443  443
 [9,]  579  579
[10,]  821  821
[11,] 1229 1229

1
Bạn nên tìm một gói thích hợp cho điều đó và hỏi người bảo trì nếu họ muốn bao gồm nó.
Spainedman

4

Bất kỳ đường thẳng nào đi qua giá trị trung bình tại điểm giữa của phạm vi sẽ tạo ra các giá trị hàng ngày có giá trị trung bình bắt buộc. Nhận xét cuối cùng của Nick Cox về 'chia số đếm hàng tuần cho số ngày' là trường hợp đặc biệt với độ dốc = 0.

Vì vậy, chúng ta có thể điều chỉnh điều này và chọn độ dốc để làm cho mọi thứ có lẽ trơn tru hơn một chút. Đây là ba hàm R để làm một cái gì đó như thế:

interpwk <- function(x,y,delta){
  offset=-3:3
  yout=y+delta*offset
  xout=x+offset
  cbind(xout,yout)
}

get_delta <- function(x,y,pos){
  (y[pos+1]-y[pos-1])/(x[pos+1]-x[pos-1])
}

#' get slope from neighbours
interpall <- function(x,y,delta1,f=1){
  for(i in 2:(length(x)-1)){
    delta=get_delta(x,y,i)
    xyout=interpwk(x[i],y[i],delta/f)
    points(xyout)
  }
}

Thêm số đo ngày vào dữ liệu của bạn, sau đó vẽ đồ thị và sau đó vẽ sơ đồ nội suy:

> data$day=data$week*7
> plot(data$day,data$no.influ.cases,type="l")
> interpall(data$day,data$no.influ.cases,f=1)

nội suy tuyến tính bảo toàn trung bình

Một khả năng khác là hạn chế tính liên tục vào cuối tuần nhưng điều này mang đến cho bạn một hệ thống chỉ có một mức độ tự do - tức là nó được xác định hoàn toàn bởi độ dốc của phần đầu tiên (vì sau đó tất cả các phần khác phải tham gia). Tôi đã không mã hóa điều này - bạn có một đi!

[Apols cho mã R hơi tồi, nó thực sự sẽ trả về các điểm thay vì vẽ chúng]


+1, cảm ơn. Vấn đề là các giá trị nội suy không trơn tru và có các bước khá đột ngột giữa các tuần. Tôi đã chỉnh sửa câu hỏi của mình bao gồm một bài viết về cơ bản giải thích chính xác cách tiếp cận mà tôi cần.
COOLSerdash

Mục đích ở đây là gì? Tại sao các trường hợp cúm giả định khác nhau trơn tru? Càng nhiều cấu trúc bạn đưa vào các dữ liệu này bằng phép nội suy, cấu trúc được giới thiệu đó sẽ càng phải được gỡ bỏ ở một số giai đoạn mô hình hóa. Tôi không nghĩ rằng bạn đã giải quyết nhận xét của tôi về ngày 19 tháng 5 "Việc tạo ra dữ liệu hàng tuần cho dữ liệu hàng ngày chỉ tạo ra các vấn đề với sự phụ thuộc được giới thiệu và mức độ tự do quá lạc quan sẽ phù hợp và đánh giá mô hình."
Nick Cox

Mặc dù có nghĩa là sai. Giá trị trung bình bạn thấy ở đây là trung bình mẫu và có thể thay đổi thống kê theo một cách nào đó. Xây dựng một mô hình, sau đó sử dụng một bộ nội suy có ý nghĩa như mong đợi của nó, sau đó thực hiện nhiều lần xử lý dữ liệu hàng ngày và phân tích của bạn hàng trăm lần trở lên để tìm hiểu mức độ không chắc chắn này ảnh hưởng đến kết luận của bạn.
Spainedman

1
@Spacesman Các phương thức API địa lý mà tôi đã đề cập (trong một bình luận cho câu hỏi) sẽ xử lý sự phản đối (khá hợp lệ) của bạn với aplomb, bằng một thành phần khác không trong tham số nugget variogram. Mô phỏng điều kiện địa lý là một phương pháp có kiểm soát để thực hiện nhiều lần cắt ngang mà bạn đề cập đến.
whuber

2
Chắc chắn rồi. Bạn dường như có một tình huống một chiều gần giống như một ví dụ đang chạy trong hướng dẫn Diggle & Ribeiro cho GeoRglm (các trường hợp sốt rét ở Gambia, gần với đầm lầy, v.v., như là đồng biến). Sự phức tạp chính là xử lý sự thay đổi của hỗ trợ, nhưng điều đó sẽ không thực sự ảnh hưởng đến dự đoán: nó chủ yếu sẽ ảnh hưởng đến việc ước tính của variogram. Xem ncbi.nlm.nih.gov/pmc/articles/PMC2995922 để biết một số lý thuyết và ví dụ tương tự ("nhị phân nhị phân" của các trường hợp bệnh).
whuber

3

n

(Nếu dữ liệu là các phép đo thay vì đếm, tôi sẽ nghiêng về mô hình hóa tỷ lệ thông qua mô hình Dirichlet, nhưng điều đó có liên quan nhiều hơn một chút.)

Thực tế là số ngày sẽ không giống nhau không phải là một vấn đề cụ thể, miễn là bạn biết nó là gì - miễn là bạn sử dụng một phần bù để đặt mọi thứ ở cùng một mức '.


1
Sửa lỗi cho tôi nếu tôi sai, nhưng tôi nghĩ điều này có câu hỏi ngược. Đó không phải là cách làm mịn số đếm hàng ngày; đó là cách đoán số lượng hàng ngày từ dữ liệu hàng tuần. (Có lẽ người đăng có dữ liệu hàng ngày cho một cái gì đó khác, ví dụ như nhiệt độ.) Ngoài ra, đa dạng hoặc Dirichlet này như thế nào? Trông giống như một Poisson với tôi.
Nick Cox

@NickCox Bạn hoàn toàn chính xác, cảm ơn vì đã làm rõ: Tôi có dữ liệu hàng tuần và muốn dữ liệu hàng ngày vì tôi có dữ liệu khác hàng ngày (ví dụ: biến khí tượng, tỷ lệ tử vong, ô nhiễm không khí, v.v.).
COOLSerdash

3
Riêng tôi đưa ra câu hỏi là hỏi tại sao bạn muốn làm điều này. Tôi đoán, như trên, rằng bạn có một số dữ liệu hàng ngày và muốn mọi thứ trên cùng một cơ sở. Nếu vậy, hãy xem xét một số giảm dữ liệu hàng ngày xuống tối thiểu, trung bình, trung bình, tối đa trong nhiều tuần hoặc bất cứ điều gì có ý nghĩa khoa học. Việc thổi phồng dữ liệu hàng tuần sang dữ liệu hàng ngày chỉ tạo ra các vấn đề với sự phụ thuộc được giới thiệu và mức độ tự do quá lạc quan sẽ làm cho việc đánh giá và đánh giá mô hình phù hợp.
Nick Cox

@Nick Cox nó hoàn toàn "đoán", nhưng trên thông tin được cung cấp dường như là những gì OP đã có sau đó.
Glen_b -Reinstate Monica

2
Một cách tiếp cận bảo thủ khác là chỉ chia số lượng hàng tuần cho số ngày. Tôi biết có một giả định rằng quá trình thực sự sẽ trơn tru hơn thế, nhưng nó sẽ bảo tồn ý nghĩa.
Nick Cox

3

Tôi sẽ tập hợp một số ý kiến ​​thêm như một câu trả lời khác.

Phải mất một thời gian để cấu trúc của dự án này trở nên rõ ràng hơn. Cho rằng cúm hiện được tiết lộ là một trong số nhiều người, hoàn toàn là những gì bạn làm với nó dường như không quá quan trọng, hoặc ít nhất là không xứng đáng với sự hoài nghi được thể hiện trong một số ý kiến ​​trước đây của tôi. Vì mọi thứ khác đang diễn ra hàng ngày, việc giảm mọi thứ khác xuống hàng tuần sẽ làm mất quá nhiều chi tiết.

Trọng tâm ban đầu của câu hỏi vẫn còn, về phép nội suy bảo tồn giá trị trung bình hàng tuần mà câu trả lời (cực đoan) là trung bình hàng tuần bảo tồn giá trị trung bình hàng tuần. Vì điều đó có vẻ không đáng ngạc nhiên hoặc không thực tế, các phương pháp nội suy khác có vẻ hấp dẫn hơn và / hoặc các phương pháp cắt ngang theo đề xuất của @Spacesman. (Khá rõ đó có phải là sự buộc tội với một hương vị tạm thời hoặc nội suy với hương vị ngẫu nhiên được thêm vào tôi không rõ ràng.)

Hai suy nghĩ cụ thể hơn:

  • Lấy các giá trị hàng tuần (chia cho số ngày) và sau đó làm mịn với trung bình có trọng số sẽ có khả năng trong thực tế để bảo toàn giá trị trung bình đến một xấp xỉ tốt.

  • Vì các trường hợp cúm là số đếm, làm mịn gốc hoặc đếm nhật ký và sau đó chuyển đổi ngược có thể hoạt động tốt hơn so với chỉ làm mịn số đếm.

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.