How to calculate the slope of select data points across entire dataset?

39 ビュー (過去 30 日間)
Eric Beamesderfer
Eric Beamesderfer 2020 年 11 月 10 日
コメント済み: the cyclist 2020 年 11 月 10 日
Hoping I can get this point across. I'm looking to calculate the slope of certain data.
I have a dataset containing 16,725 measurements across 1994 days. Each measurement begins when the header (column 1) reads 21, but the length varies each day. For my variable of interest (column 2), I'm looking to calculate the slope under certain conditions. For example, in the first measurement period (1:9), I am interested in the slope before there is considerable change (increase) in the data (this would be points 1:5). For the second measurements period (10:20), this would be points 1:4.
I'm not sure how I would go about doing this. I thought to incorporate diff() somehow to analyze the difference between two points, and find what values to calculate the slope for. I'm also curious if it would be difficult to do given the current formatting of the data, or if I could create a loop, restarting/recalculating everytime column 1 reads 21. As I mentioned, there are 1994 days of data, so ideally, in the end, I would have a slope value for my data of interest, 1994 points long (1 each day).

採用された回答

the cyclist
the cyclist 2020 年 11 月 10 日
編集済み: the cyclist 2020 年 11 月 10 日
Here is a straightforward method. I commented the code, so I hope you can follow the algorithm
I didn't see how you wanted to calculate the slope, so I leave that to you.
% Made up some pretend data
data = [
21 5;
20 4;
20 3;
20 2;
20 3;
20 4;
21 5;
20 4;
20 3;
20 4;
20 3;
21 5;
20 6;
20 3;
20 2;
20 3;
]
data = 16×2
21 5 20 4 20 3 20 2 20 3 20 4 21 5 20 4 20 3 20 4
% Define where each interval starts and ends, based on location of 21
intervalStart = find(data(:,1)==21);
intervalEnd = [intervalStart(2:end)-1; size(data,1)];
% Number of intervals
numberIntervals = numel(intervalStart);
% Preallocate memory for the slope results
slope = zeros(numberIntervals,1);
% Loop over the intervals
for ni = 1:numberIntervals
% Find the end of the segment (within this interval), based on increase in data value
segmentEnd = find(diff(data(intervalStart(1):intervalEnd(1),2)) > 0,1);
% Extract the data segment
dataForSlopeCalc = data(intervalStart:(intervalStart+segmentEnd-1),2);
% Calculate the slope --- FILL THIS IN WITH YOUR DEFINITION OF THE SLOPE
%%% slope(ni) = ??????
end
  1 件のコメント
the cyclist
the cyclist 2020 年 11 月 10 日
Per your comment via email, I edited this code so that dataForSlopeCalc does not include the element with the uptick. (I had gone back & forth on the best way to code it, and ended up uploading a mistaken "in-between" version.)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeProgramming についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by