누락된 데이터를 회귀된 값으로 대체<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕
변수에 누락된 값이 있는 시계열이 있습니다. 누락된 값을 시간상 가장 가까운 사용 가능한 값에서 파생된 선형 모델로 대체하고 싶습니다.
가장 좋은 방법은 무엇입니까?
그리고 스크립트가 내 테이블의 모든 열(시간 제외)에 대해 그렇게 할 수 있다면 훨씬 더 좋을 것입니다.
감사해요
예
내가 가진 것
내가 원하는 것:
| 티 | 산출 |
|---|
| 0 | 10 |
| 1 | 15 |
| 2 | 20 |
| 4 | 30 |
| 10 | 22.5 |
| 20 | 10 |
Re: 누락된 데이터를 회귀된 값으로 대체JMP 함수와 함께 JMP 공식이 작동하는 방식은 마지막으로 생성되거나 참조된 변수가 공식이나 함수에서 전달된다는 것입니다. 따라서 대체 수식에서 행 값으로 반환되는 것은 Row() 숫자와 동일한 "값" 행렬의 값입니다. 그리고 "값" 행렬은 << 값 가져오기 메시지를 사용하여 열 값을 얻은 위치이고 "값" 행렬에서 보간이 수행되었으므로 다음을 지정합니다.
값[행()]
수식은 값을 한 번에 한 행씩 새 열로 이동합니다.
이를 설명하는 또 다른 방법은 공식의 프로세스 흐름을 살펴보는 것입니다.
모든 수식은 데이터 테이블의 1행부터 마지막 행까지 데이터 테이블의 모든 행을 반복합니다.
행 1을 처리할 때 "p(g/L)" 열의 모든 값이 처리를 위해 매트릭스로 이동됩니다. 행렬의 요소 1부터 행렬의 끝까지 루프를 처리하며 필요한 경우 보간을 수행합니다. 반복이 끝나면 행렬의 모든 요소가 채워집니다. 그런 다음 "값" 행렬의 첫 번째 요소 값이 열의 첫 번째 행에 사용되는 값으로 수식에 반환됩니다.
그런 다음 두 번째 행에 대한 수식을 실행하기 위해 행 값이 이동되고 두 번째 행에 대해 실행되는 유일한 명령문은 다음과 같습니다.
값[행()]
이는 "값" 행렬의 요소 2인 열 2 행의 값을 수식에 반환합니다.
수식은 각 후속 행에 대해 한 번씩 계속 반복되며 문만 실행합니다.
값{행()]
이것이 의미가 있기를 바랍니다.Re: 누락된 데이터를 회귀된 값으로 대체짐,
정말 고마워. 지금은 정말 잘 작동해요. 마지막 "values[Row()];"가 무엇인지 설명해 주실 수 있나요? 하다
Re: 누락된 데이터를 회귀된 값으로 대체:Time 값이 0일 때마다 Interpreted 열의 값을 0과 동일하게 만들려면 아래와 같이 코드를 변경하면 됩니다.
For( i = 1, i <= N Rows( values ), i++,
If( :Time[i] == 0, values[i]=0); // **************
If( Is Missing( values[i] ),
counter++,
If( counter > 0,
For( k = 1, k <= counter, k++,
base = values[i - counter - 1];
incr = Abs( (base - values[i]) / (counter + 1) );
If( base < values[i],
values[(i - counter - 1) + k] = base + k * incr,
values[(i - counter - 1) + k] = base - k * incr
);
);
counter = 0;
)
)
);Re: 누락된 데이터를 회귀된 값으로 대체그것은 첫 번째 값에 대해 수행되지만 내가 필요한 것은 "시간"이 0이고 보간된 값이 0이라는 것입니다. 시간 열에는 여러 개의 0이 있습니다.
Re: 누락된 데이터를 회귀된 값으로 대체제가 제공한 코드에서 이것이 귀하가 묻는 내용입니까?
If( Is Missing( values[1] ),
values[1] = 0
);Re: 누락된 데이터를 회귀된 값으로 대체짐,
스크립트가 작동하도록 했습니다. 보간 평가 루프에 대한 증분 계산에 대한 델타 시간을 설명하기 위해 몇 가지 수학을 추가해야 했습니다. 마지막 문제는 여러 실행 파일을 함께 결합하고 스크립트를 실행할 계획이므로 시간 = 0(시간: 0,12,24,48,0,12,24,48...)인 여러 지점이 있다는 것입니다. ), 따라서 첫 번째 보간된 값은 주어진 데이터 청크에 대해 0이어야 합니다. 행렬 표기법으로 이 작업을 수행하는 방법을 잘 모르겠습니다.
Re: 누락된 데이터를 회귀된 값으로 대체내 경험에 따르면 수식 내에서 실제 수식 열을 참조하려고 할 때 문제가 너무 많았습니다. 따라서 접근 방식이 표시됩니다. 또한 For() 루프를 사용하여 데이터를 실행하는 횟수의 관점에서 수식에 관심이 있었습니다. 내 방법은 데이터 테이블을 한 번만 단계별로 실행합니다....반복 교체는 계산하지 않습니다.Re: 누락된 데이터를 회귀된 값으로 대체짐,
정말 감사합니다. 시도해 보겠습니다. 그래도 궁금합니다. 원래 스크립트로 돌아가서 나는 재귀 오류가 행 3에서 발생한 것이라고 생각했습니다. 그 이유는 증가분을 계산하고 행 카운터-1 = 3-2-1 =0을 얻기 때문입니다. 나는 오류 메시지를 무시하고 맨 끝을 제외하고 나머지 열을 성공적으로 보간합니다.보간할 테이블에 더 많은 데이터를 추가하면 문제가 해결됩니다. 나는 그것들이 별개의 문제일지도 모른다고 생각했습니다.
Re: 누락된 데이터를 회귀된 값으로 대체수식 열 자체 내에서 값을 변경하려고 하면 수식에서 반복적인 문제가 발생합니다.행렬을 사용하여 모든 작업을 미리 수행하도록 수식을 재작업했습니다.그런 다음 결과 값은 각 행 값에 사용됩니다.
Names Default To Here( 1 );
col_name_list = Current Data Table() << get column names( string );
If( !Contains( col_name_list, "Interpolated p (g/L)" ),
Current Data Table() << New Column( "Interpolated p (g/L)",
Numeric,
Continuous,
Formula(
dt = Current Data Table();
If( Row() == 1,
counter = 0;
values = dt:Name( "p (g/L)" ) << get values;
If( Is Missing( values[1] ),
values[1] = 0
);
counter = 0;
For( i = 1, i <= N Rows( values ), i++,
If( Is Missing( values[i] ),
counter++,
If( counter > 0,
For( k = 1, k <= counter, k++,
base = values[i - counter - 1];
incr = Abs( (base - values[i]) / (counter + 1) );
If( base < values[i],
values[(i - counter - 1) + k] = base + k * incr,
values[(i - counter - 1) + k] = base - k * incr
);
);
counter = 0;
)
)
);
);
values[Row()];
)
)
);Re: 누락된 데이터를 회귀된 값으로 대체여기 테이블이 있어요
Re: 누락된 데이터를 회귀된 값으로 대체짐,
설명해 주셔서 감사합니다. 스크립트에 문제가 있습니다. 마지막 간격을 실행하고 보간하지 않습니다.루프 중첩이나 "while" 조건과 관련이 있는지 알 수 없습니다. 기본적으로 테이블 길이에 관계없이 누락된 데이터의 마지막 간격을 채울 수 없습니다.
col_name_list = Current Data Table() << get column names( string );
If( !Contains( col_name_list, "Interpolated p (g/L)" ),
Current Data Table() << New Column(
"Interpolated p (g/L)",
Numeric,
Continuous,
Formula(
If(
Is Missing( :Name( "time (h)" ) ),
Empty(),
:name( "time (h)" ) == 0,
0,
!Is Missing( :Name( "p (g/L)" ) ),
:name( "p (g/L)" ),
dt = Current Data Table();
For( rows = 1, rows <= (N Rows( dt )), rows++,
If( Rows == 1, counter = 0 );
If( Is Missing( dt:name( "Interpolated p (g/L)" )[rows] ) == 1,
counter++);
If( counter > 0 & Is Missing( dt:name( "Interpolated p (g/L)" )[rows] ) == 0,
incr = (dt:name( "Interpolated p (g/L)" )[Rows] - dt:name( "Interpolated p (g/L)" )[Rows - counter - 1]) / (dt
:name( "time (h)" )[Rows] - dt:name( "time (h)" )[Rows - counter - 1]);
For( i = rows - counter, i <= rows - 1, i++,
dt:name( "Interpolated p (g/L)" )[i] = dt:name( "Interpolated p (g/L)" )[i - 1] + (incr * (dt:name( "time (h)" )[i]
-dt:name( "time (h)" )[i - 1]))
);
counter = 0;
);
);
)
)
)
);
Re: 누락된 데이터를 회귀된 값으로 대체JMP는 함수와 명령문에서 대소문자를 구분하지 않으므로 행=행Re: 누락된 데이터를 회귀된 값으로 대체짐,
"행"과 "행" 사이에 차이가 있나요? 설명해 주시겠어요? 나는 멍청한 놈이다.
Re: 누락된 데이터를 회귀된 값으로 대체잘 잡았어.... 그래야지
If this is row 1 initialize a variable named counter to 0
Re: 누락된 데이터를 회귀된 값으로 대체고마워요! 효과가 있었어요!당신은 댓글을 달았습니다
If this is row 1 initialize a variable named counter to 1
, "0에 대한 카운터"를 의미합니까?
Re: 누락된 데이터를 회귀된 값으로 대체다음은 내 원래 코드의 업데이트/주석이 추가된 버전입니다.당신이 해야 할 일은 열 이름을 "출력"에서 값을 변경하려는 열의 이름으로 변경하는 것입니다.
// Set all default referenced memory variables to this unique application
Names Default To Here( 1 );
// Set the variable dt to be a pointer to the current active data table
dt = Current Data Table();
// Loop through the data table from row 1 to the last row and use a
// variable names "rows" as the index
For( rows = 1, rows <= N Rows( dt ), rows++,
// If this is row 1 initialize a variable named counter to 1
If( Rows == 1, counter = 0 );
// If the current row's value for the column named "Output" in the
// data table referenced by "dt" is missing (blank, null) increase
// the counter
If( Is Missing( dt:output[rows] ) == 1,
counter++
);
// If row is found with a non missing value for the column called Output,
// and the counter is > 0, which indicates previous rows with missing
// values, then calculate the required values and place them in their
// appropriate rows
If( counter > 0 & Is Missing( dt:output[rows] ) == 0,
// Calculate the incremental steps to use for the missing cells
incr = (dt:output[Rows] - dt:output[Rows - counter - 1]) / (counter + 1);
// Loop across the rows with missing values and fill in the data
For( i = Rows - counter, i <= Rows - 1, i++,
dt:output[i] = dt:output[i - 1] + incr
);
// reinitialize the counter
counter = 0;
);
);Re: 누락된 데이터를 회귀된 값으로 대체텍사스 넬슨,
주석으로 스크립트를 업데이트할 수 있나요? 저는 JSL을 처음 접했고 JSL이 내 문제에 어떻게 적용되는지 이해하는 데 도움이 필요합니다. OP와 동일한 요구 사항이 있지만 채워야 할 열이 하나뿐입니다.또는 과거에 다음 VBA 코드를 사용하여 Excel에서 누락된 데이터를 채웠습니다. JSL의 End(xlDown).value 함수와 비슷한 것이 있는지 궁금합니다. 오프셋은 시점 데이터의 위치를 지정하는 데 사용됩니다. 감사해요!
Sub interpolatedata()
For Each cell In Range("k4:k29")
If cell.Value = "" Then
y2 = cell.End(xlDown).Value
x2 = cell.End(xlDown).Offset(0, -8).Value
y1 = cell.End(xlUp).Value
x1 = cell.End(xlUp).Offset(0, -8).Value
x = cell.Offset(0, -8).Value
y = (y1) + (x - x1) * (y2 - y1) / (x2 - x1)
cell.Value = y
End If
Next
Re: 누락된 데이터를 회귀된 값으로 대체MS의 스팟,
건배!
Re: 누락된 데이터를 회귀된 값으로 대체나는 몇 년 전에 비슷한 문제를 겪었고 "로컬 회귀"를 통해 대치하는 스크립트를 작성했습니다.
업데이트된 버전은 다음과 같습니다.
dt = Current Data Table();
n = N Rows(dt);
x = Column(1);// Column("t")
For(i = 2, i <= N Col(dt), i++,
y = Column(i);
For Each Row(
If(1 < Row() < n & Is Missing(y[]),
// find previous non-missing row
Eval(Eval Expr(r1 = Max(dt << get rows where(!Is Missing(y[]) & Row() < Expr(Row())))));
// find next non-missing row
Eval(Eval Expr(r2 = Min(dt << get rows where(!Is Missing(y[]) & Row() > Expr(Row())))));
y[] = y[r1] + (y[r2] - y[r1]) / (x[r2] - x[r1]) * (x[] - x[r1]);
)
)
);
Re: 누락된 데이터를 회귀된 값으로 대체여기 작업을 수행할 스크립트가 있습니다.
Names Default To Here( 1 );
dt = Current Data Table();
For( rows = 1, rows <= N Rows( dt ), rows++,
If( Rows == 1, counter = 0 );
If( Is Missing( dt:output[rows] ) == 1,
counter = counter + 1,
If( counter > 0,
incr = (dt:output[Rows] - dt:output[Rows - counter - 1]) / (counter + 1);
For( i = Rows - counter, i <= Rows - 1, i++,
dt:output = dt:output[i - 1] + incr
);
counter = 0;
)
);
);
// Set all default referenced memory variables to this unique application
Names Default To Here( 1 );
// Set the variable dt to be a pointer to the current active data table
dt = Current Data Table();
// Loop through the data table from row 1 to the last row and use a
// variable names "rows" as the index
For( rows = 1, rows <= N Rows( dt ), rows++,
// If this is row 1 initialize a variable named counter to 1
If( Rows == 1, counter = 0 );
// If the current row's value for the column named "Output" in the
// data table referenced by "dt" is missing (blank, null) increase
// the counter
If( Is Missing( dt:output[rows] ) == 1,
counter++
);
// If row is found with a non missing value for the column called Output,
// and the counter is > 0, which indicates previous rows with missing
// values, then calculate the required values and place them in their
// appropriate rows
If( counter > 0 & Is Missing( dt:output[rows] ) == 0,
// Calculate the incremental steps to use for the missing cells
incr = (dt:output[Rows] - dt:output[Rows - counter - 1]) / (counter + 1);
// Loop across the rows with missing values and fill in the data
For( i = Rows - counter, i <= Rows - 1, i++,
dt:output[i] = dt:output[i - 1] + incr
);
// reinitialize the counter
counter = 0;
);
);Re: 누락된 데이터를 회귀된 값으로 대체Ron에게 감사합니다. 하지만 보간을 수행하는 내용은 아무것도 표시되지 않습니다.
Re: 누락된 데이터를 회귀된 값으로 대체처음에는 이것을 시도해보세요
대치 애드인